Subject: Re: bug#14396: AM_CPPFLAGS not respected when using subdir-objects

From: Stefano Lattarini <[email-masked]>
Date: Tue, 14 May 2013 09:31:11 +0200

tags 14396 notabug
close 14396
thanks

On 05/14/2013 05:07 AM, Mike Frysinger wrote:
> i've been playing around with subdir-objects and noticed that sub-compiles 
> don't respect AM_CPPFLAGS :(
>
The failure you're seeing is due to a user error.  See below.  I'm thus
closing this report as "not a bug".  We are however free to continue our
discussion here anyway (it should still be registered in the tracker).

> happens with automake 1.13.1 and the latest 
> 1.13.1d test release.  also using autoconf-2.69 if it matters.
> 
> $ cat configure.ac
> AC_INIT([pkg], [0])
> AM_INIT_AUTOMAKE([subdir-objects])
> AC_PROG_CC
> AM_PROG_CC_C_O
> AC_CONFIG_FILES([Makefile])
> AC_OUTPUT
> 
> $ cat Makefile.am
> noinst_PROGRAMS =
> AM_CPPFLAGS = -DXXX
>
OK, but ...

> include src/Makemodule.am
> 
> $ cat src/Makemodule.am
> noinst_PROGRAMS += src/x
> src_x_SOURCES = src/x.c
> src_x_CPPFLAGS = -DYYY
> 
>
... here you define per-program CPPFLAGS for src/x, and that
*completely overrides* global AM_CPPFLAGS.  That is by design.
If you want the flags in AM_CPPFLAGS to be used also when
compiling the objects of src/x, you need to add those flags
*explicitly* to src_x_CPPFLAGS:

  src_x_CPPFLAGS = $(AM_CPPFLAGS) -DYYY

> $ cat src/x.c
> main(){}
> 
> $ touch NEWS README AUTHORS ChangeLog COPYING
> $ autoreconf -f -i
> $ ./configure
> $ make
> gcc -DPACKAGE_NAME=\"pkg\" -DPACKAGE_TARNAME=\"pkg\" -DPACKAGE_VERSION=\"0\" -
> DPACKAGE_STRING=\"pkg\ 0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -
> DPACKAGE=\"pkg\" -DVERSION=\"0\" -I.  -DYYY   -g -O2 -MT src/src_x-x.o -MD -MP 
> -MF src/.deps/src_x-x.Tpo -c -o src/src_x-x.o `test -f 'src/x.c' || echo 
> './'`src/x.c
> 
> there is no -DXXX there :(.  i know the var is set correctly because if i 
> manually add $(AM_CPPFLAGS) to the src_x_CPPFLAGS line, it shows up.
>
And that is what you're supposed to do :-)  If something in the documentation
doesn't make that clear, feel free to provide a patch to improve the situation.

> reading the generated Makefile i see:
> COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
> 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
> and this is good.  but that var isn't used to compile things.  instead, 
> there's this rule:
> 	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_x_CPPFLAGS) 
> $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/src_x-x.o -MD -MP -MF 
> src/$(DEPDIR)/src_x-x.Tpo -c -o src/src_x-x.o `test -f 'src/x.c' || echo 
> '$(srcdir)/'`src/x.c
> 
> and indeed, there's no AM_CPPFLAGS in there.
>
Again, that is by design.

>  all the other good stuff (including the deprecated vars) though ...
> -mike

HTH,
  Stefano