我的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中,而不必为它们创建单独的脚本。
答案 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。)