Calling $(eval) within $(eval) can lead to very unintuitive (at least to me
:) behavior. In particular, the inner $(eval) is expanded *and* executed
during the expansion of the outer $(eval). For instance (I've also attached
this example, since my email client mangled the tabs in the code below):
define func2
MY_FUNC2_VAR := $$(SOME_VALUE)
all::
@echo "Here2: $$(MY_FUNC2_VAR)"
endef
define func3
MY_FUNC3_VAR := $$(SOME_VALUE)
all::
@echo "Here3: $$(MY_FUNC2_VAR)"
endef
define func1
SOME_VALUE := 1
MY_FUNC1_VAR := $$(SOME_VALUE)
all::
@echo "Here1: $$(MY_FUNC1_VAR)"
$(eval $(call func2))
ifndef SOME_VALUE
$(eval $(call func3))
endif
endef
$(eval $(call func1))
all::
Running gmake (3.81) on this yields:
Here2:
Here3:
Here1: 1
The execution of the inner $(eval)s before the execution of the outer
$(eval) means that:
1.) SOME_VALUE is not defined when either func2 or func3 is executed.
2.) func3 is expanded and executed despite being within a conditional that
never will be true.
After encountering this, I looked this up in the O'Reilly gmake book (
http://www.amazon.com/Managing-Projects-Make-Nutshell-Handbooks/dp/0596006101),
and, while it did discuss it, it presented this behavior as a feature (since
with it one can force early evaluation of code with an $(eval) inside an
$(eval)).
Unfortunately, $$(eval) causes gmake to die, so there does not appear to be
any way to use $(eval) within $(eval) so that it executes within the flow of
the outer $(eval)'s execution. Is there any way to do this? One work
around that I have thought of is to simply put the inner eval's function
contents within a file and include the file... Are there any plans to have
some kind of $$(eval) mechanism that would defer execution inside $(eval)?
Additionally, perhaps the current $(eval) within $(eval) behavior should be
documented in the gmake manual, since it really can take one by surprise the
first time that it is encountered (unless it already is documented, and I
missed it :). Thank you.
Tony
define func2
MY_FUNC2_VAR := $$(SOME_VALUE)
all::
@echo "Here2: $$(MY_FUNC2_VAR)"
endef
define func3
MY_FUNC3_VAR := $$(SOME_VALUE)
all::
@echo "Here3: $$(MY_FUNC2_VAR)"
endef
define func1
SOME_VALUE := 1
MY_FUNC1_VAR := $$(SOME_VALUE)
all::
@echo "Here1: $$(MY_FUNC1_VAR)"
$(eval $(call func2))
ifndef SOME_VALUE
$(eval $(call func3))
endif
endef
$(eval $(call func1))
all::
_______________________________________________
Bug-make mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/bug-make