仅评估一次automake变量

时间:2012-03-11 20:37:23

标签: makefile automake

我们正在使用automake& autoconf构建我们的多包软件。我想知道如何用例如输出填充变量shell-scripts一次并重用它,例如需要包括目录

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

此处使用:=代替=会使此变量填充一次,因此some-ext-config只会被调用一次(AFAIK来自普通make)。当然INCLUDESAM_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那里不应该对不同的子项目了解太多。

2 个答案:

答案 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_SUBSTSMakefile声明。

例如,仅使用一个子项目。这是一个顶级./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