2012-03-11 68 views
1

我们使用automake & autoconf来构建我们的多软件包软件。我想知道如何用例如输出来填充一个变量。 shell脚本一次并重新使用,例如对于需要include目录仅评估automake变量一次

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

使用的:=代替=这里使这个变量填写一次,以便将some-ext-config只被调用一次(据我所知这是来自普通make)。当然INCLUDESAM_CPPFLAGS的折旧表弟,但是我是否会使用那个表示脚本,因此每个编译都会调用shell脚本。

使用INCLUDES而不是AM_CPPFLAGS对我来说是一个可接受的解决方案(虽然我想可能存在可移植性问题),但我没有解决方案。 LDFLAGS了libtool的库

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

里面是什么automake一般的解决办法,如果我要确保这些外部工具不能调用多次?我想远离在configure.ac中使用明显的AC_SUBST,因为我们必须确保我们的软件包可以从子目录(在那里有一些configure.ac)和从顶级递归make和configure.ac那里生成,不需要太多了解不同的子项目。

回答

2

:=是GNU制定的,因此建议您在automake中只使用=。如果您不想每次运行shell脚本INCLUDES(或AM_CPPFLAGS,无关紧要,都会发生),然后在configure.ac中运行脚本并通过AC_SUBST使用变量替换。这基本上就是pkg-config会做的 - 并且说到这一点,如果有.pc文件,您可以使用它而不是某些-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} 
+0

嗯,我写了,我想远离将它放到'configure.ac'中出于某些外部原因。 – 2012-03-11 22:48:54

+1

@honk:那么您将不得不解决这些外部原因(例如使用'AC_CONFIG_SUBDIRS')或放弃编写便携式Makefiles。 – adl 2012-03-12 07:30:26

+0

外部原因是我们希望能够在顶层Makefile.am文件中为子目录Makefile添加AC_OUTPUT,但不需要在每个子目录中调用configure,只要我们的构建)。我们只需要可移植到GNU make,我是否正确理解没有办法只填充一次这些automake变量? – 2012-03-12 12:11:05

0

这是一个更长的解释,我对jørgensen的回答发表了评论意见。

我理解你的顶级configure.ac必须生成多个子项目的生成文件,并进行必要的测试,这样你就不必在任意子项目configure(一子configure只有当你想要走秀在这个特定的子项目上工作)。

在这种情况下,您希望避免从各种configure.ac中尽可能多地重复尽可能多的东西。我建议你考虑所有configure的代码,这些代码也必须由宏中的顶级configure执行。这包括测试,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_COMMONm4/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