manpagez: man pages & more
info automake
Home | html | info | man
[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.8 Per-Object Flags Emulation

 
One of my source files needs to be compiled with different flags.  How
do I do?

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 section 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 section 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.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]
© manpagez.com 2000-2024
Individual documents may contain additional copyright information.