standards/57295: [patch] make does not include cmd line variables in MAKEFLAGS

James E. Flemer jflemer at
Sat Sep 27 14:30:17 PDT 2003

>Number:         57295
>Category:       standards
>Synopsis:       [patch] make does not include cmd line variables in MAKEFLAGS
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-standards
>State:          open
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sat Sep 27 14:30:10 PDT 2003
>Originator:     James E. Flemer
>Release:        FreeBSD 5.1-CURRENT i386
System: FreeBSD 5.1-CURRENT FreeBSD 5.1-CURRENT #1: Sun Sep 14 14:04:37 EDT 2003 jflemer at i386

	The make utility allows variables to be defined on the command
	line with '-D variable' or 'variable=value'.  The MAKEFLAGS variable
	currently only includes the '-D' style definitions.  According to
	the POSIX standard, both should be included.  This issue was
	mentioned on freebsd-hackers about 1.5 years ago[1].  NetBSD fixed
	their make about 2.25 years ago[2], after a few tries.

	[1] Message-ID: <20020413141834.GA16339 at>
	[2] $NetBSD: src/usr.bin/make/var.c,v 1.62 2001/06/09 05:22:47 sjg Exp $
            (and some other files / versions)

	$ cat <<EOF > Makefile
	> default:
	> 	@echo MAKEFLAGS: "$(.MAKEFLAGS)"
	> EOF
	$ make -DFOO BAR=missing

	... after patch ...

	$ make -DFOO BAR=missing

	The patch below seems to Do The Right Thing, at least for simple
	cases.  I am not exactly sure what should be done if the .MAKEFLAGS
	variable is explicitly set by the makefile.  This fix is different
	than the NetBSD fix, since FreeBSD does not have the .MAKEOVERRIDES
	variable.  I am also not sure what the behavior should be when the
	command line is something like: "make 'FOO=$(BAR)'".  This case may
	be what the examples in the NetBSD commit messages are referring to
	when they mention FOO=goo.  I am about a third of the way through a
	buildworld with this patch applied to my make without any problems.

	I would really like to see a fix for this issue committed, to
	facilitate the recording of flags used when building ports.

--- make.diff begins here ---
Index: main.c
RCS file: /home/ncvs/src/usr.bin/make/main.c,v
retrieving revision 1.84
diff -u -u -r1.84 main.c
--- main.c	14 Sep 2003 12:31:33 -0000	1.84
+++ main.c	27 Sep 2003 21:05:11 -0000
@@ -346,8 +346,10 @@
 	 * on the end of the "create" list.
 	for (argv += optind, argc -= optind; *argv; ++argv, --argc)
-		if (Parse_IsVar(*argv))
+		if (Parse_IsVar(*argv)) {
+			Var_Append(MAKEFLAGS, *argv, VAR_GLOBAL);
 			Parse_DoVar(*argv, VAR_CMD);
+		}
 		else {
 			if (!**argv)
 				Punt("illegal (null) argument.");
--- make.diff ends here ---

More information about the freebsd-standards mailing list