Makefile am что это
В неплоских пакетах в файле `Makefile.am’ верхнего уровня надо указать Automake, в каких подкаталогах будет производится сборка. Это выполняется с помощью переменной SUBDIRS .
Макрос SUBDIRS содержит список подкаталогов, в которых могут производиться различные виды сборки. Многие цели (например, all ) в сгенерированном файле `Makefile’ будут выполняться как в текущем каталоге, так и во всех указанных подкаталогах. Заметьте, что подкаталоги, перечисленные в SUBDIRS , не обязаны содержать файл `Makefile.am’ , а только лишь `Makefile’ (после выполнения конфигурации). Это позволяет использовать библиотеки из пакетов, которые не используют Automake (например, gettext ). Каталоги, упомянутые в SUBDIRS , должны быть прямыми потомками текущего каталога. Например, вы не можете поместить каталог `src/subdir’ в переменную SUBDIRS .
В глубоких пакетах `Makefile.am’ верхнего уровня часто очень короток. Например, вот `Makefile.am’ из дистрибутива GNU Hello:
EXTRA_DIST = BUGS ChangeLog.O README-alpha SUBDIRS = doc intl po src tests
Можно переопределить переменную SUBDIRS если, как в случае GNU Inetutils , вы хотите собрать только некоторое подмножество пакета. Для этого включите в ваш файл `Makefile.am’ следующие строки:
SUBDIRS = @SUBDIRS@
Затем в вашем файле `configure.in’ вы можете указать:
SUBDIRS = "src doc lib po" AC_SUBST(SUBDIRS)
В результате этого Automake сможет при построении пакета заставить его принимать список каталогов, но точное содержимое этого списка станет известно только после запуска configure .
Хотя макрос SUBDIRS может содержать подстановки (например `@DIRS@’ ); сам Automake в действительности не проверяет содержимое этой переменной.
Если определена переменная SUBDIRS , то ваш файл `configure.in’ должен включать макрос AC_PROG_MAKE_SET .
Использование SUBDIRS не ограничено только `Makefile.am’ верхнего уровня. Automake может использоваться для создания пакетов любой глубины.
По умолчанию Automake создает файлы `Makefile’ , которые работают, выполняя сначала make в подкаталогах ( постфиксный метод ). Однако, можно изменить это поведение, поместив `.’ в переменную SUBDIRS . Например, поместив `.’ в начало списка, вы заставите выполнять make сначала в текущем каталоге, а затем уже в подкаталогах ( префиксный метод ).
Makefile am что это
Automake — это утилита для автоматического создания файлов
`Makefile.in’ из файлов `Makefile.am’ . Каждый файл
`Makefile.am’ фактически является набором макросов для программы make (иногда с несколькими правилами). Полученные таким образом файлы `Makefile.in’ соответствуют стандартам
GNU Makefile .
Стандарт GNU Makefile — это длинный, запутанный документ, и его содержание может в будущем измениться. Automake разработан для того, чтобы освободить от бремени сопровождения Makefile человека, ведущего проект GNU.
Типичный входной файл Automake является просто набором макроопределений. Каждый такой файл обрабатывается, и из него создается файл `Makefile.in’ . В каталоге проекта должен быть только один файл `Makefile.am’ . Automake накладывает на проект некоторые ограничения; например, он предполагает, что проект использует программу Autoconf , а также налагает некоторые ограничения на содержимое файла `configure.in’ . Automake требует наличия программы perl для генерации файлов `Makefile.in’ . Однако дистрибутив, созданный Automake , является полностью соответствующим стандартам GNU и не требует наличия perl для компиляции.
2. Общая информация
Следующие разделы описывают основные принципы работы Automake.
| [ < ] | [ > ] | [ | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
2.1 Общие операции
Automake читает файл `Makefile.am’ и создает на его основе файл `Makefile.in’ . Специальные макросы и цели, определенные в `Makefile.am’ , заставляют Automake генерировать более специализированный код; например, макроопределение `bin_PROGRAMS’ заставит создать цели для компиляции и компоновки программ.
Макроопределения и цели из файла `Makefile.am’ копируются в файл `Makefile.in’ без изменений. Это позволяет вам добавлять в генерируемый файл `Makefile.in’ произвольный код. Например, дистрибутив Automake включает в себя нестандартную цель cvs-dist , которую использует человек, сопровождающий Automake, для создания дистрибутивов из системы контроля исходного кода.
Заметьте, что расширения GNU make не распознаются программой Automake. Использование таких расширений в файле `Makefile.am’ приведет к ошибкам или странному поведению.
Automake пытается сгруппировать комментарии к расположенным по соседству целям и макроопределениям.
Цель, определенная в `Makefile.am’ , обычно переопределяет любую цель с таким же именем, которая была бы автоматически создана automake . Хотя этот прием и работает, старайтесь избегать его использования, поскольку иногда автоматически созданные цели являются очень важными.
Аналогичным образом, макрос, определенный в `Makefile.am’ , будет переопределять любой макрос, который создает automake . Это часто более полезно, чем возможность переопределения цели. Но будьте осторожны, поскольку многие из макросов, создаваемых программой automake , считаются макросами только для внутреннего использования, и их имена могут измениться в будущих версиях.
При обработке макроопределения Automake рекурсивно обрабатывает макросы, на которые есть ссылка в данном макроопределении. Например, если Automake исследует содержимое foo_SOURCES в следующем определении:
xs = a.c b.c foo_SOURCES = c.c $(xs)
то он будет использовать файлы `a.c’ , `b.c’ и `c.c’ как содержимое foo_SOURCES .
Automake также вводит форму комментария, который не копируется в выходной файл; все строки, начинающиеся с `##’ , полностью игнорируются Automake.
Очень часто первая строка файла `Makefile.am’ выглядит следующим образом:
## Process this file with automake to produce Makefile.in ## Для получения Makefile.in обработайте этот файл программой automake
| [ < ] | [ > ] | [ | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
2.2 Типы иерархии каталогов пакета
automake поддерживает три типа иерархии каталогов: плоскую, неглубокую и глубокую.
Если все файлы пакета располагаются в одном каталоге, то это плоский пакет. В файле `Makefile.am’ для этого типа пакета по определению отсутствует макрос SUBDIRS . Примером такого пакета может служить termutils .
Глубокий пакет — это такой, в котором все исходные тексты лежат в подкаталогах; каталог верхнего уровня содержит в основном конфигурационную информацию. Хорошим примером такого пакета является GNU cpio , а так же GNU tar . Файл `Makefile.am’ в каталоге верхнего уровня глубокого пакета содержит макрос SUBDIRS , но в нем нет никаких других макросов для определения объектов компиляции.
Неглубокий пакет подразумевает, что основные файлы исходных текстов располагаются в каталоге верхнего уровня, а различные части этого пакета (обычно библиотеки) находятся в подкаталогах. К пакетам такого типа относится Automake (а также GNU make , который в настоящее время не использует automake ).
| [ < ] | [ > ] | [ | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
2.3 Ограничения
Хотя Automake предназначен для использования людьми, сопровождающими пакеты GNU, он также старается приспособиться и к тем, кто хочет использовать Automake, но не хочет соблюдать все соглашения GNU.
Сейчас Automake поддерживает три уровня строгости (strictness) , задающих, сколь строго Automake должен проверять соответствие стандартам.
Строгость может принимать следующие значения:
`foreign’ Automake проверит только те вещи, которые совершенно необходимы для правильного функционирования. Например, в то время как стандарты GNU требуют наличия файла `NEWS’ , он не требуется при использовании этого режима. Название режима («иностранный», «внешний») произошло от того факта, что Automake предназначен для использования программ GNU; эти ослабленные требования не являются стандартным режимом функционирования.
`gnu’ Automake проверит, насколько это возможно, соответствие стандартам GNU для пакетов. Этот режим действует по умолчанию.
`gnits’ Automake проверит совместимость с еще не написанными стандартами Gnits . Они основаны на стандартах GNU, но еще более детальны. Если вы не являетесь помощником в разработке стандартов Gnits, вам лучше избегать этой опции до тех пор, пока стандарт Gnits не будет опубликован.
Для более детальной информации о точном смысле уровня строгости смотрите 19. Эффект использования ключей —gnu и —gnits .
| [ < ] | [ > ] | [ | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
2.4 Единообразная схема наименования
Макросы Automake (с этого места мы будем ссылаться на них как на переменные ) в общем следуют Единообразной Схеме Именования , которая позволяет легко понять, как собираются программы (и другие результирующие объекты), и как они устанавливаются. Эта схема также поддерживает определение того, что должно быть собрано во время выполнения configure .
Во время выполнения make , некоторые переменные используются для определения того, что должно быть собрано. Эти переменные называются основными переменными . Например, основная переменная PROGRAMS содержит список программ, которые должны быть скомпилированы и собраны.
Различные наборы переменных используются для принятия решения о том, куда должны быть установлены собранные объекты. Эти переменные называются подобно основным переменным, но имеют префикс, указывающий, какой из стандартных каталогов должен быть использован в качестве каталогаx для установки. Имена стандартных каталогов определены в стандартах GNU (see section `Directory Variables’ in The GNU Coding Standards ). Automake расширяет это список переменными pkglibdir , pkgincludedir и pkgdatadir , которые имеют те же значения, что и не- `pkg’ версии, но с прибавленным к ним суффиксом `@PACKAGE@’ . Например, pkglibdir определена как $(datadir)/@PACKAGE@ .
Для каждой из основных переменных также существует дополнительная переменная, имя которой образовано добавлением префикса `EXTRA_’ к имени основной переменной. Эта переменная используется для перечисления объектов, которые могут быть собраны, а могут и не собраны в зависимости от принятого configure решения. Для того, чтобы создать файл `Makefile.in’ , работающий в любой ситуации, Automake должен сразу узнать полный список объектов, которые вообще могут быть собраны. Исходя из этого, переменные с префиксом `EXTRA_’ обязательны.
Например, пакет cpio во время конфигурации принимает решение о том, какие программы необходимо скомпилировать. Некоторые программы устанавливаются в bindir , а некоторые — в sbindir :
EXTRA_PROGRAMS = mt rmt bin_PROGRAMS = cpio pax sbin_PROGRAMS = @PROGRAMS@
Определение основной переменной без префикса (например, PROGRAMS ) является ошибкой.
Заметьте, что общий суффикс `dir’ опускается при создании имен переменных; таким образом, имя переменной записывается как `bin_PROGRAMS’ , а не `bindir_PROGRAMS’ .
Нельзя устанавливать любые типы объектов в любые каталоги. Automake будет расценивать такие попытки как ошибку. Automake также будет диагностировать очевидные ошибки в именах каталогов.
Иногда стандартных каталогов— даже с расширениями Automake— недостаточно. В частности, иногда полезно для ясности устанавливать объекты в подкаталог какого-то предопределенного каталога. Здесь Automake также позволяет вам расширить список возможных каталогов для установки. Заданный префикс (например, `zar’ ) является разрешенным, если определена переменная, имеющая такое же имя, но с суффиксом `dir’ (например, zardir ).
Например, пока поддержка HTML не станет частью Automake, вы можете использовать такой фрагмент кода для установки документации в формате HTML:
htmldir = $(prefix)/html html_DATA = automake.html
Специальный префикс `noinst’ показывает, что указанные объекты вообще не должны быть установлены.
Специальный префикс `check’ показывает, что указанные объекты не должны быть скомпилированы до тех пор, пока не будет запущена команда make check .
Вот список возможных основных имен: `PROGRAMS’ , `LIBRARIES’ , `LISP’ , `SCRIPTS’ , `DATA’ , `HEADERS’ , `MANS’ и `TEXINFOS’ .
| [ < ] | [ > ] | [ | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
2.5 Как именуются порожденные переменные
Иногда имена переменных в Makefile образуются на базе некоторого текста, заданного пользователем. Например, имена программ преобразуются в имена макросов Makefile. Automake канонизирует этот текст, так что он не должен следовать правилам именования макросов Makefile. Все имена в имени, за исключением букв, чисел, и подчеркиваний, при создании ссылки на макрос преобразуются в подчеркивания . Например, если ваша программа называется sniff-glue , то унаследованная переменная будет называться sniff_glue_SOURCES , а не sniff-glue_SOURCES .
| [ | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated on February, 19 2004 using texi2html
automake — Создание файла Makefile.in
Для создания всех файлов `Makefile.in’ пакета запустите программу automake в каталоге верхнего уровня без аргументов. automake автоматически найдет каждый файл `Makefile.am’ (сканируя `configure.in’ ; see section Сканирование файла `configure.in’ ) и сгенерирует соответствующий файл `Makefile.in’ . Заметьте, что automake имеет более простое видение структуры пакета; он предполагает, что пакет имеет только один файл `configure.in’ , расположенный в каталоге верхнего уровня. Если в вашем пакете имеется несколько файлов `configure.in’ , то вам необходимо запустить automake в каждом из каталогов, где есть файл `configure.in’ .
Также вы можете задать аргумент для automake ; суффикс `.am’ добавляется к аргументу и результат используется как имя входного файла. В основном эта возможность используется для автоматической перегенерации устаревших файлов `Makefile.in’ . Заметьте, что automake всегда должен запускаться из каталога верхнего уровня проекта, даже если необходимо перегенерировать `Makefile.in’ в каком-то из подкаталогов. Это необходимо, так как automake должен просканировать файл `configure.in’ , а также потому, что automake в некоторых случаях изменяет свое поведение при обработке `Makefile.in’ в подкаталогах.
automake принимает следующие ключи командной строки:
`-a’ `—add-missing’ В некоторых ситуациях Automake требует наличия некоторых общих файлов; например, если в `configure.in’ выполняется макрос AC_CANONICAL_HOST , то требуется наличие файла `config.guess’ . Automake распространяется с несколькими такими файлами; этот ключ заставит программу автоматически добавить к пакету отсутствующие файлы, если это возможно. В общем, если Automake сообщает вам, что какой-то файл отсутствует, то используйте этот ключ. По умолчанию Automake пытается создать символьную ссылку на собственную копию отсутствующего файла; это поведение может быть изменено с помощью ключа —copy . `—amdir= dir ‘ Этот ключ заставляет Automake искать файлы данных в каталоге dir , а не в каталоге установки. Этот ключ обычно используется при отладке. `—build-dir= dir ‘ Сообщает Automake, где располагается каталог для сборки. Этот ключ используется при включении зависимостей в файл `Makefile.in’ , созданный командой make dist ; он не должен использоваться в других случаях. `-c’ `—copy’ При использовании с ключом —add-missing , заставляет копировать недостающие файлы. По умолчанию создаются символьные ссылки. `—cygnus’ Заставляет сгенерированные файлы `Makefile.in’ следовать правилам Cygnus, вместо правил GNU или Gnits. Для дополнительной информации, смотрите section Эффект использования ключа —cygnus . `—foreign’ Устанавливает глобальную строгость в значение `foreign’ . За дополнительной информацией смотрите раздел section Ограничения. `—gnits’ Устанавливает глобальную строгость в значение `gnits’ . За дополнительной информацией смотрите раздел section Эффект использования ключей —gnu и —gnits . `—gnu’ Устанавливает глобальную строгость в значение `gnu’ . За дополнительной информацией смотрите раздел section Эффект использования ключей —gnu и —gnits . По умолчанию используется именно такая строгость. `—help’ Печатает список ключей командной строки и завершается. `-i’ `—include-deps’ Включить всю автоматически генерируемую информацию о зависимостях (see section Автоматическое отслеживание зависимостей) в генерируемый файл `Makefile.in’ . Это делается в основном при создании дистрибутива; смотрите раздел section Что войдет в дистрибутив. `—generate-deps’ Создать файл, объединяющий всю автоматически генерируемую информацию о зависимостях (see section Автоматическое отслеживание зависимостей), этот файл будет называться `.dep_segment’ . В основном этот ключ используется при создании дистрибутива; смотрите section Что войдет в дистрибутив. Он полезен при сопровождении `SMakefile’ или файлов `Makefile’ для других платформ ( `Makefile.DOS’ , и т. п.). Этот ключ может использоваться только с ключами `—include-deps’ , `—srcdir-name’ и `—build-dir’ . Заметьте, что если задан этот ключ, то никакой другой обработки не выполняется. `—no-force’ Обычно automake создает все файлы `Makefile.in’ , указанные в `configure.in’ . Этот ключ заставляет обновлять только те файлы `Makefile.in’ , которые устарели, с учетом зависимостей друг от друга. `-o dir ‘ `—output-dir= dir ‘ Поместить сгенерированный файл `Makefile.in’ в каталог dir . Обычно каждый файл `Makefile.in’ создается в том же каталоге, что и соответствующий файл `Makefile.am’ . Этот ключ используется при создании дистрибутивов. `—srcdir-name= dir ‘ Сообщает Automake имя каталога с исходными текстами текущего дистрибутива. Этот ключ используется при включении зависимостей в файл `Makefile.in’ , сгенерированный командой make dist ; он не должен использоваться в других случаях. `-v’ `—verbose’ Заставляет Automake выдавать информацию о том, какие файлы читаются или создаются. `—version’ Выдает номер версии Automake и завершается.