Алексей Махоткин

домашняя страница

Autoconf

Go to the first, previous, next, last section, table of contents.


Создание скриптов configure

Скрипты конфигурации, создаваемые Autoconf, по принятым соглашениям называются configure. При запуске configure создает несколько файлов, заменяя в них параметры конфигурации на соответствующие системе значения. configure создает следующие файлы:

  • один или несколько файлов `Makefile’, по одному на каждый подкаталог пакета (see section Подстановки в файлах Makefile);
  • если задано, создается заголовочный файл для языка C, имя которого можно задать при создании скрипта и который содержит директивы #define (see section Заголовочные файлы конфигурации);
  • скрипт командного процессора с именем `config.status’, который при запуске заново создаст вышеперечисленные файлы (see section Воссоздание конфигурации);
  • скрипт командного процессора с именем `config.cache’, который сохраняет результаты выполнения многих тестов (see section Кэш-файлы);
  • файл с именем `config.log’, который содержит все сообщения, выданные компиляторами. Этот файл может использоваться при отладке, если configure работает неправильно.

Для того, чтобы с помощью Autoconf создать скрипт configure, вам необходимо написать входной файл с именем `configure.in’ и выполнить команду autoconf. Если вы напишите собственный код тестирования возможностей системы, в дополнение к поставляемым с Autoconf, то вам придется записать его в файлы с именами `aclocal.m4’ и `acsite.m4’. Если вы используете заголовочный файл, который содержит директивы #define, то вы также должны создать файл `acconfig.h’, и вы сможете распространять с пакетом созданный с помощью Autoconf файл `config.h.in’.

Вот диаграмма, показывающая, как создаются файлы, используемые при конфигурации. Выполняемые программы обозначены суффиксом `*’. Необязательные файлы взяты в квадратные скобки (`[]’). Программы autoconf и autoheader также читают установленные файлы с макросами Autoconf (обрабатывая файл `autoconf.m4’).

Файлы, используемые при подготовке программного пакета к распространению:

Файлы исходных текстов –> [autoscan*] –> [configure.scan] –> configure.in

configure.in –.   .——> autoconf* —–> configure
               +—+
[aclocal.m4] –+   `—.
[acsite.m4] —’       |
                       +–> [autoheader*] -> [config.h.in]
[acconfig.h] —-.     |
                 +—–’
[config.h.top] –+
[config.h.bot] –’

Makefile.in ——————————-> Makefile.in

Файлы, используемые при конфигурации программного пакета:

                       .————-> config.cache
configure* ————+————-> config.log
                       |
[config.h.in] -.       v            .-> [config.h] -.
               +–> config.status* -+               +–> make*
Makefile.in —’                    `-> Makefile —’

Написание `configure.in’

Для создания скрипта configure для программного пакета, создайте файл с именем `configure.in’, который содержит вызовы макросов Autoconf, которые проверяют системные возможности, которые нужны вашему пакету или которые он может использовать. Для многих таких возможностей макросы Autoconf уже написаны; See section Существующие тесты, где находится их описание. Для большинства других возможностей вы можете использовать шаблонные макросы Autoconf, на базе которых можно создать специальные проверки; See section Написание тестов, где это описано. Для особо хитроумных или специализированных возможностей, в файл `configure.in’ может понадобиться включить специально написанные скрипты командного процессора. Программа autoscan может оказать вам хорошую помощь на первых порах, при создании файла `configure.in’ (see section Использование программы autoscan для создания `configure.in’, где описана эта программа).

За некоторыми исключениями, порядок вызовов макросов Autoconf в `configure.in’ не важен. Каждый файл `configure.in’ должен в самом начале содержать вызов макроса AC_INIT, а также вызов макроса AC_OUTPUT в самом конце (see section Создание выходных файлов). Также некоторые макросы полагаются на то, что другие макросы были вызваны первыми, поскольку для того, чтобы принять решение, они проверяют уже установленные значения переменных. Такие макросы отдельно отмечены в описании (see section Существующие тесты), а при создании скрипта configure выдается предупреждение, если вы нарушили порядок вызова макросов.

Для того, чтобы ваши файлы были последовательны и единообразны, мы приведем желательный порядок вызова макросов Autoconf. Вообще говоря, то, что находится ближе к концу списка, может зависеть от того, что находится в начале списка. Например, библиотечные функции могут зависеть от определений типов и библиотек.

AC_INIT(file)
Проверка программ
Проверка библиотек
Проверка заголовочных файлов
Проверка определений типов
Проверка структур
Проверка характеристик компилятора
Проверка библиотечных функций
Проверка системных сервисов
AC_OUTPUT([file…])

Лучше всего помещать каждый вызов макроса на отдельную строку файла `configure.in’. Большинство макросов не добавляют дополнительных переводов строк; они полагают, что после каждого вызова макроса находится новая строка. Это позволяет сделать скрипт configure читабельнее, не добавляя ненужных пустых строк. Можно спокойно устанавливать переменные окружения в той же строке, что и вызов макроса, потому что командные процессоры позволяют выполнять присваивание в одной строке, без дополнительных пустых строк.

При вызове макросов с аргументами между открывающей скобкой и названием макроса не должно быть пробелов. Аргументы могут занимать несколько строк если они заключены в “кавычки” языка m4`[’ и `]’. Если у вас есть длинная строка, например, список имен файлов, то можно использовать символ обратного слэша в конце строки для указания, что список продолжается на следующей строке (эта возможность реализуется командным процессором, без привлечения возможностей Autoconf).

