automake
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [automake] Dependency question with _LDADD


From: Ralf Wildenhues
Subject: Re: [automake] Dependency question with _LDADD
Date: Tue, 26 Aug 2008 17:43:13 +0200
User-agent: Mutt/1.5.18 (2008-05-17)

Hello Michel,

can we limit followups to the automake list only, please?

* Michel Briand wrote on Tue, Aug 26, 2008 at 05:09:34PM CEST:
> 
> as an exercise I decided to learn the maximum about automake and
> libtool, and write a complete example.

Thanks.  Some nits below.

> What do you think of my example ? Is it useful for other people
> to learn autotools ?

I don't know.  Typically, I'm bad at guessing what beginners need in
order to learn.

> I implemented library & program versioning. Basically.

OK.

> I also modified the program's Makefile.am to not rebuild the program
> when the library was just rebuilt.

I don't think showing that to a beginner is a good idea.  It's certainly
safer to let the program be rebuilt when the library changes.  But see
below for more specific remarks.

Here's a bit of review:

> ::::::::::::::
> autogen.sh
> ::::::::::::::
> autoreconf --force --install -I config -I m4

Why '-I config -I m4'?  AFAICS you do not use AC_CONFIG_MACRO_DIR([m4])
in configure.ac.  I'd use that, and drop '-I config'.

> ::::::::::::::
> configure.ac
> ::::::::::::::
> AC_INIT([autotraining], [1.0], address@hidden)
> AC_CONFIG_AUX_DIR(config)

If you aim at beginners, teach them the right manners by consistently
using correct m4 quotation:

  AC_CONFIG_AUX_DIR([config])

> AM_INIT_AUTOMAKE
>
> # Version: simpliest way to implement versioning
> PROGRAM_VERSION=`cat PROGRAM_VERSION`
> AC_SUBST(PROGRAM_VERSION)
> LIBRARY_VERSION=`cat LIBRARY_VERSION`
> AC_SUBST(LIBRARY_VERSION)

These statements cause config.status output to be dependent upon the
files PROGRAM_VERSION and LIBRARY_VERSION.  Thus, I would add
  CONFIG_STATUS_DEPENDENCIES='$(top_srcdir)/PROGRAM_VERSION 
$(top_srcdir)/LIBRARY_VERSION'
  AC_SUBST([CONFIG_STATUS_DEPENDENCIES])

so that configure is automatically rerun when those files change.

> # C++ is not used, so related checks are not needed
> m4_defun([_LT_AC_LANG_CXX_CONFIG], [:])
> # Same for Fortran
> m4_defun([_LT_AC_LANG_F77_CONFIG], [:])

The above four lines are obsolete once you update your Libtool to a
version newer than 2.1.  So why even include them in a beginners'
document?

> AM_PROG_LIBTOOL

This macro has been spelled AC_PROG_LIBTOOL for years, and LT_INIT since
Libtool 2.2.  Might want to at least use the AC_* form for clarity,
otherwise your adept reader might search needlessly.

> ::::::::::::::
> src/lib/Makefile.am
> ::::::::::::::
> # Library: libtraining
> # Generates its own pkg-config definition file
> 
> AM_CPPFLAGS = -DLIBRARY_VERSION=\"$(LIBRARY_VERSION)\"

Why not put
  AC_DEFINE([LIBRARY_VERSION], ...)

in configure.ac, so you don't need the above?  Of course you may want to
use a less generic name, e.g. TRAINING_LIBRARY_VERSION.

Similar applies to -DPROGRAM_VERSION in src/bin/Makefile.am.

> pkgconfigdir = $(libdir)/pkgconfig
> pkgconfig_DATA = libtraining.pc
> 
> lib_LTLIBRARIES = libtraining.la

> libtraining_la_includedir = $(includedir)
> libtraining_la_include_HEADERS = libtraining.h

For what it's worth, I'd replace the two lines above with this one line
only:
  include_HEADERS = libtraining.h

> libtraining_la_SOURCES = training.c

Since you're making an example package, how about adding an uninstalled
header here:
  libtraining_la_SOURCES = training.c internal_header.h

so that users know where to add that?

> libtraining_la_LDFLAGS = -version-info ${LIBRARY_VERSION}


> ::::::::::::::
> src/bin/Makefile.am
> ::::::::::::::
> # Main program: training
> # Uses libtraining in ../lib
> 
> LIBTRAINING_DIR=../lib
> 
> AM_CPPFLAGS = -DPROGRAM_VERSION=\"$(PROGRAM_VERSION)\" -I$(LIBTRAINING_DIR)
> AM_LDFLAGS = -L$(LIBTRAINING_DIR)

Please drop this line.

> bin_PROGRAMS = training
> training_SOURCES = training.c
> training_LDADD = -ltraining

This last line is wrong, too.  The two *have* to be replaced with this
one line:
  training_LDADD = ../lib/libtraining.la

Why?  Because otherwise, paths to the uninstalled $builddir/src/lib may
end up in the installed binary on some systems.  That can be a security
issue.  If you want to work around the rebuilding issue, then *please*
guard it with a big fat comment that this isn't for the faint of the
heart, and should not be done typically.  And then do it like this:
  # Explicitly override the dependency on any libraries, to hack away
  # automatic rebuilds.  Done because the author knows better than to
  # change the library incompatibly:
  training_DEPENDENCIES =

FWIW, you could actually add ../../LIBRARY_VERSION to this variable.

I should note that when I encounter newbies reporting bugs against
autotools, which turn out to have broken builds due to this setting
of yours, I will gladly send them to you.

Hope that helps.

Cheers,
Ralf




reply via email to

[Prev in Thread] Current Thread [Next in Thread]