One of my source files needs to be compiled with different flags. How do I do that?
Automake supports per-program and per-library compilation flags (see Program and Library Variables and Flag Variables Ordering). With this you can define compilation flags that apply to all files compiled for a target. For instance, in
bin_PROGRAMS = foo foo_SOURCES = foo.c foo.h bar.c bar.h main.c foo_CFLAGS = -some -flags
foo-foo.o, foo-bar.o, and foo-main.o will all be
compiled with ‘-some -flags’. (If you wonder about the names of
these object files, see Why are object files sometimes renamed?.) Note that
foo_CFLAGS
gives the flags to use when compiling all the C
sources of the program foo
; it has nothing to do with
foo.c or foo-foo.o specifically.
What if foo.c needs to be compiled into foo.o using some specific flags, that none of the other files requires? Obviously per-program flags are not directly applicable here. Something like per-object flags are expected, i.e., flags that would be used only when creating foo-foo.o. Automake does not support that; however this is easy to simulate using a library that contains only that object, and compiling this library with per-library flags.
bin_PROGRAMS = foo foo_SOURCES = bar.c bar.h main.c foo_CFLAGS = -some -flags foo_LDADD = libfoo.a noinst_LIBRARIES = libfoo.a libfoo_a_SOURCES = foo.c foo.h libfoo_a_CFLAGS = -some -other -flags
Here foo-bar.o and foo-main.o will all be compiled with ‘-some -flags’, while libfoo_a-foo.o will be compiled using ‘-some -other -flags’. Eventually, all three objects will be linked to form foo.
This trick can also be achieved using Libtool convenience libraries, for instance ‘noinst_LTLIBRARIES = libfoo.la’ (see Libtool Convenience Libraries).
Another tempting idea to implement per-object flags is to override the
compile rules automake
would output for these files.
Automake will not define a rule for a target you have defined, so you
could think about defining the ‘foo-foo.o: foo.c’ rule yourself.
We recommend against this, because this is error prone. For instance,
if you add such a rule to the first example, it will break the day you
decide to remove foo_CFLAGS
(because foo.c will then be
compiled as foo.o instead of foo-foo.o, see Why are object files sometimes renamed?). Also in order to support dependency tracking, the two
.o/.obj extensions, and all the other flags variables
involved in a compilation, you will end up modifying a copy of the
rule previously output by automake
for this file. If a new
release of Automake generates a different rule, your copy will need to
be updated by hand.