> VAR become foo when the "var1" rule was executed. > it reevaluates because of the explicit "make" commands in the "all" rule.
Think about the order in which those two things happen. The second one happens before the first and hence doesn't see the first's effect. A thought experiment might help you to see the light. Imagine in the "all" rule, that instead of running "make var1", you ran "a-script-which-happens-to-invoke-make-var1". -----Original Message----- From: Szekeres István [mailto:szeke...@iii.hu] Sent: Thursday, May 07, 2009 14:40 To: Martin Dorey Cc: bug-make@gnu.org Subject: Re: conditionals not working for conditional variables in sub-make? 2009/5/7 Martin Dorey <mdo...@bluearc.com>: >> But here VAR2 should be "foo"! > > No, it shouldn't, for exactly the same reason that VAR2 isn't foo here: > > mart...@whitewater:~/tmp/bug-make-2009-05-07$ make var1 > VAR=foo VAR2=bar VAR3=foo > mart...@whitewater:~/tmp/bug-make-2009-05-07$ > > Despite the number of exclamation marks, it's not clear why you think VAR2 > should be foo. See "Target specific variables" in the make info. In my example the "var1" rule sets VAR to "foo" (correctly), the "var2" rule sets it to "bar" (correctly). > Do you think VAR was foo when make was started? No. VAR become foo when the "var1" rule was executed. > Or do you think that make reevaluates all the code at global scope in the > context of every target? No, it reevaluates because of the explicit "make" commands in the "all" rule. The "var1" rule sets VAR to foo, and VAR3 is set to $(VAR) globally, and this works correctly, you can see this even in your own output: mart...@whitewater:~/tmp/bug-make-2009-05-07$ make make var1 make[1]: Entering directory `/home/martind/tmp/bug-make-2009-05-07' VAR=foo VAR2=bar VAR3=foo VAR is foo and VAR3 is also foo, correct. make[1]: Leaving directory `/home/martind/tmp/bug-make-2009-05-07' make var2 make[1]: Entering directory `/home/martind/tmp/bug-make-2009-05-07' VAR=bar VAR2=bar VAR3=bar VAR is bar and VAR3 is also bar, correct. The problem is the value of VAR2: in the first case it should be "foo", because the if statement ifeq ($(VAR),foo) VAR2=foo else VAR2=bar endif should compare $(VAR) (which is "foo" in the first case) to "foo" - they are the same so the then-branch should be executed, setting VAR2 to foo. But in the output you can see that VAR2 is not set to foo, and this is what I reported in my very first mail. _______________________________________________ Bug-make mailing list Bug-make@gnu.org http://lists.gnu.org/mailman/listinfo/bug-make