[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: $(eval ) and $(shell )
From: |
CHEN Cheng |
Subject: |
Re: $(eval ) and $(shell ) |
Date: |
Fri, 3 Jul 2009 14:03:49 +0800 |
User-agent: |
Mutt/1.5.17 (2007-11-01) |
On Fri, Jul 03, 2009 at 02:55:53PM +1000, address@hidden wrote:
> Could someone explain me the actual evaluation order of variables and
> how $, $$, $(value ), $(eval ), $(call ) and $(shell ) operate?
>
> Reading the info page of $(eval ) gave me the impression that it gets its
> argument, evaluates it once then parses the resulting text as makfile
> source (and interprets it). Obviously that's a rather naive assumption and
> make is doing something more sophisticated. I'd appreciate if someone
> could tell me what or at least directed me towards some docs (other than
> the source of make).
>
IMHO, there are three passes in the whole make process:
1. eval pass, in which evals are expanded.
In the first case, your makefile is expanded as:
all: foo
foo: Makefile
@echo "start"
@echo "shell is <" ">"
# error occurred above, because expansion of $(VAR) calls $(shell ...),
# which is an no-existent-command
@echo "end"
In the second case, your makefile is expanded as:
all: foo
foo: Makefile
@echo "start"
@echo "shell is <" $(shell no-existent-command) ">"
@echo "end"
2. substitution pass, in which variables (and ifdef, etc.) are expanded.
In the first case, your makefile is expanded as:
all: foo
foo: Makefile
@echo "start"
@echo "shell is <" ">"
@echo "end"
In the second case, your makefile is expanded as:
all: foo
foo: Makefile
@echo "start"
@echo "shell is <" ">"
#error generated in the above command while expanding $(shell ...)
@echo "end"
3. real make pass, in which targets are built consequently.
However, the above description is kind of oversimplified, e.g. target-
specific variables are not discussed.
Hope it helps.
-Cheng