如何在子包设置中传播automake变量?

时间:2012-04-18 21:25:02

标签: autotools autoconf 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 and project dependencies

2 个答案:

答案 0 :(得分:2)

autotools实际上并不是一个包管理系统,所以这是一个尴尬的用法,但是可以在子项目中引用构建树之外的相对路径。换句话说,在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"

如果子项目的配置脚本没有检查耦合子项目中的库,那么在Makefile.am中指定LDADD以获取必要的库链接可能会更清晰。

答案 1 :(得分:-1)

CPPFLAGS和LDFLAGS几乎不应该直接在命令行上传递(个人意见),但应该在config.site中设置。只需在$ {prefix} /share/config.site或$ CONFIG_SITE中进行分配(即在$ HOME / config.site文件中,并在运行configure的环境中设置CONFIG_SITE = $ HOME / config.site)并且该脚本将由所有配置调用提供。我不确定你的意思是“将这些值保留在autotool内容中”,但令我感到震惊的是使用config.site满足了这一点。 LDFLAGS和CPPFLAGS是告诉配置脚本库的非标准位置的正确机制,因此任何不使用它们的解决方案都将超出autotools的正常范围。 (当然,最好的解决方案是在标准位置安装库,这样你的工具链就可以找到它们而不需要你付出额外的努力。也许你正在使用gcc并且可以设置LIBRARY_PATH和CPATH。)