Puzzling variables behaviour in make(1)
Ruslan Ermilov
ru at freebsd.org
Sun Nov 5 21:14:34 UTC 2006
On Sun, Nov 05, 2006 at 09:04:47PM +0100, Jeremie Le Hen wrote:
> Hello,
>
> I wrote the following piece of Makefile:
>
> % .warning "VAR contains: ${VAR}"
> %
> % VAR_BACKUP:= ${VAR}
> % VAR:= value2
> %
> % .if ${VAR} == "value2"
> % .warning "VAR is overwritable: ${VAR}"
> % .else
> % .warning "VAR is NOT overwritable: ${VAR}"
> % .endif
> %
> % VAR:= ${VAR_BACKUP}
> %
> % all:
>
> If I define VAR within the Makefile (VAR:= value1), I get:
> % jarjarbinks:~/test/makevars:230# make
> % "Makefile", line 3: warning: "VAR contains: value1"
> % "Makefile", line 7: warning: "VAR is overwritable: value2"
>
> If I remove the VAR assignment in the Makefile and define it from
> the command -line, I get:
> % jarjarbinks:~/test/makevars:232# make VAR=value1
> % "Makefile", line 3: warning: "VAR contains: value1"
> % "Makefile", line 9: warning: "VAR is NOT overwritable: value2"
>
> Note that this behaviour is puzzling since it follows the path as if
> {VAR} didn't contain "value2" but the warning message shows it does
> contains "value2".
>
> Finally, if I define VAR both from the command-line and within the
> Makefile:
> % jarjarbinks:~/test/makevars:242# make VAR=value1
> % "Makefile", line 3: warning: "VAR contains: value1"
> % "Makefile", line 11: warning: "VAR is NOT overwritable: value2"
>
> Same weird behaviour.
>
>
> Actually I am trying to find a way to tell whether a variable has
> been defined from make.conf(5) or src.conf(5) or from the command-line.
> According to the code path this method appears to work, but the
> value of ${VAR} isn't "correct".
>
>
> If this is the expected behaviour, I'd be glad to understand the magic
> behind this.
>
Command-line variables are of the highest precedence.
%%%
Index: parse.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/make/parse.c,v
retrieving revision 1.111
diff -u -p -r1.111 parse.c
--- parse.c 22 Jul 2006 14:00:31 -0000 1.111
+++ parse.c 5 Nov 2006 21:09:51 -0000
@@ -2231,7 +2231,7 @@ parse_message(char *line, int iserror, i
while (isspace((u_char)*line))
line++;
- line = Buf_Peel(Var_Subst(line, VAR_GLOBAL, FALSE));
+ line = Buf_Peel(Var_Subst(line, VAR_CMD, FALSE));
Parse_Error(iserror ? PARSE_FATAL : PARSE_WARNING, "%s", line);
free(line);
%%%
Cheers,
--
Ruslan Ermilov
ru at FreeBSD.org
FreeBSD committer
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20061105/d0dc16b5/attachment.pgp
More information about the freebsd-hackers
mailing list