Почему всегда./ configure; make; make install; как 3 отдельных шага?
каждый раз, когда вы компилируете что-то из источника, вы проходите через те же 3 шага:
$ ./configure
$ make
$ make install
Я понимаю, что имеет смысл разделить процесс установки на разные этапы, но я не понимаю, почему каждый кодер на этой планете должен снова и снова писать одни и те же три команды, чтобы выполнить одну работу. С моей точки зрения, было бы совершенно разумно иметь ./install.sh скрипт автоматически поставляется с исходным кодом, который содержит следующий текст:
#!/bin/sh
./configure
make
make install
почему люди делают 3 шага отдельно?
4 ответов:
потому что каждый шаг делает разные вещи
подготовка(настройка) среды для создания
./configureэтот скрипт имеет множество опций, которые вы должны изменить. Как
посмотреть сайт пакетов Arch Linux. Здесь вы увидите, что любой пакет использует другой параметр configure (предположим, что они используют autotools для системы сборки).--prefixили--with-dir=/foo. Это означает, что каждая система имеет различную конфигурацию. Также./configureпроверяет наличие отсутствующих библиотек, которые должны быть установлены. Здесь что-то не так причины не строить приложение. Вот почему дистрибутивы имеют пакеты, которые установлены в разных местах, потому что каждый дистрибутив считает, что лучше установить определенные библиотеки и файлы в определенные каталоги. Говорят, что он бежит./configure, но на самом деле вы должны изменить его всегда.построение системы
makeэто на самом деле
make allby по умолчанию. И каждая марка имеет различные действия, чтобы сделать. Некоторые делают построение, некоторые делают тесты после построения, некоторые делают извлечение из внешних репозиториев 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 installThe
$*включен, потому что часто приходится предоставлять варианты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