DEFS
is defined in autoconf as follows:
-D options to pass to the C compiler. If AC_CONFIG_HEADERS is called, configure replaces ‘@DEFS@’ with -DHAVE_CONFIG_H instead (see
Configuration Headers). This variable is not defined while configure
is performing its tests, only when creating the output files. See
Setting Output Variables, for how to check the results of previous
tests.
When make is executed with the -p
flag (e.g. make -p > rules
). We can examine the resulting rules
file to find out what make make will actually do.
Assuming the AC_CONFIG_HEADERS
macro is called then DEFS
is initially defined as follows:
DEFS = -DHAVE_CONFIG_H
Assuming we define DEFS
as follows:
DEFS += \
-DLOCALEDIR=\"$(localedir)\" \
-DDATADIR=\"$(datadir)\" \
-DPKGDATADIR=\"$(pkgdatadir)\"
then DEFS
is going to look like this:
DEFS = -DHAVE_CONFIG_H -DLOCALEDIR=\"$(localedir)\" -DDATADIR=\"$(datadir)\" \
-DPKGDATADIR=\"$(pkgdatadir)\"
Next lets look at the way DEFS
is used in the Makefiles that are generated by automake, the compile rule in the Makefile will look like this:
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
As we can see, DEFS
appears first, followed by some other variables and the AM_CPPFLAGS
Every further occurrence of DEFS
is always followed by another occurrence of AM_CPPFLAGS
and its variants such as foo_CPPFLAGS
.
So to conclude this question, I think its clear that DEFS
can be removed and instead its content can be put into CPPFLAGS
. I also asked this question on IRC in the autotools channel. It was suggested to me, not to use DEFS
and only use CPPFLAGS
.