Почему всегда./ configure; make; make install; как 3 отдельных шага?



каждый раз, когда вы компилируете что-то из источника, вы проходите через те же 3 шага:



$ ./configure
$ make
$ make install


Я понимаю, что имеет смысл разделить процесс установки на разные этапы, но я не понимаю, почему каждый кодер на этой планете должен снова и снова писать одни и те же три команды, чтобы выполнить одну работу. С моей точки зрения, было бы совершенно разумно иметь ./install.sh скрипт автоматически поставляется с исходным кодом, который содержит следующий текст:



#!/bin/sh
./configure
make
make install


почему люди делают 3 шага отдельно?

704   4  

4 ответов:

потому что каждый шаг делает разные вещи

подготовка(настройка) среды для создания

./configure

этот скрипт имеет множество опций, которые вы должны изменить. Как --prefix или --with-dir=/foo. Это означает, что каждая система имеет различную конфигурацию. Также ./configure проверяет наличие отсутствующих библиотек, которые должны быть установлены. Здесь что-то не так причины не строить приложение. Вот почему дистрибутивы имеют пакеты, которые установлены в разных местах, потому что каждый дистрибутив считает, что лучше установить определенные библиотеки и файлы в определенные каталоги. Говорят, что он бежит ./configure, но на самом деле вы должны изменить его всегда.

посмотреть сайт пакетов Arch Linux. Здесь вы увидите, что любой пакет использует другой параметр configure (предположим, что они используют autotools для системы сборки).

построение системы

make

это на самом деле make all by по умолчанию. И каждая марка имеет различные действия, чтобы сделать. Некоторые делают построение, некоторые делают тесты после построения, некоторые делают извлечение из внешних репозиториев SCM. Обычно вам не нужно давать никаких параметров, но опять же некоторые пакеты выполняют их по-разному.

установить в систему

make install

это устанавливает пакет в место, указанное с помощью configure. Если вы хотите, вы можете указать ./configure чтобы указать на ваш домашний каталог. Тем не менее, многие параметры настройки являются указывая на /usr или /usr/local. Это означает, что вы должны использовать на самом деле sudo make install потому что только root может копировать файлы в /usr и /usr/local.


теперь вы видите, что каждый шаг является предварительным условием для следующего шага. Каждый шаг-это подготовка к тому, чтобы все работало в беспроблемном потоке. Дистрибутивы используют эту метафору для создания пакетов (например, RPM, deb и т. д.).

здесь вы увидите, что каждый шаг на самом деле другое состояние. Вот почему менеджеры пакетов имеют разные обертки. Ниже приведен пример оболочки, которая позволяет построить весь пакет за один шаг. Но помните, что каждое приложение имеет другую обертку (на самом деле эти обертки имеют такое имя, как spec, PKGBUILD и т. д.):

def setup:
... #use ./configure if autotools is used

def build:
... #use make if autotools is used

def install:
... #use make all if autotools is used

здесь можно использовать autotools, что означает ./configure,make и make install. Но другой может использовать SCons, связанные с Python настройки или что-то другое.

как вы видите разделение каждого состояния делает вещи намного проще для поддержания и развертывание, особенно для сопровождающих пакетов и дистрибутивов.

во-первых, он должен быть!--0--> с каждого зависит от успеха первого. Часть причины-это эволюция, а часть причины-удобство для рабочего процесса разработки.

изначально, большинство Makefiles будет содержать только команды для компиляции программы, и установка была оставлена пользователю. Дополнительное правило позволяет make install чтобы разместить скомпилированный вывод в месте, которое может быть правильным; есть еще много веских причин, по которым вы, возможно, не захотите этого делать, в том числе не будучи системным администратором, не хочу его устанавливать вообще. Более того, если я разрабатываю программное обеспечение, я, вероятно, не хочу его устанавливать. Я хочу внести некоторые изменения и проверить версию, сидящую в моем каталоге. Это становится еще более заметным, если у меня будет несколько версий, лежащих вокруг.

./configure идет и определяет, что доступно в среде и / или требуется пользователем, чтобы определить, как построить программное обеспечение. Это не что-то такое нужно менять очень часто и часто может занять некоторое время. Опять же, если я разработчик, то не стоит тратить время на постоянную перенастройку. Что еще более важно, так как make использует временные метки для перестроения модулей, если я повторяю configure есть вероятность, что флаги изменятся, и теперь некоторые компоненты в моей сборке будут компилироваться с одним набором флагов, а другие с другим набором флагов, которые могут привести к другому, несовместимому поведению. До тех пор, пока я не повторю configure, Я знаю, что мой среда компиляции остается прежней, даже если я изменяю свои источники. Если я повторю configure Я должен make clean во-первых, чтобы удалить любые источники, чтобы обеспечить построены единообразно.

единственный случай, когда три команды выполняются подряд, - это когда пользователи устанавливают программу или создается пакет (например, debuild Debian или rpmbuild RedHat). И это предполагает, что пакет может быть дан простой configure, что обычно не относится к упаковке, где, по крайней мере,--prefix=/usr желательно. И pacakgers, как иметь дело с поддельными корнями при выполнении make install часть. Так как есть много исключений, делая ./configure && make && make install правило будет неудобно для многих людей, которые делают это гораздо чаще!

configure может произойти сбой, если он обнаруживает, что зависимости отсутствуют.

make запускает целевой объект по умолчанию, первый из которых указан в файле Makefile. Часто эта цель all, но не всегда. Так что вы могли только make all install если бы вы знали, что это была цель.

так ...

#!/bin/sh

if ./configure $*; then
  if make; then
    make install
  fi
fi

или:

./configure $* && ./make && ./make install

The $* включен, потому что часто приходится предоставлять варианты configure.

но почему бы просто не позволить людям делать это сами? Есть это действительно такая большая победа?

во-первых ./configure не всегда находит все, что ему нужно, или в других случаях он находит все, что ему нужно, но не все, что он мог бы использовать. В этом случае вы хотели бы знать об этом (и ваш ./install.sh сценарий все равно провалится!) Классическим примером отказа с непреднамеренными последствиями, с моей точки зрения, является компиляция больших приложений, таких как ffmpeg или mplayer. Они будут использовать библиотеки, если они доступны, но будут компилироваться в любом случае, если их нет, оставляя некоторые параметры отключены. Проблема в том, что позже вы обнаружите, что он был скомпилирован без поддержки того или иного формата, поэтому вам нужно вернуться и повторить его.

другое дело ./configure делает несколько интерактивно дает вам возможность настроить, где в системе будет установлено приложение. Различные дистрибутивы / среды имеют разные соглашения, и вы, вероятно, захотите придерживаться соглашения в своей системе. Кроме того, вы можете захотеть установите ее локально (исключительно для себя). Традиционно ./ configure и make шаги не запускаются как root, в то время как make install (если он не установлен исключительно для себя) должен запускаться как root.

конкретные дистрибутивы часто предоставляют сценарии, которые выполняют это ./install.sh функциональные возможности с учетом распределения-например,исходный RPMs + spec file + rpmbuild или slackbuilds.

(сноска: при этом я согласен с тем, что ./ configure; make; make install; может стать чрезвычайно утомительным.)

Comments

    Ничего не найдено.