Salut Alexandre, Thanks for the feedback:
Alexandre Duret-Lutz wrote: > * LIBOBJDIR seems worthy to document from the Autoconf user perspective. > Non-automake might also benefit from this; and we should avoid using > undocumented interfaces in Automake. Okay, I've added that to the attached revision of this patch. > * The comment in _AC_LIBOBJS_NORMALIZE seems misleading to me, > because LIBOBJDIR is unrelated to the macro > AC_CONFIG_LIBOBJ_DIR as far as Autoconf is concerned. > AC_CONFIG_LIBOBJ_DIR specifies where the *sources* files are. > LIBOBJDIR is a prefix variable the user cano use to relocate > the *object* files. This is not necessary the same place. True enough also. I've changed the comments to describe the situation more accurately. > * Autoconf needs to be adjusted to reflect the fact that > Automake scans a new macro. See the comment above the %traced > variable you modified in scan_autoconf_trace. AC_CONFIG_LIBOBJ_DIR is already there in autoconf-2.59 and HEAD. > * Better write ${LIBOBJDIR} instead of $(LIBOBJDIR) in @LIBOBJS@ > (for the same reason we use ${prefix}, etc.) I disagree, LIBOBJDIR is a make macro not a shell variable, so it is more akin to $(srcdir) than ${prefix}. If I'm missing something, feel free to change it before committing. > * The Automake manual should be updated at least in two places: > - the place where it documents all the macros that can > affect its behavior (your patch causes > AC_CONFIG_LIBOBJ_DIR to have a stronger semantic when used > with Automake than when used with only Autoconf). > - the section about how LIBOBJS is used. > * Use $PERL, not perl. Both done. Thanks for the pointers. > * AFAICT your patch assumes that users use option `subdir-objects' when > using @LIBOBJS@ remotely. I think we should also support the other case. > > I suggest you don't bother with the last point unless it looks > easy to you. I'll probably find some time this week-end or next > week. Agreed on all counts. My perl-fu is as always insufficient to the task, thanks for offering to do the rest. ChangeLog entries for automake: 2005-04-25 Gary V. Vaughan <[EMAIL PROTECTED]> Fixes PR/401 * automake.in (config_libobj_dir): Either `.' or whatever directory is given to AC_CONFIG_LIBOBJ_DIR in configure.ac. (scan_autoconf_traces): Set config_libobj_dir. (sub_read_am_file): Define LIBOBJDIR according to relative path from each Makefile to AC_CONFIG_LIBOBJ_DIR directory. (require_libobj_with_macro): Use $config_libobj_dir when looking for LIBOBJs. (handle_LIBOBJS, handle_ALLOCA): Use it. * tests/Makefile.am (TESTS): Declare pr401.test. * tests/pr401.test: New test. * doc/automake.texi (LIBOBJS): Document changes in behaviour of LIBOBJS, ALLOCA, LTLIBOBJS & LTALLOCA in the presence of subdir-objects and an invocation of AC_CONFIG_LIBOBJ_DIR. And autoconf: 2004-04-20 Gary V. Vaughan <[EMAIL PROTECTED]> * lib/autoconf/general.m4 (_AC_LIBOBJS_NORMALIZE): Prepend each object named in LIBOBJS and LTLIBOBJS with the $(LIBOBJDIR), as set by latest automake. Cheers, Gary. -- Gary V. Vaughan ())_. [EMAIL PROTECTED],gnu.org} Research Scientist ( '/ http://tkd.kicks-ass.net GNU Hacker / )= http://www.gnu.org/software/libtool Technical Author `(_~)_ http://sources.redhat.com/autobook
--- automake.in.orig 2005-02-12 10:06:56.000000000 +0000 +++ automake.in 2005-04-20 14:08:05.000000000 +0100 @@ -142,6 +142,7 @@ use Automake::RuleDef; use Automake::Wrap 'makefile_wrap'; use File::Basename; +use File::Spec; use Carp; ## ----------- ## @@ -333,6 +334,10 @@ # in Makefiles. my $am_config_aux_dir = ''; +# Directory to search for AC_LIBSOURCE file, as set by AC_CONFIG_LIBOBJ_DIR +# in configure.ac. +my $config_libobj_dir = ''; + # Whether AM_GNU_GETTEXT has been seen in configure.ac. my $seen_gettext = 0; # Whether AM_GNU_GETTEXT([external]) is used. @@ -2067,7 +2072,7 @@ if ($iter =~ /\.h$/) { - require_file_with_macro ($cond, $var, FOREIGN, $iter); + require_libobj_with_macro ($cond, $var, FOREIGN, $iter); } elsif ($iter ne 'alloca.c') { @@ -2079,7 +2084,7 @@ my $bs = var ('BUILT_SOURCES'); if (! $bs || ! grep (/$rewrite/, $bs->value_as_list_recursive)) { - require_file_with_macro ($cond, $var, FOREIGN, $iter); + require_libobj_with_macro ($cond, $var, FOREIGN, $iter); } } } @@ -2092,7 +2097,7 @@ $lt ||= ''; $var->requires_variables ("[EMAIL PROTECTED]@ used", $lt . 'ALLOCA'); $dep_files{'$(DEPDIR)/alloca.P' . $myobjext} = 1; - require_file_with_macro ($cond, $var, FOREIGN, 'alloca.c'); + require_libobj_with_macro ($cond, $var, FOREIGN, 'alloca.c'); &saw_extension ('c'); } @@ -4636,6 +4641,7 @@ AC_CONFIG_AUX_DIR => 1, AC_CONFIG_FILES => 1, AC_CONFIG_HEADERS => 1, + AC_CONFIG_LIBOBJ_DIR => 1, AC_CONFIG_LINKS => 1, AC_INIT => 0, AC_LIBSOURCE => 1, @@ -4731,6 +4737,12 @@ push @config_headers, $spec; } } + elsif ($macro eq 'AC_CONFIG_LIBOBJ_DIR') + { + $config_libobj_dir = $args[1]; + $relative_dir = '.'; + check_directory ($config_libobj_dir, $where); + } elsif ($macro eq 'AC_CONFIG_LINKS') { foreach my $spec (split (' ', $args[1])) @@ -5761,6 +5773,15 @@ use constant IN_COMMENT => 2; my $prev_state = IN_RULE_DEF; + # Calculate the relative path from this Makefile to LIBOBJDIR. + my $am_libobj_dir = ''; + unless ($config_libobj_dir eq '') + { + my $dir = File::Spec->abs2rel ($config_libobj_dir, $relative_dir); + $am_libobj_dir = "$dir/" unless $dir eq ''; + } + &define_variable ('LIBOBJDIR', "$am_libobj_dir", INTERNAL); + while ($_ = $am_file->getline) { $where->set ("$amfile:$."); @@ -6975,6 +6996,22 @@ require_file ($macro->rdef ($cond)->location, $mystrict, @files); } +# &require_libobj_with_macro ($COND, $MACRO, $MYSTRICT, @FILES) +# ------------------------------------------------------------- +sub require_libobj_with_macro ($$$@) +{ + my ($cond, $macro, $mystrict, @files) = @_; + $macro = rvar ($macro) unless ref $macro; + if ($config_libobj_dir eq '') + { + require_file ($macro->rdef ($cond)->location, $mystrict, @files); + } + else + { + require_file_internal ($macro->rdef ($cond)->location, $mystrict, + $config_libobj_dir, @files); + } +} # &require_conf_file ($WHERE, $MYSTRICT, @FILES) # ---------------------------------------------- --- tests/Makefile.am.orig 2005-04-20 13:09:37.000000000 +0100 +++ tests/Makefile.am 2005-04-20 13:39:05.000000000 +0100 @@ -405,6 +405,7 @@ pr300-ltlib.test \ pr300-prog.test \ pr307.test \ +pr401.test \ prefix.test \ primary.test \ primary2.test \ --- /dev/null 2005-04-25 18:07:47.000000000 +0100 +++ tests/pr401.test 2005-04-25 18:24:31.000000000 +0100 @@ -0,0 +1,155 @@ +#! /bin/sh +# Copyright (C) 2005 Free Software Foundation, Inc. +# +# This file is part of GNU Automake. +# +# GNU Automake is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# GNU Automake is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Automake; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# Check support for AC_CONFIG_LIBOBJ_DIR vs LIBOBJS. + +required=gcc +. ./defs || exit 1 + +set -e + +mkdir lib src + +cat >lib/feep.c <<'EOF' +char * +feep () +{ + return "feep"; +} +EOF + +cat >src/feep.c <<'EOF' +#include <stdio.h> + +extern char *feep (); + +int +main (int argc, char **argv) +{ + printf ("%s\n", feep ()); + return 0; +} +EOF + +cat >>configure.in << 'EOF' +## These lines are activated for later tests +#: AC_CONFIG_LIBOBJ_DIR([lib]) +AC_PROG_CC +#: AM_PROG_CC_C_O +AC_LIBOBJ([feep]) +AC_LIBSOURCE([feep.c]) +AC_PROG_RANLIB +AC_CONFIG_FILES([lib/Makefile src/Makefile]) +AC_OUTPUT +EOF + +## ------------------------------------------ ## +## First a test of traditional LIBOBJS usage. ## +## ------------------------------------------ ## + +cat >Makefile.am <<'EOF' +SUBDIRS = lib src +EOF + +cat >lib/Makefile.am <<'EOF' +noinst_LIBRARIES = libfeep.a +libfeep_a_SOURCES = +libfeep_a_LIBADD = $(LIBOBJS) +EOF + +cat >src/Makefile.am <<'EOF' +check_PROGRAMS = feep +feep_LDADD = $(top_builddir)/lib/libfeep.a + +TESTS = feep +EOF + +$ACLOCAL +$AUTOCONF +$AUTOMAKE +./configure +$MAKE +$MAKE check + +rm -f configure Makefile* lib/Makefile* src/Makefile* */feep.o */libfeep.a + + +## -------------------------------------------- ## +## Test using LIBOBJS from a sibling directory. ## +## -------------------------------------------- ## + +$PERL -pi -e 's/#: //' configure.in +$PERL -pi -e 's/lib\/Makefile //' configure.in + +cat >Makefile.am <<'EOF' +SUBDIRS = src +EOF + +cat > src/Makefile.am <<'EOF' +AUTOMAKE_OPTIONS = subdir-objects + +noinst_LIBRARIES = libfeep.a +libfeep_a_SOURCES = +libfeep_a_LIBADD = $(LIBOBJS) + +check_PROGRAMS = feep +feep_LDADD = ./libfeep.a + +TESTS = feep +EOF + +$ACLOCAL +$AUTOCONF +$AUTOMAKE --add-missing +./configure +$MAKE +$MAKE check + +rm -f configure Makefile* src/Makefile* */feep.o */libfeep.a + + +## ----------------------------------------- ## +## Test using LIBOBJS from parent directory. ## +## ----------------------------------------- ## + +$PERL -pi -e 's/^.*src\/Makefile.*$//' configure.in + +cat >Makefile.am <<'EOF' +AUTOMAKE_OPTIONS = subdir-objects + +noinst_LIBRARIES = lib/libfeep.a +lib_libfeep_a_SOURCES = +lib_libfeep_a_LIBADD = $(LIBOBJS) + +check_PROGRAMS = src/feep +src_feep_SOURCES = src/feep.c +src_feep_LDADD = ./lib/libfeep.a + +TESTS = src/feep +EOF + +$ACLOCAL +$AUTOCONF +$AUTOMAKE +./configure +$MAKE +$MAKE check + +rm -f configure Makefile* */feep.o */libfeep.a --- doc/automake.texi.orig 2005-04-25 18:27:36.000000000 +0100 +++ doc/automake.texi 2005-04-25 19:31:09.000000000 +0100 @@ -3785,7 +3785,10 @@ The @code{AC_CONFIG_LIBOBJ_DIR} tells Autoconf that the source files of these object files are to be found in the @file{lib/} directory. -Automake does not yet use this information; it knows the source files + +In conjunction with @code{subdir-objects}, Automake uses this +information to deduce that the object files will be in the same +subdirectory relative to @code{$top_builddir}; it knows the source files are expected to be in the directory where the @code{$(LIBOBJS)} and @code{$(ALLOCA)} variables are used. @@ -3831,13 +3834,9 @@ tool2_SOURCES = @dots{} @end example -Please note it would be wrong to use the @code{$(LIBOBJS)} or [EMAIL PROTECTED](ALLOCA)} in @file{src/Makefile.am}, because these variables -contains unprefixed object names, and for instance [EMAIL PROTECTED](OBJEXT)} is not buildable in the @file{src/} directory. -(Actually if you try using @code{$(LIBOBJS)} in @file{src/}, Automake -will require a copy of @file{malloc.c}, @file{memcmp.c}, [EMAIL PROTECTED], @file{alloca.c} in @file{src/} too.) +Please note @code{$(LIBOBJS)} or @code{$(ALLOCA)} can only be used in [EMAIL PROTECTED]/Makefile.am} in @code{subdir-objects} mode, because these +variables contain object names prefixed with @code{$(LIBOBJDIR)}. Because @code{$(LIBOBJS)} and @code{$(ALLOCA)} contain object filenames that end with @code{.$(OBJEXT)}, they are not suitable for
--- lib/autoconf/general.m4.orig 2003-10-27 11:10:56.000000000 +0000 +++ lib/autoconf/general.m4 2005-04-25 17:56:48.000000000 +0100 @@ -1,7 +1,7 @@ # This file is part of Autoconf. -*- Autoconf -*- # Parameterized macros. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, Free Software Foundation, Inc. +# 2002, 2003, 2005, Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -2435,7 +2435,7 @@ # _AC_LIBOBJS_NORMALIZE # --------------------- -# Clean up LIBOBJS abd LTLIBOBJS so that they work with 1. ac_objext, +# Clean up LIBOBJS and LTLIBOBJS so that they work with 1. ac_objext, # 2. Automake's ANSI2KNR, 3. Libtool, 4. combination of the three. # Used with AC_CONFIG_COMMANDS_PRE. AC_DEFUN([_AC_LIBOBJS_NORMALIZE], @@ -2445,9 +2445,10 @@ # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` - # 2. Add them. - ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' + # 2. Prepend LIBOBJDIR. When used with automake>1.9.5 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \$(LIBOBJDIR)$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \$(LIBOBJDIR)$ac_i"'$U.lo' done AC_SUBST([LIB@&[EMAIL PROTECTED], [$ac_libobjs]) AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) --- doc/autoconf.texi.orig 2005-04-25 18:04:28.000000000 +0100 +++ doc/autoconf.texi 2005-04-25 18:18:15.000000000 +0100 @@ -4330,7 +4330,10 @@ @command{configure} might need to know the replacement directory for the following reasons: (i) some checks use the replacement files, (ii) some macros bypass broken system headers by installing links to the -replacement headers, etc. +replacement headers, etc. (iii) when used in conjunction with Automake, +within each @file{Makefile}, @var{directory} is used as a relative path +from @code{$(top_srcdir)} to each object named in @code(LIBOBJS) and [EMAIL PROTECTED](LTLIBOBJS). @end defmac @sp 1 @@ -14447,6 +14450,13 @@ Note that @code{U} must not be used in your Makefiles. [EMAIL PROTECTED] LIBOBJDIR +When used with Automake 1.9.6 or newer, a suitable value for [EMAIL PROTECTED] is set so that the @code{LIBOBJS} and @code{LTLIBOBJS} +can be referenced from any @file{Makefile.am}. Even without Automake, +arranging for @code{LIBOBJDIR} to be set correctly will enable +referencing @code{LIBOBJS} and @code{LTLIBOBJS} in another directory. + @node AC_FOO_IFELSE vs AC_TRY_FOO @subsection @code{AC_FOO_IFELSE} vs.@: @code{AC_TRY_FOO}
signature.asc
Description: OpenPGP digital signature