From d63f5a0228365c2dd38b012bc1eaec230d158f67 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 9 Apr 2001 15:02:07 +0000 Subject: [PATCH] * automake.in (&handle_single_transform_list): Remove $xbase, unused. (&handle_source_transform): All the variables have conditions now, simplify. (&variable_delete): Admit an argument @conds. --- ChangeLog | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++ automake.in | 60 +++++++++-------- 2 files changed, 213 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index 328ce11a..2a747c1a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,187 @@ +2001-04-09 Akim Demaille + + * automake.in (&handle_single_transform_list): Remove $xbase, + unused. + (&handle_source_transform): All the variables have conditions now, + simplify. + (&variable_delete): Admit an argument @conds. + +2001-04-09 Akim Demaille + + * automake.in (&am_install_var): When adding `$(EXEEXT)' to PROGRAMS, + merge the `build' and `set' loops into one. + + @@ -7086,37 +7082,21 @@ sub am_install_var + # include EXEEXT when in Cygwin32 mode. + if ($primary eq 'PROGRAMS') + { + - my @conds = &variable_conditions ($one_name); + - + - my @condvals; + - foreach my $cond (@conds) + - { + - my @one_binlist = (); + - my @condval = &variable_value_as_list ($one_name, + - $cond); + - foreach my $rcurs (@condval) + - { + - if ($rcurs =~ /\./ || $rcurs =~ /^\@.*\@$/) + - { + - push (@one_binlist, $rcurs); + - } + - else + - { + - push (@one_binlist, $rcurs . '$(EXEEXT)'); + - } + - } + - + - push (@condvals, $cond); + - push (@condvals, join (' ', @one_binlist)); + - } + - + - variable_delete ($one_name); + - while (@condvals) + - { + - my $cond = shift (@condvals); + - my @val = split (' ', shift (@condvals)); + - &define_pretty_variable ($one_name, $cond, @val); + - } + + foreach my $cond (&variable_conditions ($one_name)) + + { + + my @sources; + + foreach my $source (&variable_value_as_list ($one_name, + + $cond)) + + { + + if ($source !~ /\./ && $source !~ /^\@.*\@$/) + + { + + $source .= '$(EXEEXT)'; + + } + + push (@sources, $source); + + } + + variable_delete ($one_name, $cond); + + &define_pretty_variable ($one_name, $cond, @sources); + + } + } + + # "EXTRA" shouldn't be used when generating clean targets, + +This is yet another bug found by Robert. There was no change in the +Makefile.in, but here is what happened (doubled line are debugging +messages). + + || BEFORE + || bin_PROGRAMS (User, where = 21) = + || { + || + || TRUE => hell hell.static $(BUILD_helldl) + || } + || -> BINARY_HELLDL_TRUE + | Makefile.am:21: bin_PROGRAMS was already defined in condition TRUE, which implies condition BINARY_HELLDL_TRUE + | bin_PROGRAMS (User, where = 21) = + | { + | + | TRUE => hell hell.static $(BUILD_helldl) + | } + || -> BINARY_HELLDL_FALSE + || AFTER + || bin_PROGRAMS (User, where = 21) = + || { + || + || TRUE => hell hell.static $(BUILD_helldl) + || BINARY_HELLDL_TRUE => hell$(EXEEXT) hell.static helldl$(EXEEXT) + || BINARY_HELLDL_FALSE => + || } + +I had not understood this loop was in charge of expanding PROGRAMS +into its closed set of conditionals. I thought it was here just to +append EXEEXT everywhere needed (*including* in the sub variables), +but no redefine it. Since it was already defined to TRUE adding any +new definition (but under FALSE) will necessarily cause a conflict +(good to see all work properly and catch it :). + +In fact, to be honest, I no longer understand very well why we perform +such a closure. I mean, as is, Automake transforms (this is +cond3.test) + + | bin_PROGRAMS = targ + | + | if ONE + | SONE = one.c + | else + | SONE = + | endif + | + | if TWO + | STWO = two.c + | else + | STWO = + | endif + | + | if THREE + | STHREE = three.c + | else + | STHREE = + | endif + | + | targ_SOURCES = $(SONE) $(STWO) $(STHREE) + +into + + | @ONE_FALSE@@THREE_FALSE@@TWO_TRUE@am_targ_OBJECTS = two.$(OBJEXT) + | @ONE_FALSE@@THREE_FALSE@@TWO_FALSE@am_targ_OBJECTS = + | @ONE_FALSE@@THREE_TRUE@@TWO_TRUE@am_targ_OBJECTS = two.$(OBJEXT) \ + | @ONE_FALSE@@THREE_TRUE@@TWO_TRUE@ three.$(OBJEXT) + | @ONE_FALSE@@THREE_TRUE@@TWO_FALSE@am_targ_OBJECTS = three.$(OBJEXT) + | @ONE_TRUE@@THREE_FALSE@@TWO_TRUE@am_targ_OBJECTS = one.$(OBJEXT) \ + | @ONE_TRUE@@THREE_FALSE@@TWO_TRUE@ two.$(OBJEXT) + | @ONE_TRUE@@THREE_FALSE@@TWO_FALSE@am_targ_OBJECTS = one.$(OBJEXT) + | @ONE_TRUE@@THREE_TRUE@@TWO_TRUE@am_targ_OBJECTS = one.$(OBJEXT) \ + | @ONE_TRUE@@THREE_TRUE@@TWO_TRUE@ two.$(OBJEXT) three.$(OBJEXT) + | @ONE_TRUE@@THREE_TRUE@@TWO_FALSE@am_targ_OBJECTS = one.$(OBJEXT) \ + | @ONE_TRUE@@THREE_TRUE@@TWO_FALSE@ three.$(OBJEXT) + +why don't we just output + + | @ONE_TRUE@am_SONE_OBJECTS = one.$(OBJEXT) + | @ONE_FALSE@am_SONE_OBJECTS = + | + | @TWO_TRUE@am_STWO_OBJECTS = two.$(OBJEXT) + | @TWO_FALSE@am_STWO_OBJECTS = + | + | @THREE_TRUE@am_STHREE_OBJECTS = three.$(OBJEXT) + | @THREE_FALSE@am_STHREE_OBJECTS = + | + | am_targ_OBJECTS = $(am_SONE_OBJECTS) $(am_STWO_OBJECTS) $(am_STHREE_OBJECTS) + +which means also, why do we look for the closure of PROGRAMS, instead +of just adding $(EXEEXT) to all its components and sub components +(i.e., inside sub vars such as $(SONE) above being a sub var of +targ_SOURCES)? + + +Aaaaaaaaaaah! I think I know... Must be because of `+='. + +Hm... No. Indeed we transform + + | FOO = foo + | if BAR + | FOO += BAR + | endif + +into + + | @BAR_TRUE@FOO = foo bar + | @BAR_FALSE@FOO = foo + +but this seems good to me too? + + | FOO = foo $(BAR_FOO) + | @BAR_TRUE@BAR_FOO = bar + | @BAR_FALSE@BAR_FOO = + + + + 2001-04-09 Akim Demaille * automake.in ($source_suffix_pattern): Remove, unused. diff --git a/automake.in b/automake.in index 0101fa8c..0434bb65 100755 --- a/automake.in +++ b/automake.in @@ -1431,8 +1431,6 @@ sub handle_single_transform_list ($$$@) my $base = $2; my $extension = $3; - my $xbase = $base; - # We must generate a rule for the object if it requires # its own flags. my $rule = ''; @@ -1522,7 +1520,6 @@ sub handle_single_transform_list ($$$@) if ($r == $LANG_SUBDIR && $directory ne '') { $object = $directory . '/' . $object; - $xbase = $directory . '/' . $base; } # If doing dependency tracking, then we can't print @@ -1768,7 +1765,6 @@ sub handle_source_transform sub handle_lib_objects { my ($xname, $var, $lex_seen) = @_; - my $ret; &prog_error ("handle_lib_objects: $var undefined") if ! &variable_defined ($var); @@ -1776,23 +1772,14 @@ sub handle_lib_objects &prog_error ("handle_lib_objects: lex_seen and $var =~ /LIBADD/") if $lex_seen && $var =~ /LIBADD/; - my @conds = &variable_conditions ($var); - if (! @conds) - { - $ret = &handle_lib_objects_cond ($xname, $var, $lex_seen, ''); - } - else - { - $ret = 0; - foreach my $cond (@conds) - { - if (&handle_lib_objects_cond ($xname, $var, $lex_seen, $cond)) - { - $ret = 1; - } - } - } - + my $ret = 0; + foreach my $cond (&variable_conditions ($var)) + { + if (&handle_lib_objects_cond ($xname, $var, $lex_seen, $cond)) + { + $ret = 1; + } + } return $ret; } @@ -5594,18 +5581,29 @@ sub macro_define ($$$$$$) } -# &variable_delete ($VAR) -# ----------------------- -# Forget about a variable. -sub variable_delete ($) +# &variable_delete ($VAR, [@CONDS]) +# --------------------------------- +# Forget about $VAR under the conditions @CONDS, or completely if +# @CONDS is empty. +sub variable_delete ($@) { - my ($var) = @_; + my ($var, @conds) = @_; - delete $var_value{$var}; - delete $var_line{$var}; - delete $var_is_am{$var}; - delete $var_comment{$var}; - delete $var_type{$var}; + if (!@conds) + { + delete $var_value{$var}; + delete $var_line{$var}; + delete $var_is_am{$var}; + delete $var_comment{$var}; + delete $var_type{$var}; + } + else + { + foreach my $cond (@conds) + { + delete $var_value{$var}{$cond}; + } + } } -- 2.43.5