Search code examples
c++unit-testingmakefileautotoolsautomake

Automake AM_LDADD workaround


I want to set the same LDADD attribute (Unit test library) to a large number of targets (unit test C++ files). I first though that maybe automake has AM_LDADD variable to add that library to all the targets within the file but is not the case. In some mail list I found some short discussion asking to add it: http://gnu-automake.7480.n7.nabble.com/AM-LIBS-AM-LDADD-td3698.html

My question is, how do you deal with that? is it there any way to avoid manually adding LDADD attribute to each target?

So far my Makefile.am looks like:

 test1_SOURCES = ...
 test1_LDADD = -llibrary 
  ...
  ...
 test20_SOURCES = ...
 test20_LDADD = -llibrary 

Solution

  • The equivalent of an AM_LDADD variable is simply LDADD. e.g.,

    LDADD = -llibrary
    
    test1_SOURCES = ...
    ...
    test20_SOURCES = ...
    

    If you need to override LDADD for a particular program: prog, then prog_LDADD will always take precedence.

    I always assumed that since there was no LDADD standard environment variable passed to configure - as you can see with configure --help - there is no real reason for an AM_LDADD. This kind of makes sense, as the configure script, and any options, e.g., --with-foo=<path> should (ideally) work out the library dependencies.

    On the other hand, passing CFLAGS via configure might still need an AM_CFLAGS that combines CFLAGS and with other compiler flags determined by the configure script; or even a foo_CFLAGS override. Since configure must be informed of your custom CFLAGS.


    Also, I don't know if the test<n> programs only take a single C++ source file, but if so, you can simplify the Makefile.am with:

    LDADD = -llibrary
    
    check_PROGRAMS = test1 test2 ... test20
    AM_DEFAULT_SOURCE_EXT = .cc # or .cpp
    

    as described here.


    In regards to your comment, your can use a convenience library for that purpose - which is particularly useful for common code used by test programs:

    noinst_LIBRARIES = libfoo.a  # or noinst_LTLIBRARIES = libfoo.la
    libfoo_a_SOURCES = MyClass.hh MyClass.cc  # or libfoo_la_SOURCES
    
    LDADD = ./libfoo.a -llibrary # or libfoo.la if using libtool.
    
    ... etc ...