Некоторые макросы отрабатывают два случая— когда заданное условие выполняется и когда условие не выполняется. В некоторых местах вы можете захотеть сделать что-либо, если условие выполняется, и ничего не делать в противном случае, и наоборот. Для того, чтобы пропустить действие при выполнении условия, передайте пустое значение аргументу action-if-found данного макроса. Для пропуска действия при невыполнении условия уберите аргумент action-if-not-found данного макроса, включая предшествующую ему запятую.

В файл `configure.in’ можно включать комментарии, начиная их со встроенного макроса m4dnl, который отбрасывает текст вплоть до начала новой строки. Эти комментарии не появятся в созданных скриптах configure. Например, полезно начинать файлы `configure.in’ со строки, которая может выглядеть так:

dnl для создания скрипта configure обработайте этот файл программой autoconf.

Использование программы autoscan для создания `configure.in’

@anchor{Invoking autoscan}

Программа autoscan может помочь вам в создании файла `configure.in’ для программного пакета. autoscan выполняет анализ дерева исходных текстов, корень которого указан в командной строке или совпадает с текущим каталогом. Программа ищет в исходных текстах следы обычных проблем с переносимостью и создает файл `configure.scan’, который является заготовкой для `configure.in’ для данного пакета.

Вы должны сами просмотреть файл `configure.scan’ перед тем, как переименовать его в `configure.in’: скорее всего, он будет нуждаться в некоторых исправлениях. Иногда autoscan выдает макросы в неправильном порядке, и поэтому autoconf будет выдавать предупреждения; вам необходимо вручную передвинуть эти макросы. Также, если вы хотите, чтобы пакет использовал заголовочный файл настроек, то вы должны сами добавить вызов макроса AC_CONFIG_HEADER (see section Заголовочные файлы конфигурации). Вам также необходимо добавить или изменить некоторые директивы препроцессора #if в вашей программе, для того, чтобы заставить ее работать с Autoconf (see section Использование программы ifnames для перечисления условных выражений, где описана программа, которая поможет вам выполнить эту работу).

Программа autoscan использует несколько файлов данных, чтобы определить, какие макросы следует использовать при обнаружении определенных символов в исходных файлах пакета. Эти файлы данных устанавливаются вместе с дистрибутивными макро-файлами Autoconf и имеют одинаковый формат. Каждая строка состоит из символа, пробелов и имени макроса Autoconf, которое выдается в том случае, если заданный символ имеется в исходных текстах. Строки, начинающиеся с символа `#’ являются комментариями.

autoscan устанавливается только в том случае, если у вас установлена программа Perl. autoscan распознает следующие ключи командной строки:

–help
Выдает список ключей командной строки и прекращает работу.
–macrodir=dir
Заставляет программу искать файлы данных в каталоге dir, а не в каталоге, куда производилась установка. Вы также можете установить значение переменной окружения AC_MACRODIR равным пути к этому каталогу; данный ключ командной строки переопределяет значение переменной окружения.
–verbose
Выдает имена исследуемых файлов и потенциально интересные символы, обнаруженные в этих файлах. Выдача может быть довольно обширной.
–version
выдает номер версии Autoconf и прекращает работу.

Использование программы ifnames для перечисления условных выражений

@anchor{Invoking ifnames}

Программа ifnames может помочь при создании файла `configure.in’ для программного пакета. Она выдает список идентификаторов, которые пакет уже использует в условных выражениях препроцессора языка С. Если ваша программа уже была написана с учетом возможного переноса на другие платформы, то данная программа может помочь вам определить, какие проверки необходимо выполнить в configure. Эта программа может помочь заполнить некоторые пробелы в файле `configure.in’, который был создан программой autoscan (see section Использование программы autoscan для создания `configure.in’).

Программа ifnames обрабатывает все исходные тексты на C, перечисленные в командной строке (или же принимает текст со стандартного ввода, если ни один файл не был указан) и выдает на стандартный вывод сортированный список идентификаторов, которые используются в директивах #if, #elif, #ifdef или #ifndef. Программа выдает каждый идентификатор на отдельной строке, за которым через пробел следует список файлов, в которых этот идентификатор встречается.

Программа ifnames распознает следующие ключи командной строки:

–help
-h
выдает список ключей командной строки и прекращает работу.
–macrodir=dir
Заставляет программу искать файлы данных в каталоге dir, а не в каталоге, куда производилась установка. Вы также можете установить значение переменной окружения AC_MACRODIR равным пути к этому каталогу; данный ключ командной строки переопределяет значение переменной окружения.
–version
выдает номер версии Autoconf и прекращает работу.

