[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: using same automake conditional twice doesn't work?
From: |
Alexandre Duret-Lutz |
Subject: |
Re: using same automake conditional twice doesn't work? |
Date: |
Fri, 24 Jun 2005 00:19:40 +0200 |
User-agent: |
Gnus/5.110003 (No Gnus v0.3) Emacs/21.3.50 (gnu/linux) |
>>> "Ed" == Ed Hartnett <address@hidden> writes:
Ed> The following automake file attempts to add two subdirs,
Ed> "fortran" and "nf_test", if the BUILD_F77 automake
Ed> conditional is true. But this fails:
Ed> SUBDIRS = man
Ed> if BUILD_F77
Ed> SUBDIRS += fortran
Ed> endif
Ed> SUBDIRS += libsrc nc_test ncgen ncdump nctest
Ed> # If we're building the f77 API, test it too.
Ed> if BUILD_F77
Ed> SUBDIRS += nf_test
Ed> endif
Ed> The problem is that nf_test is not added to the end of the
Ed> list
Thanks for the report. I'm installing the following fix on HEAD
and branch-1-9.
2005-06-24 Alexandre Duret-Lutz <address@hidden>
* lib/Automake/Variable.pm (define, _new): Remember the helper
variable created for the last conditional += on each variable, and
only append further += in the same condition to this last helper
variable, not to older helper variables. This way the order of
the items appended to the variable is preserved.
* tests/cond21.test: Adjust.
* tests/cond38.test: New file.
* tests/Makefile.am (TESTS): Add cond38.test.
Report from Ed Hartnett.
Index: THANKS
===================================================================
RCS file: /cvs/automake/automake/THANKS,v
retrieving revision 1.269
diff -u -r1.269 THANKS
--- THANKS 22 Jun 2005 15:07:26 -0000 1.269
+++ THANKS 23 Jun 2005 22:09:07 -0000
@@ -56,6 +56,7 @@
Dmitry Mikhin address@hidden
Doug Evans address@hidden
Duncan Gibson address@hidden
+Ed Hartnett address@hidden
Eleftherios Gkioulekas address@hidden
Elena A. Vengerova address@hidden
Elmar Hoffmann address@hidden
Index: lib/Automake/Variable.pm
===================================================================
RCS file: /cvs/automake/automake/lib/Automake/Variable.pm,v
retrieving revision 1.37
diff -u -r1.37 Variable.pm
--- lib/Automake/Variable.pm 14 May 2005 20:28:51 -0000 1.37
+++ lib/Automake/Variable.pm 23 Jun 2005 22:09:08 -0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2004, 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
@@ -193,10 +193,8 @@
JAVAC => 1,
JAVAROOT => 1);
-# This hash records helper variables used to implement conditional '+='.
-# Keys have the form "VAR:CONDITIONS". The value associated to a key is
-# the named of the helper variable used to append to VAR in CONDITIONS.
-my %_appendvar = ();
+# Count of helper variables used to implement conditional '+='.
+my $_appendvar;
# Each call to C<Automake::Variable::traverse_recursively> gets an
# unique label. This is used to detect recursively defined variables.
@@ -335,7 +333,7 @@
{
%_variable_dict = ();
%_primary_dict = ();
- %_appendvar = ();
+ $_appendvar = 0;
@_var_order = ();
%_gen_varname = ();
$_traversal = 0;
@@ -436,6 +434,7 @@
my ($class, $name) = @_;
my $self = Automake::Item::new ($class, $name);
$self->{'scanned'} = 0;
+ $self->{'last-append'} = []; # helper variable for last conditional append.
$_variable_dict{$name} = $self;
if ($name =~ /_([[:alnum:]]+)$/)
{
@@ -892,6 +891,7 @@
if ($type eq '+' && ! $new_var)
{
$def->append ($value, $comment);
+ $self->{'last-append'} = [];
# Only increase owners. A VAR_CONFIGURE variable augmented in a
# Makefile.am becomes a VAR_MAKEFILE variable.
@@ -924,32 +924,39 @@
# @address@hidden = foo1 bar
# @address@hidden = foo2 bar
+ my $lastappend = [];
# Do we need an helper variable?
if ($cond != TRUE)
{
- # Does the helper variable already exists?
- my $key = "$var:" . $cond->string;
- if (exists $_appendvar{$key})
- {
- # Yes, let's simply append to it.
- $var = $_appendvar{$key};
- $owner = VAR_AUTOMAKE;
- $self = var ($var);
- $def = $self->rdef ($cond);
- $new_var = 0;
- }
- else
- {
- # No, create it.
- my $num = 1 + keys (%_appendvar);
- my $hvar = "am__append_$num";
- $_appendvar{$key} = $hvar;
- &define ($hvar, VAR_AUTOMAKE, '+',
- $cond, $value, $comment, $where, $pretty);
- # Now HVAR is to be added to VAR.
- $comment = '';
- $value = "\$($hvar)";
- }
+ # Can we reuse the helper variable created for the previous
+ # append? (We cannot reuse older helper variables because
+ # we must preserve the order of items appended to the
+ # variable.)
+ my $condstr = $cond->string;
+ my $key = "$var:$condstr";
+ my ($appendvar, $appendvarcond) = @{$self->{'last-append'}};
+ if ($appendvar && $condstr eq $appendvarcond)
+ {
+ # Yes, let's simply append to it.
+ $var = $appendvar;
+ $owner = VAR_AUTOMAKE;
+ $self = var ($var);
+ $def = $self->rdef ($cond);
+ $new_var = 0;
+ }
+ else
+ {
+ # No, create it.
+ my $num = ++$_appendvar;
+ my $hvar = "am__append_$num";
+ $lastappend = [$hvar, $condstr];
+ &define ($hvar, VAR_AUTOMAKE, '+',
+ $cond, $value, $comment, $where, $pretty);
+
+ # Now HVAR is to be added to VAR.
+ $comment = '';
+ $value = "\$($hvar)";
+ }
}
# Add VALUE to all definitions of SELF.
@@ -980,6 +987,7 @@
$where, $pretty);
}
}
+ $self->{'last-append'} = $lastappend;
}
# 3. first assignment (=, :=, or +=)
else
Index: tests/Makefile.am
===================================================================
RCS file: /cvs/automake/automake/tests/Makefile.am,v
retrieving revision 1.588
diff -u -r1.588 Makefile.am
--- tests/Makefile.am 8 Jun 2005 19:41:25 -0000 1.588
+++ tests/Makefile.am 23 Jun 2005 22:09:08 -0000
@@ -138,6 +138,7 @@
cond35.test \
cond36.test \
cond37.test \
+cond38.test \
condd.test \
condhook.test \
condinc.test \
Index: tests/cond21.test
===================================================================
RCS file: /cvs/automake/automake/tests/cond21.test,v
retrieving revision 1.5
diff -u -r1.5 cond21.test
--- tests/cond21.test 14 May 2005 20:28:54 -0000 1.5
+++ tests/cond21.test 23 Jun 2005 22:09:09 -0000
@@ -1,5 +1,5 @@
#! /bin/sh
-# Copyright (C) 2002 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2005 Free Software Foundation, Inc.
#
# This file is part of GNU Automake.
#
@@ -43,9 +43,6 @@
else
FOO += foon2
endif
-## Note that we add `foo1b' after `foo2'; however because it is appended in
-## the same condition as `foo1', it should use the same helper variable
-## and thus appear right after `foo1' in the output.
if COND1
FOO += foo1b
else
@@ -80,4 +77,4 @@
$AUTOMAKE -a
./configure
$MAKE test | $FGREP 'BAR: bar12 bar bar3 :BAR'
-$MAKE test | $FGREP 'FOO: foo foo1 foo1b foo2 :FOO'
+$MAKE test | $FGREP 'FOO: foo foo1 foo2 foo1b :FOO'
Index: tests/cond38.test
===================================================================
RCS file: tests/cond38.test
diff -N tests/cond38.test
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ tests/cond38.test 23 Jun 2005 22:09:09 -0000
@@ -0,0 +1,71 @@
+#!/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., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+
+# Check conditional variable ordering.
+# Report from Ed Hartnett.
+
+. ./defs
+
+set -e
+
+cat >>configure.in <<'EOF'
+AM_CONDITIONAL([CASE_A], :)
+AM_CONDITIONAL([CASE_B], :)
+AC_OUTPUT
+EOF
+
+cat >>Makefile.am <<'EOF'
+SUBDIRS = a
+if CASE_A
+SUBDIRS += b
+endif
+SUBDIRS += c
+if CASE_A
+SUBDIRS += d
+if CASE_B
+SUBDIRS += e
+endif
+SUBDIRS += f
+endif
+SUBDIRS += g
+if CASE_B
+SUBDIRS += h
+endif
+if CASE_B
+SUBDIRS += iXYZ
+SUBDIRS += jZYX
+endif
+print:
+ @echo BEG: $(SUBDIRS) :END
+EOF
+
+mkdir a b c d e f g h iXYZ jZYX
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE
+
+./configure
+$MAKE print >stdout
+cat stdout
+# Check good ordering
+grep 'BEG: a b c d e f g h iXYZ jZYX :END' stdout
+# Make sure no extra variable was created for the last 3 items.
+grep 'append.*=.* h iXYZ jZYX' Makefile
--
Alexandre Duret-Lutz
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: using same automake conditional twice doesn't work?,
Alexandre Duret-Lutz <=