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

时间:2014-05-27 09:56:19

标签: autoconf automake

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

DEFS += -DLOCALEDIR=\"$(localedir)\" -DDATADIR=\"$(datadir)\" -DPKGDATADIR=\"$(pkgdatadir)\"

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

CPPFLAGS和DEFS似乎都使用-D选项创建定义。那么差异是什么呢?我可以删除DEFS并将缺少的定义(PKGDATADIRLOCALEDIR)添加到CPPFLAGS吗?

1 个答案:

答案 0 :(得分:4)

DEFS在autoconf中定义如下:

  

-D传递给C编译器的选项。如果调用AC_CONFIG_HEADERS,则configure将'@ DEFS @'替换为-DHAVE_CONFIG_H(参见   配置标题)。配置时未定义此变量   仅在创建输出文件时执行其测试。看到   设置输出变量,以便检查以前的结果   测试

使用-p标记执行make时(例如make -p > rules)。我们可以检查生成的rules文件,找出make实际上会做什么。

假设调用AC_CONFIG_HEADERS宏,则DEFS最初定义如下:

DEFS = -DHAVE_CONFIG_H

假设我们将DEFS定义如下:

DEFS += \
    -DLOCALEDIR=\"$(localedir)\" \
    -DDATADIR=\"$(datadir)\" \
    -DPKGDATADIR=\"$(pkgdatadir)\"

然后DEFS将如下所示:

DEFS = -DHAVE_CONFIG_H -DLOCALEDIR=\"$(localedir)\" -DDATADIR=\"$(datadir)\"  \
       -DPKGDATADIR=\"$(pkgdatadir)\"

接下来让我们看一下在使用automake生成的Makefile中DEFS的使用方式,Makefile中的编译规则如下所示:

COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
          $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)

我们可以看到,DEFS首先显示,然后是其他一些变量和AM_CPPFLAGS 每次出现DEFS时,都会出现另一次出现AM_CPPFLAGS及其变体,例如foo_CPPFLAGS

因此,为了结束这个问题,我认为可以删除DEFS,而其内容可以放入CPPFLAGS。我还在autotools频道的IRC上问过这个问题。有人向我建议,不要使用DEFS而只使用CPPFLAGS