Как я могу распространять переменные automake в настройках подпакета?

У меня есть настройка подпакета в моем репозитории autotools, в которой несколько связанных проектов склеены вместе с помощью master configure.ac и Makefile.am.

Помимо порядка компиляции, который легко выполняется с помощью макроса AC_CONFIG_SUBDIRS(), существует необходимость экспортировать заголовки и места в библиотеках, требуемые между этими чрезмерно связанными подпроектами.

--- configure.ac
 |- Makefile.am
 |- subproj1 --- configure.ac
 |            |- Makefile.am
 |            |- src
 |            \- include
 [...]
 |
 \- subprojN --- configure.ac // requires -I${top_srcdir}/subprojX/include and
              |- Makefile.am  // -L${top_srcdir}/subprojX/src
              |- src
              \- include

Перегруппировать эти пакеты как один, к сожалению, не вариант. Я пытался экспортировать переменные, используя AC_SUBST() и / или команду экспорта make, но безрезультатно.

Единственный способ сделать эти флаги доступными в каждом подпроекте Makefile - это передать CPPFLAGS и LDFLAGS в корневой вызов конфигурации (через командную строку). Тем не менее, я надеюсь, что есть способ сохранить эти значения внутри вещи autotools вместо того, чтобы создавать отдельный скрипт для них.

PS: похоже на automake и зависимости проекта

2 ответа

Решение

Автоинструменты не предназначены для того, чтобы быть системой управления пакетами, так что это неудобное использование, но в подпроектах можно ссылаться на относительные пути вне дерева сборки. Другими словами, в subprojN/Makefile.am вы можете добавить:

AM_CPPFLAGS = -I$(srcdir)/../subprojX/include
AM_LDFLAGS = -L$(srcdir)/../subprojX/lib

В этом случае, если subprojN/configure пытается найти libsubprojX, произойдет сбой, если вы не добавите ../subprojX/{include,lib} для CPPFLAGS и LDFLAGS для настройки, что можно сделать в configure.ac:

CPPFLAGS="$CPPFLAGS -I${srcdir}/../subprojX/include
LDFLAGS="$LDFLAGS -L${srcdir}/../subprojX/lib"

Если сценарии конфигурирования подпроектов не проверяют библиотеки в связанных подпроектах, возможно, было бы целесообразнее указать LDADD в Makefile.am, чтобы связать необходимые библиотеки.

CPPFLAGS и LDFLAGS почти никогда не должны передаваться непосредственно в командной строке (личное мнение), но должны быть установлены в config.site. Просто сделайте назначения в ${prefix}/share/config.site или в $CONFIG_SITE (то есть в файле $HOME/config.site и установите CONFIG_SITE=$HOME/config.site в среде, в которой вы запускаете configure) и этот сценарий будет получен всеми вашими вызовами конфигурации. Я не совсем уверен, что вы имеете в виду под "держать эти значения внутри вещей autotool", но мне кажется, что использование config.site удовлетворяет этому. LDFLAGS и CPPFLAGS - это правильный механизм, позволяющий сообщать вашему скрипту configure о нестандартном расположении библиотек, поэтому любое решение, которое не использует их, будет выходить за рамки обычной функции автоинструментов. (Конечно, лучшее решение - это установить библиотеки в стандартном месте, чтобы ваш набор инструментов мог найти их без дополнительных усилий с вашей стороны. Возможно, вы используете gcc и можете установить LIBRARY_PATH и CPATH.)

Другие вопросы по тегам