Как я могу распространять переменные 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.)