【发布时间】:2013-12-12 09:47:06
【问题描述】:
我正在开发一个使用autoconf 和automake 的C++ 项目,并且我正在努力正确设置*CPPFLAGS 中的包含路径。我已经阅读了大约 3 个小时的文件,但我还无法弄清楚。我不是在寻找黑客,而是在寻找正确的方法。这是我的难题。
在我看来,包含路径有 3 个完全不同的来源:
- 必须与我的包一起安装的外部库,由
configure --with-XXX=<PATH>配置。 - 在我的包中,一些源文件使用
#include <file.h>,即使file.h是包的一部分,所以要编译它们,我必须正确设置包含路径。 (请注意,不能编辑所有这些文件。) - 异想天开(或非)标准指定必须允许用户指定他们自己的(额外)包含路径。也就是说,我根本不应该设置
CPPFLAGS。
在我当前的设置中:
- 类型 1 路径由
AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")在configure.ac内设置。 - Type 2 路径由
test_CPPFLAGS = -I<path>在Makefile.am中设置。 - 无法设置类型 3。更准确地说,如果用户在运行
make之前设置了CPPFLAGS,这会覆盖Type 1 设置,导致编译失败。当然,用户可以尝试改用CXXFLAGS,但那个有不同的用途(请记住,我要求的是正确的方法,而不是hack)。
我尝试通过在configure.ac 中使用AM_CPPFLAGS 设置Type 1 路径来解决此问题。 (供参考:如果您设置了AM_CPPFLAGS 而不是CPPFLAGS,但仍需要运行一些检查,例如AC_CHECK_HEADERS,则需要临时设置CPPFLAGS,然后将其恢复为检查工作;这是解释了here。)这为Type 3路径释放了CPPFLAGS,但不幸的是编译失败,因为configure生成的Makefile-s将只使用AM_CPPFLAGS,如果没有专门的<target>_CPPFLAGS存在。因此,如果 test_CPPFLAGS 存在类型 2 路径,则编译 test 将失败,因为它没有获得类型 1 路径。
解决方法是在Makefile.am 中指定始终使用AM_CPPFLAGS。但这是“书本”吗?我可以以全局方式执行此操作,还是必须编辑每个target_CPPFLAGS?还有其他“正确”的解决方案吗?
【问题讨论】:
-
通过“异想天开”,您是否包含官方的 autoconf 文档,其中明确指出 CPPFLAGS 是一个用户变量,维护者不应修改? (见第 4.8.1 节gnu.org/software/autoconf/manual/autoconf.html)
-
虽然官方 automake 文档中的一个不那么模棱两可的例子可能更清楚,它指出“您永远不应该在 Makefile.am 中重新定义用户变量,例如 CPPFLAGS。”在第 27.6 节中gnu.org/software/automake/manual/html_node/…
标签: autotools autoconf automake include-path