Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

Система конфигурирования и сборки GNU

Система конфигурирования и сборки GNU

Иан Ланс Тейлор

Система конфигурирования Cygnus

Скрипт конфигурирования Cygnus является предшественником autoconf. В настоящее время все его значимые возможности включены в autoconf. Новые программы не пишутся с использованием скрипта конфигурирования Cygnus.

Тем не менее, скрипт конфигурирования Cygnus до сих пор кое-где используется: в корне дерева Cygnus и в некоторых целевых библиотеках в дереве Cygnus. И до тех пор, пока это использование не заменено средствами autoconf, данная заметка будет вполне уместна. Она не является полной документацией, но ее можно использовать как пособие для изучения самих скриптов.

Основы конфигурирования Cygnus

Конфигурирование Cygnus не использует каких-либо генерируемых файлов и не имеет программ, соответствующих `autoconf'. Вместо них существует единственный шелл-скрипт под названием `configure', который может быть найден в корне дерева Cygnus. Этот шелл-скрипт был написан вручную, он не генерируется autoconf, и было бы неправильно и вредно запускать последний в дереве Cygnus.

Конфигурирование Cygnus работает в отдельной директории посредством обработки файла `configure.in' в этой директории. Этот файл разбивается на четыре отдельных шелл-скрипта.

Первый является содержимым `configure.in' вплоть до строки, которая начинается с `# per-host:'. Это — общая часть.

Второй является продолжением `configure.in' вплоть до строки, которая начинается с `# per-target:'. Эта часть соответствует хосту.

Третий является продолжением `configure.in' вплоть до строки, которая начинается с `# post-target:'. Эта часть соответствует цели.

Четвертый является остатком `configure.in'. Он является частью, следующей за post-target.

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

Сначала конфигурирование Cygnus выполняет общую часть. Она должна установить шелл-переменную `srctrigger' в имя исходного файла, для подтверждения которого конфигурирование Cygnus просматривает подходящую директорию. Здесь же можно установить шелл-переменные `package_makefile_frag' и `package_makefile_rules_frag'.

Далее конфигурирование Cygnus устанавливает шелл-переменные `build' и `host', и выполняет часть, соответствующую хосту. Здесь может быть установлена шелл-переменная `host_makefile_frag'.

Далее конфигурирование Cygnus устанавливает переменную `target' и выполняет часть, соответствующую цели. Здесь может быть установлена переменная `target_makefile_frag'.

Любой из этих скриптов может устанавливать шелл-переменную `subdirs'. Эта переменная является списком поддиректорий, в которых может быть найден `Makefile.in'. Конфигурирование Cygnus автоматически просматривает файл `Makefile.in' в текущей директории. Шелл-переменная `subdirs' обычно не используется, и я считаю, что в ней стоит указывать только директорию `newlib'.

Для каждого `Makefile.in' конфигурирование Cygnus автоматически создает `Makefile' посредством добавления определений для переменных `make', таких как `host' и `target', и автоматического редактирования значений таких переменных `make', как `prefix', если они представлены.

Кроме того, если установлена любая из шелл-переменных `makefile_frag', конфигурирование Cygnus будет интерпретировать ее как имена файлов в рабочей директории либо в директории с исходным кодом, и будет читать их содержимое для включения в генерируемый `Makefile'. Содержимое этих файлов будет читаться после первой строки в `Makefile.in', которая начинается с `####'.

Эти фрагменты `Makefile' используются для кастомизации поведения на специфическом хосте или цели. Они служат для выбора отдельных файлов для компиляции и определяют особые макросы препроцессора, предоставляя значения переменных `make', которые затем используются в ходе компиляции. В отличие от autoconf конфигурирование Cygnus обычно не производит тестирования функциональности и, как правило, требует ручного добавления поддержки для каждого нового хоста.

Поддержка фрагмента `Makefile' похожа на макрос `AC_SUBST_FILE' в autoconf.

После создания каждого из `Makefile' будет запущен скрипт post-target (т.е. он может быть запущен несколько раз). Этот скрипт может кастомизировать `Makefile'. Когда он запускается, шелл-переменная `Makefile' будет содержать имя соответствующего `Makefile', включая соответствующую компонентную директорию.

Аналогично генерируемому autoconf скрипту `configure', конфигурирование Cygnus создает файл по имени `config.status', который, будучи запущенным, пересоздаёт конфигурацию. Файл `config.status' будет просто снова выполнять скрипт конфигурирования Cygnus с соответствующими аргументами.

Любая из частей `configure.in' может устанавливать шелл-переменные `files' и `links'. Конфигурирование Cygnus будет устанавливать символические ссылки с именами `links' на файлы с именами `files'. Это похоже на макрос `AC_LINK_FILES' в autoconf.

Наконец, любая из частей `configure.in' может устанавливать шелл-переменную `configdirs' для задания поддиректорий. Если она установлена, конфигурирование Cygnus будет рекурсивно запускать процесс конфигурирования для каждой поддиректории. Если поддиректории используются конфигурированием Cygnus, они должны содержать файл `configure.in', но не файл `configure', поскольку конфигурирование Cygnus будет рекурсивно вызывать само себя. Если поддиректория содержит файл `configure', то конфигурирование Cygnus будет считать, что этот файл является скриптом, сгенерированным autoconf, и просто вызовет его напрямую.

Конфигурирование Cygnus в библиотеках C++

Система конфигурирования библиотеки C++, написанная Пиром Бознером (Per Bothner), заслуживает особого упоминания. Она использует конфигурирование Cygnus, но тестирование функциональности производит аналогично тому, как это делается в autoconf генерируемыми скриптами `configure'. Этот подход используется в библиотеках `libio', `libstdc++' и `libg++'.

Большая часть информации для `Makefile' записывается как вывод шелл-скрипта `libio/config.shared'. Каждый файл `configure.in' устанавливает определенные шелл-переменные, а затем вызывает `config.shared' для создания двух блоков фрагментов `Makefile'. Затем эти фрагменты объединяются в результирующий `Makefile' посредством скрипта конфигурирования Cygnus.

Файл `_G_config.h' создается в объектной директории `libio' посредством запуска шелл-скрипта `libio/gen-params'. Этот шелл-скрипт используется тестами функциональности для определения макросов и типов в `_G_config.h'.


Назад Вперед
Поддержка канадского креста Multilibs

Перевод: Дмитрий Скоробогатов, 23.12.2011.
Оригинальный текст можно найти по адресу http://www.airs.com/ian/configure/configure_7.html.


Предыдущие публикации:

Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2011-12-23 11:31:23

Метки материала: cygnus, gnu, система конфигурирования, система конфигурирования и сборки, компиляция, проект gnu, дерево cygnus, по, софт, разработка по, soft, программное обеспечение, software, спо, документация для программиста, программное обеспечение по

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2017, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.