Использование программы autoconf для создания скрипта configure

@anchor{Invoking autoconf}

Для того, чтобы создать скрипт configure из файла `configure.in’, просто запустите программу autoconf без аргументов. autoconf обработает файл `configure.in’ с помощью макропроцессора m4, используя макросы Autoconf. Если вы зададите аргумент программе autoconf, то программа будет выполнять чтение заданного файла, а не файла `configure.in’ и вывод будет производиться на стандартный вывод, не в в файл configure. Если вы дадите программе autoconf аргумент `-’, то она будет читать со стандартного ввода, а не из файла `configure.in’, а результаты будут выдаваться на стандартный вывод.

Макросы Autoconf определены в нескольких файлах. Некоторые из них распространяются вместе с Autoconf; autoconf читает их в первую очередь. Затем ищется необязательный файл `acsite.m4’ в каталоге, который содержит распространяемые с Autoconf файлы макросов, и необязательный файл `aclocal.m4’ в текущем каталоге. Эти файлы могут содержать макросы, специфические для вашей машины или макросы для конкретных пакетов программного обеспечения (see section Создание макросов, где приведена дополнительная информация). Если определение макроса существует в нескольких файлах, которые считывает autoconf, то последнее макроопределение переопределяет все предыдущие.

autoconf распознает следующие ключи командной строки:

–help
-h
выдает список ключей командной строки и прекращает работу.
–localdir=dir
-l dir
Ищет файл `aclocal.m4’ для данного пакета в каталоге dir, а не в текущем каталоге.
–macrodir=dir
Заставляет программу искать файлы данных в каталоге dir, а не в каталоге, куда производилась установка. Вы также можете установить значение переменной окружения AC_MACRODIR равным пути к этому каталогу; данный ключ командной строки переопределяет значение переменной окружения.
–version
выдает номер версии Autoconf и прекращает работу.

Использование autoreconf для обновления ваших скриптов configure

@anchor{Invoking autoreconf}

Если у вас много скриптов configure, созданных с помощью Autoconf, то программа autoreconf может облегчить вашу работу. Она запускает программы autoconf (и, если необходимо, autoheader) для повторного создания скриптов configure и шаблонов заголовочных файлов настройки для исходных текстов, корневой каталог которых находится в текущем каталоге. По умолчанию, эти программы создают заново только те файлы, которые старше, чем соответствующий файл `configure.in’ или (если имеется) `aclocal.m4’. Поскольку программа autoheader не изменяет время модификации выходного файла в случае, если файл не изменялся, то не обязательно будет проделано минимальное количество работы. Если вы установили новую версию Autoconf, то вы можете заставить autoreconf заново создать все файлы, задав ключ командной строки `–force’.

Если вы зададите программе autoreconf ключи командной строки `–macrodir=dir или `–localdir=dir, то она передаст их программам autoconf и autoheader (с правильно настроенными относительными путями).

autoreconf не поддерживает нахождение в одном дереве как каталогов, которые являются частями большого проекта (и которые используют одни и те же файлы `aclocal.m4’ и `acconfig.h’), так и каталогов, которые являются независимыми пакетами (которые имеют собственные файлы `aclocal.m4’ и `acconfig.h’). Программа предполагает, что все каталоги являются частями одного пакета, если вы используете ключ командной строки `–localdir’, или что каждый каталог является отдельным пакетом, если вы не используете этот ключ. Это ограничение может быть убрано в будущем.

See section Автоматическая пересборка, где описаны правила `Makefile’ для автоматического пересоздания скриптов configure, если изменяются исходные тексты этих скриптов. Этот метод корректно обрабатывает изменение шаблонов заголовочных файлов конфигурации, но не передает команде ключи командной строки `–macrodir=dir или `–localdir=dir.

autoreconf распознает следующие ключи командной строки:

–help
-h
выдает список ключей командной строки и прекращает работу.
–force
-f
Пересоздать даже те скрипты `configure’ и заголовочные файлы настройки, которые новее, чем соответствующие входные файлы (`configure.in’ и, если есть, `aclocal.m4’).
–localdir=dir
-l dir
Заставляет программы autoconf и autoheader искать файлы `aclocal.m4’ и (для autoheader) `acconfig.h’ (но не `file.top’ и `file.bot’) данного пакета в каталоге dir вместо каталога, который содержит отдельный файл `configure.in’.
–macrodir=dir
-m dir
Заставляет программу искать файлы данных в каталоге dir, а не в каталоге, куда производилась установка. Вы также можете установить значение переменной окружения AC_MACRODIR равным пути к этому каталогу; данный ключ командной строки переопределяет значение переменной окружения.
–verbose
Выдает имена каждого каталога, в котором autoreconf запускает autoconf (и если необходимо то и autoheader).
–version
Выдает номер версии Autoconf и прекращает работу.


Go to the first, previous, next, last section, table of contents.

Comments