我正在使用autoconf
& automake
的C++项目,我正在努力正确设置*CPPFLAGS
中的包含路径。我已经阅读了大约3小时的文档,我还没有弄明白。我不是在寻找黑客,而是寻找正确的方法来做到这一点。这是我的难题。如何使用自动工具设置包含路径
在我看来,有3个完全不同的用于源包括路径:它必须与我的包,这是由configure --with-XXX=<PATH>
配置一起安装
- 外部库。
- 在我的软件包中,有些源文件使用
#include <file.h>
,即使file.h
是软件包的一部分,为了编译它们,我必须正确设置include路径。 (注意,这不是编辑所有这些文件的选项。) - 异想天开(或不)标准指定用户必须被允许指定他们自己的(额外的)包含路径。也就是说,我不应该设置
CPPFLAGS
。
在我的当前设置:
- 类型1路径由
AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")
设置内部configure.ac
。 - 类型2路径设置在
Makefile.am
之内test_CPPFLAGS = -I<path>
。 - 无法设置类型3。更确切地说,如果用户在运行
make
之前设置了CPPFLAGS
,则会覆盖类型1设置,导致编译失败。当然,用户可以尝试使用CXXFLAGS
来代替,但该用户有不同的用途(请记住,我正在寻求正确的方式来执行此操作,而不是黑客)。
我试图通过在configure.ac
内使用AM_CPPFLAGS
设置类型1路径来解决此问题。 (仅供参考:如果您设置了AM_CPPFLAGS
而不是CPPFLAGS
,但仍需要执行一些检查,例如AC_CHECK_HEADERS
,则需要暂时设置CPPFLAGS
,然后将其恢复以便检查生效;这是here的解释。)这样可以释放CPPFLAGS
对于类型3路径,但不幸的是,编译失败,因为configure
产生的Makefile
-s将只使用AM_CPPFLAGS
,如果没有专门的<target>_CPPFLAGS
存在。因此,如果test_CPPFLAGS
与类型2路径一起存在,则编译test
将失败,因为它不会获得类型1路径。
修复方法是在Makefile.am
之内指定始终使用AM_CPPFLAGS
。但这是“靠书”吗?我能以全局方式做到这一点,还是必须编辑每一个target_CPPFLAGS
?有没有另一种“正确的”解决方案?
通过“异想天开”,你是否包含官方autoconf文档,明确指出CPPFLAGS是一个用户变量,不应该由维护者修改? (见http://www.gnu.org/software/autoconf/manual/autoconf.html上的第4.8.1节) –
尽管官方automake文档中一个较不明确的例子可能会更清晰,其中指出:“你永远不应该重新定义用户变量,如Makefile.am中的CPPFLAGS“。在第27.6节的http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html#Flag-Variables-Ordering –