autoconf 和 automake 中的 DEFS 和 CPPFLAGS 有什么区别

lan*_*oxx 2 automake autoconf

我已经阅读了CFLAGS 和 CPPFLAGS之间的区别。但是我的 Makefile.am 目前同时使用 DEFS 和 CPPFLAGS,我不确定其中的区别。

DEFS += -DLOCALEDIR=\"$(localedir)\" -DDATADIR=\"$(datadir)\" -DPKGDATADIR=\"$(pkgdatadir)\"
Run Code Online (Sandbox Code Playgroud)

和:

src_foo_CPPFLAGS = \
    $(AM_CPPFLAGS) \
    -I$(top_builddir)/src \
    -DDATADIR='"$(datadir)"' \
    -DMODULEDIR='"$(moduledir)"' \
    -DLIBEXECDIR='"$(libexecdir)"'
Run Code Online (Sandbox Code Playgroud)

CPPFLAGS 和 DEFS 似乎都使用该选项创建定义-D。那么有什么区别。我可以删除DEFS并添加缺少的定义(PKGDATADIRLOCALEDIRCPPFLAGS吗?

lan*_*oxx 5

DEFS 在 autoconf 中定义如下:

-D 选项传递给 C 编译器。如果 AC_CONFIG_HEADERS 被调用,configure 用 -DHAVE_CONFIG_H 替换 '@DEFS@'(参见配置头文件)。这个变量在 configure 执行测试时没有定义,只有在创建输出文件时才定义。有关如何检查以前测试的结果,请参阅设置输出变量。

当使用-p标志(例如make -p > rules)执行 make 时。我们可以检查生成的rules文件以找出 make make 实际执行的操作。

假设AC_CONFIG_HEADERS宏被调用,那么DEFS最初定义如下:

DEFS = -DHAVE_CONFIG_H
Run Code Online (Sandbox Code Playgroud)

假设我们定义DEFS如下:

DEFS += \
    -DLOCALEDIR=\"$(localedir)\" \
    -DDATADIR=\"$(datadir)\" \
    -DPKGDATADIR=\"$(pkgdatadir)\"
Run Code Online (Sandbox Code Playgroud)

然后DEFS看起来像这样:

DEFS = -DHAVE_CONFIG_H -DLOCALEDIR=\"$(localedir)\" -DDATADIR=\"$(datadir)\"  \
       -DPKGDATADIR=\"$(pkgdatadir)\"
Run Code Online (Sandbox Code Playgroud)

接下来看一下DEFSautomake生成的Makefile中使用的方式,Makefile中的编译规则是这样的:

COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
          $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,DEFS首先出现,然后是其他一些变量,并且AM_CPPFLAGS 每进一步出现的DEFS总是后跟另一个出现的AM_CPPFLAGS及其变体,例如foo_CPPFLAGS

所以总结这个问题,我认为很明显DEFS可以删除,而是可以将其内容放入CPPFLAGS. 我也在自动工具频道的 IRC 上问过这个问题。有人向我建议,不要使用DEFS而只使用CPPFLAGS.