如何使用autotools设置包含路径

Mat*_*vid 15 automake autoconf autotools include-path

我正在开发一个使用autoconf&的C++项目,automake我正在努力正确设置包含路径*CPPFLAGS.我已经阅读了大约3个小时的文件,我还想不通.我不是在寻找黑客,而是寻找正确的方法.这是我的难题.

在我看来,包含路径有3个完全不同的来源:

  1. 必须与我的包一起安装的外部库,由我们配置configure --with-XXX=<PATH>.
  2. 在我的包中,一些源文件#include <file.h>即使file.h是包的一部分也使用,所以为了编译它们,我必须正确设置包含路径.(注意,它不是编辑所有这些文件的选项.)
  3. 异想天开(或不是)标准指定必须允许用户指定自己的(额外)包含路径.也就是说,我根本不应该设置CPPFLAGS.

在我目前的设置中:

  • 类型1路径设定内部configure.ac通过AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>").
  • 类型2路径设定内部Makefile.am通过test_CPPFLAGS = -I<path>.
  • 无法设置类型3.更确切地说,如果用户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规则中 - CPPFLAGSMakefile.in文件中搜索示例.出于这个原因,我建议您不要将此变量用于其他任何事情.

Makefile.amAM_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宏非常有用.

  • 另一个是`$(builddir)`或`$(top_builddir)`,它显然意味着用于构建期间生成的任何文件. (3认同)