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

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

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

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

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

Multilibs

Для некоторых целей gcc может иметь различные требования к процессору в зависимости от опций командной строки. Тривиальным примером может быть опция `-msoft-float', поддерживаемая некоторыми процессорами. Эта опция означает, что регистры с плавающей точкой недоступны, а это означает, что операции с плавающей точкой должны выполняться эмулирующей подпрограммой а не с помощью машинных инструкций.

Для таких опций gcc часто конфигурируется так чтобы дважды компилировать целевые библиотеки: один раз с `-msoft-float' и один раз без нее. Если gcc компилирует целевые библиотеки более одного раза, то результирующие библиотеки называются multilibs.

В действительности multilibs не являются частью системы конфигурирования и сборки GNU, но мы обсудим их здесь, поскольку они требуют поддержки в скриптах `configure' и в `Makefile'-ах, используемых для целевых библиотек.

Multilibs в gcc

Multilibs в gcc определяются путем задания переменной `MULTILIB_OPTIONS' в целевом фрагменте `Makefile'. Здесь также могут быть определены несколько других переменных `MULTILIB'. Смотрите раздел «Целевой фрагмент Makefile» в мануале Использование и портирование GNU CC.

Если вы имеете собранный gcc, то можете узнать использует ли он multilibs запустив его с опцией `-print-multi-lib'. Вывод `.;' означает, что multilibs не используются. Вообще, вывод является последовательностью строк по одной на каждую multilib. Первая часть строки, до `;', является именем директории данной multilib. Вторая часть является списком опций компилятора, разделенных символами `@'.

Multilibs собираются в дереве директорий. Корень дерева, представляемый `.' в списке директорий multilib-ов, является умолчальной библиотекой для использования в тех случаях, когда не применяются специальные опции компилятора. Поддиректории дерева хранят версии этой библиотеки для использования в тех случаях, когда применяются специальные опции компилятора.

Multilibs в целевых библиотеках

Целевые библиотеки в дереве Cygnus автоматически собираются с multilibs. Это означает, что каждая библиотека собирается несколько раз.

Это умолчание устанавливается в файле `configure.in' верхнего уровня путем добавления `--enable-multilib' в список аргументов для прогона configure когда он запускается для целевых библиотек (смотрите раздел Библиотеки хоста и цели).

Каждая целевая библиотека использует шелл-скрипт `config-ml.in', написанный Дугом Эвансом (Doug Evans) для подготовки сборки целевых библиотек. Этот шелл-скрипт вызывается после `Makefile', создаваемого скриптом `configure'. Если multilibs не включены, он ничего не делает. В противном случае он изменяет `Makefile' для поддержки multilibs.

Скрипт `config-ml.in' создает по одной копии `Makefile' для каждой multilib-ы в соответствующей поддиректории. Когда конфигурирование осуществляется в дереве исходного кода (что не рекомендуется), он будет создавать символические ссылки в каждой поддиректории дерева исходников.

Скрипт `config-ml.in' устанавливает несколько переменных в различных `Makefile'-ах. `Makefile.in' должен уже иметь определения для этих переменных, и `config-ml.in' просто изменяет существующие значения. `Makefile' должен использовать умолчальные значения этих переменных при работе с поддиректориями.

`MULTISRCTOP'
`config-ml.in' устанавливает ее в последовательность строк `../', причем число этих строк является числом уровней в дереве исходного кода, на котором находится multilib. Умолчальное значение должно быть пустой строкой.
`MULTIBUILDTOP'
`config-ml.in' устанавливает ее в последовательность строк `../', причем число этих строк является числом уровней в объектной директории, на котором находится multilib. Умолчальное значение должно быть пустой строкой. В отличие от нее `MULTISRCTOP' применяется к дереву исходного кода (что не рекомендуется).
`MULTIDIRS'
Только в `Makefile' верхнего уровня `config-ml.in' устанавливает ее в список поддиректорий с multilibs. Умолчальное значение должно быть пустой строкой.
`MULTISUBDIR'
`config-ml.in' присваивает ей имя установочной поддиректории, чтобы использовать эту поддиректорию с ведущим `/'. Умолчальное значение должно быть пустой строкой.
`MULTIDO'
`MULTICLEAN'
Только в `Makefile' верхнего уровня `config-ml.in' устанавливает эти переменные в команды, используемые при осуществлении рекурсивной сборки. Обе эти переменные должны иметь умолчальное значение `true', так что по умолчанию ничего не делают.

Все ссылки на родительскую директорию исходников должны использовать переменную `MULTISRCTOP'. Вместо написания `$(srcdir)/..' вы должны писать `$(srcdir)/$(MULTISRCTOP)..'.

Аналогично, ссылки на родительскую объектную директорию должны использовать переменную `MULTIBUILDTOP'.

В ходе инсталляции библиотеки должны быть установлены в поддиректорию `MULTISUBDIR'. Вместо установки `$(libdir)/libfoo.a' устанавливается `$(libdir)$(MULTISUBDIR)/libfoo.a'.

Скрипт `config-ml.in' модифицирует также `Makefile' верхнего уровня, добавляя в него цели `multi-do' и `multi-clean', которые используются при сборке multilibs.

Умолчальная цель в `Makefile' должна включать следующую команду:

@$(MULTIDO) $(FLAGS_TO_PASS) DO=all multi-do

Это предполагает, что `$(FLAGS_TO_PASS)' определен как набор переменных для передачи рекурсивно вызываемым `make'. Это будет собирать все multilibs. Заметим, что умолчальным значением `MULTIDO' является `true', так что по умолчанию эта команда ничего не делает. Если multilibs включены, что-то будет делаться только в `Makefile' верхнего уровня.

Цель `install' в `Makefile' должна включать следующую команду:

@$(MULTIDO) $(FLAGS_TO_PASS) DO=install multi-do

Вообще, любая отличная от clean операция, которая должна выполняться на всех multilibs, должна использовать строку `$(MULTIDO)', устанавливающую переменную `DO' в значение цели каждого рекурсивно вызываемого `make'.

Цели `clean' (`clean', `mostlyclean' и т.д.) должны использовать `$(MULTICLEAN)'. Например, цель `clean' должна задаваться так:

@$(MULTICLEAN) DO=clean multi-clean

Назад Вперед
Система конфигурирования Cygnus Часто задаваемые вопросы

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


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

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

Последнее редактирование: 2011-12-24 11:36:13

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

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

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

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


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