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], [EMAIL PROTECTED]) > 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