Оцените переменную automake только один раз - PullRequest
1 голос
/ 12 марта 2012

Мы используем automake & autoconf для создания нашего мультипакетного программного обеспечения. Мне было интересно, как заполнить переменную с выводом, например, сценарии оболочки один раз и используйте это, например, для необходимых включают dirs

INCLUDES := -I`some-ext-config --incdir`

Использование := вместо = приводит к тому, что эта переменная заполняется один раз, поэтому some-ext-config будет вызываться только один раз (AFAIK это просто make). Конечно, INCLUDES является устаревшим двоюродным братом AM_CPPFLAGS, но я бы использовал его вместо этого, сценарий оболочки вызывался бы для каждой компиляции.

Использование INCLUDES вместо AM_CPPFLAGS является приемлемым решением для меня (хотя я предполагаю, что могут быть проблемы с переносимостью), но у меня нет решения, например, например. LDFLAGS для библиотеки libtool

libmylib_la_LDFLAGS := `some-ext-config --ldflags` # will always be evaluated

Каково общее решение внутри automake, если я хочу убедиться, что эти внешние инструменты не вызываются несколько раз? Я хотел бы избежать использования очевидных AC_SUBST в configure.ac, так как мы должны убедиться, что наши пакеты могут быть собраны как из подкаталогов (некоторые там configure.ac), так и с рекурсивным make из верхнего уровня configure.ac там, который не должен знать слишком много о различных подпроектах.

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

:= является специфическим для GNU-make, поэтому рекомендуется использовать только = в automake. Если вы не хотите запускать сценарий оболочки каждый раз, когда INCLUDES (или AM_CPPFLAGS, не имеет значения, это может произойти с любым из них), запустите сценарий в файле configure.ac и используйте подстановку переменных через AC_SUBST. По сути, это то, что будет делать pkg-config, и если говорить об этом, вы можете просто использовать это вместо некоторого ext-config, если есть файл .pc.

# configure.ac
libfoo_CPPFLAGS=$(some-ext-config --incdir);
libfoo_LIBS=$(some-ext-config --libs);
AC_SUBST([libfoo_CPPFLAGS])
AC_SUBST([libfoo_LIBS])

# Makefile.am
AM_CPPFLAGS = -Iwhatever ${libfoo_CPPFLAGS}
bin_PROGRAMS = foo
foo_LDADD = ${libfoo_LIBS}
0 голосов
/ 12 марта 2012

Это более длинное объяснение того, что я предложил в комментарии к ответу Йоргенсена.

Я понимаю, что ваш верхний уровень configure.ac должен сгенерировать make-файлы из нескольких подпроектов и выполнить необходимые тестытак что вам не нужно запускать configure в каком-либо подпроекте (подпункт configure служит только тогда, когда вы хотите работать над этим конкретным подпроектом).

В этом случае вы хотитечтобы избежать дублирования как можно большего количества материала из различных configure.ac.Я предлагаю вам учитывать весь код подпункта configure, который также должен выполняться верхним уровнем configure в макросе m4.Это включает в себя тесты, объявления AC_SUBSTS и Makefile.

Например, использование только одного подпроекта.Вот верхний уровень ./configure.ac:

AC_INIT([toplevel], [1.0])
AM_INIT_AUTOMAKE([foreign -Werror])
SUB1_COMMON([sub1/])  dnl Stuff from the subproject
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

С ./Makefile.am:

ACLOCAL_AMFLAGS = -I sub1/m4
SUBDIRS = sub1

Теперь вот sub1/configure.ac для подпроекта:

AC_INIT([sub1], [1.0])
AM_INIT_AUTOMAKE([foreign -Werror])
AC_CONFIG_MACRO_DIR([m4])
SUB1_COMMON
AC_OUTPUT

С SUB1_COMMON, определенным в m4/common.m4:

AC_DEFUN([SUB1_COMMON],
  [AC_SUBST([PYTHON3LIB], [`pkg-config --libs python3`])
   AC_CONFIG_FILES([$1Makefile])])

И, наконец, sub1/Makefile.am просто:

ACLOCAL_AMFLAGS = -I m4
# Build something.
...

SUB1_COMMON содержит весь код, который вы хотитедля совместного использования двух файлов configure.ac и использования аргумента $1 для соответствующего перемещения файлов конфигурации.В этом примере переменная PYTHON3LIB будет определена независимо от того, какой configure был запущен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...