[Top][All Lists]
[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
- [automake] Dependency question with _LDADD, Michel Briand, 2008/08/19
- Re: [automake] Dependency question with _LDADD, Ralf Wildenhues, 2008/08/19
- Re: [automake] Dependency question with _LDADD, Michel Briand, 2008/08/26
- Re: [automake] Dependency question with _LDADD, Ralf Wildenhues, 2008/08/27
- Re: [automake] Dependency question with _LDADD, Braden McDaniel, 2008/08/27
- Re: [automake] Dependency question with _LDADD, Ralf Wildenhues, 2008/08/27
- Re: [automake] Dependency question with _LDADD, Braden McDaniel, 2008/08/27
- Re: [automake] Dependency question with _LDADD, Ralf Wildenhues, 2008/08/28
- Re: [automake] Dependency question with _LDADD, Peter Johansson, 2008/08/27