bug-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Expansion of $(eval..)


From: Paul Smith
Subject: Re: Expansion of $(eval..)
Date: Sat, 22 Jan 2022 09:27:17 -0500
User-agent: Evolution 3.36.5-0ubuntu1

On Sat, 2022-01-22 at 13:59 +0100, Gisle Vanem wrote:
>    define add_c_src> 
>      VPATH += $(1)
>      C_SRC += $(addprefix $(1)/, $(2))
>      $(info Number of 'C_SRC': $(words $(C_SRC)))
>    endef
> 
>    $(eval $(call add_c_src, frmts/ceos, ceosopen.c))
>    $(eval $(call add_c_src, frmts/ceos2, ceos.c ceosrecipe.c ceossar.c))
> 
>    # ... plus a lot more
> 
> But I'm curious about how this gets expanded

It gets expanded identically to every other variable or function: left
to right, but from the inside out.

In this case you have two functions: $(info ...) and inside that you
have $(call ...).  Since $(call ...) is the inner function it's
expanded first.

That means the "first level" of expansion happens before eval is
invoked, and the variable is simply expanded as a text string with no
knowledge of makefile constructs.  Replacing $(1), running the
$(addprefix ..), AND RUNNING THE $(info ...) all happens here because
these are all simple references.

So the info is invoked by call before any of the variables are assigned
(because the assign is done by eval), then the result of that expansion
is handed to eval to evaluate.

You can figure out what eval will see by replacing it with info, like
this:

  $(info $(call add_c_src, frmts/ceos, ceosopen.c))

Now this will print the text that is passed to eval to be evaluated.

You probably want to escape the non-argument references, so that call
will not run them and instead they will be passed to eval:

   define add_c_src
     VPATH += $(1)
     C_SRC += $$(addprefix $(1)/, $(2))
     $$(info Number of 'C_SRC': $$(words $$(C_SRC)))
   endef





reply via email to

[Prev in Thread] Current Thread [Next in Thread]