Mat*_*vid 15 automake autoconf autotools include-path
我正在开发一个使用autoconf&的C++项目,automake我正在努力正确设置包含路径*CPPFLAGS.我已经阅读了大约3个小时的文件,我还想不通.我不是在寻找黑客,而是寻找正确的方法.这是我的难题.
在我看来,包含路径有3个完全不同的来源:
configure --with-XXX=<PATH>.#include <file.h>即使file.h是包的一部分也使用,所以为了编译它们,我必须正确设置包含路径.(注意,它不是编辑所有这些文件的选项.)CPPFLAGS.在我目前的设置中:
configure.ac通过AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>").Makefile.am通过test_CPPFLAGS = -I<path>.CPPFLAGS在运行之前设置,则会make覆盖类型1设置,从而导致编译失败.当然,用户可以尝试使用CXXFLAGS,但是那个用户有不同的用途(记住,我要求正确的方法来做到这一点,而不是黑客).我尝试通过使用AM_CPPFLAGSinside 设置Type 1路径来解决这个问题configure.ac.(供参考:如果您设置AM_CPPFLAGS而不是CPPFLAGS,但仍需要运行某些检查AC_CHECK_HEADERS,则需要临时设置CPPFLAGS然后还原它以使检查起作用;这将在此处解释.)这样可以释放CPPFLAGS类型3路径,但不幸的是,编译失败,因为只有没有专门存在的情况下Makefile才会生成-s .因此,如果存在类型2路径,则编译将失败,因为它不会获得类型1路径.configureAM_CPPFLAGS<target>_CPPFLAGStest_CPPFLAGStest
修复方法是指定内部Makefile.am始终使用AM_CPPFLAGS.但这是"按书"吗?我可以以全局方式执行此操作,还是必须编辑每个单独的target_CPPFLAGS?还有其他"正确"的解决方案吗?
Bre*_*ale 29
我知道很难从autotools手册中得到一个直接的答案.这里和这里有一些很好的从头到尾的教程.
*CPPFLAGSautoconf中没有特定于包的标准变量.configure可以调用CPPFLAGS=...,而automake会将其添加CPPFLAGS到相关的makefile规则中 - CPPFLAGS在Makefile.in文件中搜索示例.出于这个原因,我建议您不要将此变量用于其他任何事情.
Makefile.am在AM_CPPFLAGS变量中添加标志(所有预处理器调用的默认值)或覆盖单个预处理器标志target_CPPFLAGS.在第三方库的示例中,最好使用如下名称:FOO_CPPFLAGS来保存预处理器选项,例如,
FOO_CPPFLAGS="-I${FOO_DIR}/include -DFOO_BAR=1"
...
AC_SUBST(FOO_CPPFLAGS)
Run Code Online (Sandbox Code Playgroud)
并在Makefile.am:
AM_CPPFLAGS = -I$(top_srcdir) $(FOO_CPPFLAGS)
# or:
target_CPPFLAGS = -I$(top_srcdir) $(FOO_CPPFLAGS)
Run Code Online (Sandbox Code Playgroud)
该top_srcdir变量由定义configure-我用它来说明第二壳体.假设您有file.h另一个目录other,位于顶级目录下.-I$(top_srcdir)允许您将其包含为<other/file.h>.或者,-I$(top_srcdir)/other允许您将其包含为<file.h>.
另一个有用的预设变量是srcdir- 当前目录.默认情况下-I$(srcdir)添加.因此,如果在当前目录中,您可以包含它甚至.如果是'sibling'目录,将允许您包含,并允许.AM_CPPFLAGS file.h<file.h>"file.h"other-I$(srcdir)/..<other/file.h>-I$(srcdir)/../other<file.h>
我还要补充一些包安装pkg-config .pc文件.如果设置pkg-config的安装来搜索正确的目录,您可能会发现该PKG_CHECK_MODULES宏非常有用.