bin/68534: make(1) - ${.MAKEFLAGS} does not contain cmd line
args
Ruslan Ermilov
ru at FreeBSD.org
Thu Jul 1 02:10:51 PDT 2004
The following reply was made to PR bin/68534; it has been noted by GNATS.
From: Ruslan Ermilov <ru at FreeBSD.org>
To: John E Hein <jhein at timing.com>
Cc: bug-followup at FreeBSD.org
Subject: Re: bin/68534: make(1) - ${.MAKEFLAGS} does not contain cmd line args
Date: Thu, 1 Jul 2004 12:05:57 +0300
On Thu, Jul 01, 2004 at 01:30:10AM +0000, John E Hein wrote:
>
> This is interesting env var precedence weirdness...
>
> $ cat Makefile
> FOO?=0
> X?=0
> .PHONY: x
> x:
> @echo MAKEFLAGS: ${MAKEFLAGS}
> @echo .MAKEFLAGS: ${.MAKEFLAGS}
> @echo FOO: ${FOO}
> .if $X != 1
> make X=1
> .endif
>
> $ env FOO=1 MAKEFLAGS=FOO=3 make FOO=2
> MAKEFLAGS: FOO=3
> .MAKEFLAGS:
> FOO: 2
>
As documented, MAKEFLAGS value (FOO=3) is parsed just like
if it were a part of the command line, so this is equivalent
to ``env FOO=1 make FOO=3 FOO=2'', so `2' is printed.
> make X=1
> MAKEFLAGS: FOO=3
> .MAKEFLAGS:
> FOO: 3
>
Now, we just call ``make'' with FOO=2 and MAKEFLAGS=FOO=3 in
environment. New make parses MAKEFLAGS, so this becomes
equivalent to ``env FOO=2 make FOO=3'', so `3' is printed.
> $ env FOO=1 make FOO=2
> MAKEFLAGS:
> .MAKEFLAGS:
> FOO: 2
>
Here, `2' is printed, and FOO is entered into environment
with value 2.
> make X=1
> MAKEFLAGS:
> .MAKEFLAGS:
> FOO: 2
>
Here, ${FOO} is fetched from the environment with value 2.
> In the first case FOO=3 is inserted in the environment by make via
> MAKEFLAGS.
>
Not quite. What's in environment is FOO=2 and MAKEFLAGS=FOO=3
(see above).
> In the second case FOO=1 is inserted in the environment in a more
> generic way.
>
And then FOO=2 causes FOO in environment to be reset to `2'.
> Why does FOO=2 (the cmd line variable) override FOO in the environment
> in the first case, but not the second? I'm going to have a look in
> the source.
>
I don't quite understand what you're asking, but I hope my
explanations answer this. ;)
> And finally...
>
> $ env FOO=1 make -E FOO FOO=2
> MAKEFLAGS: -E FOO
> .MAKEFLAGS: -E FOO
> FOO: 2
>
Here, you say to prefer environment variable FOO over global
FOO (there's no global FOO, FOO?=0). Then, FOO=2 is parsed
and FOO in environment is re-assigned the value of 2, and
it's what gets printed.
> make X=1
> MAKEFLAGS: -E FOO
> .MAKEFLAGS: -E FOO
> FOO: 2
>
Here, we just print FOO from environment, which is `2'.
> Whoa, wait a second. There's some stuff from the command line
> in MAKEFLAGS now.
>
Like I said in another email, only variable=value is not saved
in MAKEFLAGS.
Cheers,
--
Ruslan Ermilov
ru at FreeBSD.org
FreeBSD committer
More information about the freebsd-bugs
mailing list