В вашем среднем пакете каждый из этих файлов имеет свое назначение.Это согласуется с философией Unix «каждая программа должна делать что-то одно и делать это хорошо».В большинстве проектов вы увидите такие файлы, как:
configure
configure.ac
Makefile
Makefile.in
Makefile.am
install-sh
INSTALL
configure
(обычно) сценарий оболочки, который проверяет вашу системудля всех необходимых функций, прежде чем строить что-либоMakefile.in
- это шаблон для Makefile
.Результаты тестов конфигурации подставляются в Makefile.in
для генерации Makefile
.Это относится к людям, имеющим вещи (компиляторы, заголовки, библиотеки) по непонятным путям, кросс-компиляцию (например, сборку для ARM на x86), дополнительную поддержку библиотек (некоторые программы имеют дополнительные функции, которые можно включать или выключать),компиляция с разными опциями и тд.Написание единого универсального Makefile
на самом деле очень сложно .
Как вы заметили, сам скрипт configure
- беспорядок.Это не предназначено для того, чтобы быть увиденным смертными глазами, или отредактировано смертными руками.На самом деле это результат компиляции configure.ac
с использованием программы под названием autoconf
.autoconf
- это пакет макросов для макропроцессора m4
и обертка для него, который в то время был единственным хорошим инструментом для такого рода вещей (autoconf
действительно довольно старое программное обеспечение, но оно устарело на удивление хорошо).autoconf
позволяет разработчику легко писать тесты для проверки заголовков, библиотек или программ, необходимых для сборки программного обеспечения (и это меняется от программы к программе).
Если вы покопаетесь немного глубже, выобратите внимание, что Makefile.in
также имеет тенденцию быть немного уродливым.Это связано с тем, что написание хороших Makefile
s часто представляет собой типичный пример, и это вдохновило другой инструмент, automake
.automake
компилирует Makefile.am
(который часто короткий и декларативный) в Makefile.in
(который огромен), который затем компилируется в Makefile
с помощью configure
(по существу).
install-sh
скрипт, который распространяется с automake
, но скопирован в другие пакетыОн существует в качестве замены, если версия install
в системе - дерьмо (install
копирует файлы в установочный каталог. Некоторые действительно старые системы имели испорченные версии install
, и automake
довольно консервативно отбрасывает предупреждениядля старых систем).Некоторые другие сценарии, выполняющие аналогичные роли: compile
, depcomp
и ylwrap
.
INSTALL
- это просто документ, описывающий, как установить пакет.Обычно это стандартное содержимое, скопированное в пакет с помощью automake
.
Подстановочные знаки иногда используются в Makefile
s.Например, GNU Make поддерживает функцию $(wildcard)
, где вы можете написать что-то вроде:
SOURCES := $(wildcard src/*.c)
Основная причина, по которой такие функции, как $(wildcard)
, не используются, заключается в том, что ониявляются расширениями, и automake
очень старается сгенерировать Makefile
s, которые будут работать с любым POSIX-совместимым make
.После того, как проект становится зрелым, список файлов для компиляции все равно не сильно меняется.
Вторая причина, по которой файлы перечисляются в явном виде, - это когда программы получают дополнительные функции.Подстановочные знаки больше не нужны, и вместо этого вам нужно перечислить условия, при которых должны компилироваться дополнительные функции.