Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

make - define multiple variables in the same eval call

Tags:

makefile

eval

I would like to use make's eval function to define several (dynamically-named) variables inside a foreach, but I can't get eval to do this job.

I tried something like this:

$(eval \
    var1 = val1 \
    var2 = val2 \
)

It doesn't work: var1 gets defined as val1 var2 = val2 and var2 is not defined. It makes sense, because I put \ at the end of the second line. But if I remove it, the eval call will never be terminated.

I tried different things to have this \ only seen by eval, but nothing did the trick. Hence the question: is it possible to define multiple variables in the same eval call ?

Of course I could call eval twice... it's rather curiosity.

like image 487
lephe Avatar asked Jul 06 '16 12:07

lephe


2 Answers

What separates each variable definition is the newline character, which you are escaping with the backslash. Since you cannot put it directly in the eval function, you have to define it and to use it into eval like this :

define newline


endef

Then if you place the following lines inside a target :

$(eval FOO=abc$(newline)BAR=def)
@echo FOO : $(FOO) BAR : $(BAR)

You will have this result :

FOO : abc BAR : def

Note that if you want to use a variable in the definition of the second one you have to escape the $ character like this :

$(eval FOO=abc$(newline)BAR=def$$(FOO))
@echo FOO : $(FOO) BAR : $(BAR)

The result will eventually be :

FOO : abc BAR : defabc

This is due to the fact that there is a first level of interpretation before that eval actually begins to do its work (the newline is added here) but we want the interpretation of the variable to occur only during the real eval work, when the variable is defined, which is why we need a double $ symbol.

like image 80
Tim Avatar answered Nov 14 '22 15:11

Tim


Simply use the foreach:

oneline = FOO=abc BAR=def XX=...
$(foreach line,$(oneline),$(eval $(line)))
$(info $(FOO) $(BAR))

The result:

abc def
like image 35
tonado Avatar answered Nov 14 '22 14:11

tonado