我们正在使用automake
& autoconf
构建我们的多包软件。我想知道如何用例如输出填充变量shell-scripts一次并重用它,例如需要包括目录
INCLUDES := -I`some-ext-config --incdir`
此处使用:=
代替=
会使此变量填充一次,因此some-ext-config
只会被调用一次(AFAIK来自普通make
)。当然INCLUDES
是AM_CPPFLAGS
的折旧表兄弟,但是我会使用那个,而是为每次编译调用shell脚本。
使用INCLUDES
代替AM_CPPFLAGS
对我来说是一个可以接受的解决方案(虽然我想可能存在可移植性问题),但我没有解决方案。用于libtool库的LDFLAGS
libmylib_la_LDFLAGS := `some-ext-config --ldflags` # will always be evaluated
如果我想确保多次调用这些外部工具,automake
中的一般解决方案是什么?我想远离在AC_SUBST
中使用明显的configure.ac
,因为我们必须确保我们的包可以从子目录(其中一些configure.ac
)和递归make构建从顶级和configure.ac
那里不应该对不同的子项目了解太多。
答案 0 :(得分:2)
:=
特定于GNU-make,因此建议您在automake中使用=
。如果您不希望每次都运行shell脚本INCLUDES(或者AM_CPPFLAGS,无关紧要,则会发生这两种情况),然后在configure.ac中运行脚本并通过AC_SUBST使用变量替换。这基本上就是pkg-config会做的 - 并且说来,如果有.pc文件,你可以使用它而不是some-ext-config。
# 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}
答案 1 :(得分:0)
这是对我在回答jørgensen的答案时建议的内容的更长时间的解释。
我了解您的顶级configure.ac
必须生成多个子项目的makefile,并执行所需的测试,这样您就不必在任何子项目中运行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
。