Follow-up Comment #1, bug #54703 (project make):

Hello.

This is not a bug.

Argument of eval is always expanded prior evalation.

Let's see how this works.

---------

ITERATIONS:=1 2 3
ACCUMULATOR:=Macron go home :

WORD_1:=Macron
WORD_2:=go
WORD_3:=home

define ACCUMULATE
WORD:=$(WORD_$(1))
ACCUMULATOR:=$(ACCUMULATOR) $(WORD)
endef

$(foreach ITERATION,$(ITERATIONS),$(eval $(call ACCUMULATE,$(ITERATION))))

---------

* The first foreach iteration is expanded as:

WORD:=Macron
ACCUMULATOR:=Macron go home : <empty>

then evaluated

* second iteration is expanded as:

WORD:=go
ACCUMULATOR:=Macron go home : Macron

then evaluated

* third iteration is expanded as:

WORD:=home
ACCUMULATOR:=Macron go home : Macron go

and then evaluated.

-------

You need to delay expansion of $(WORD) in the ACCUMULATE until eval:

define ACCUMULATE
WORD:=$(WORD_$(1))
ACCUMULATOR:=$(ACCUMULATOR) $$(WORD)
endef


then, while processing assignment operator :=, eval expands the value a second
time

-------

For debugging, it is handy to trace eval calls, e.g.:


trace_eval = $(info $1)$(eval $1)

$(foreach ITERATION,$(ITERATIONS),$(call trace_eval,$(call
ACCUMULATE,$(ITERATION))))


    _______________________________________________________

Reply to this item at:

  <https://savannah.gnu.org/bugs/?54703>

_______________________________________________
  Message sent via Savannah
  https://savannah.gnu.org/


_______________________________________________
Bug-make mailing list
Bug-make@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-make

Reply via email to