Thu 10 Feb 2005 12:38:05 AM UTC, original submission:
When processing 'target: var := varvalue', make380/381b doesnt use the "current" variable set while computing var's new value. E.g. take '$(e)target: e := $(e)', then the 1st $(e) uses the current variable set, but the 2nd $(e) may take a wrong one.
#------sample makefile-----------
.PHONY: all
all: ;
e := E1
$(warning e = $(e))
.PHONY: $(e)Target
all: $(e)Target
$(e)Target: e := $(e)
$(e)Target: ; @echo Making target $@ //"e" = "$(e)"
e := E2
define mkRuleForE
$(warning Inside function mkRuleForE: e = $(e))
.PHONY: $(e)Target
all: $(e)Target
$(e)Target: e := $(e)
$(e)Target: ; @echo Making target $@ //"e" = "$(e)"
endef
e := E3
$(foreach e,e2 e3,$(warning Test run of foreach: e = $(e)))
$(foreach e,e2 e3,$(eval $(value mkRuleForE)))
e := E4
#------sample makefile-end----------
Running make should now result in ...
Making target E1Target //e = E1
Making target e2Target //e = e2
Making target e3Target //e = e3
... but the actual result with all my 380|381beta1 is ...
Making target E1Target //e = E1
Making target e2Target //e = E3
Making target e3Target //e = E3
Workaround, e.g. inside the above makfile: make sure to use only global variables inside such definitions of target specific variable =>
define mkRuleForE
e := $x
# Assign from local var 'x' to global var 'e'.
# Now only use global var:
$(e)Target: e := $(e)
endef
....
$(foreach x,e2 e3,$(eval $(value mkRuleForE)))
|