Module Name:    src
Committed By:   sjg
Date:           Sat Jun  1 06:26:36 UTC 2024

Modified Files:
        src/usr.bin/make: make.1 make.h parse.c var.c
        src/usr.bin/make/unit-tests: directive-export.exp directive-export.mk
            export-all.mk

Log Message:
make: add .export-all

An explicit syntax for exporting all global variables is much safer
than allowing .export with no argument to do the same.

Add .export-all and have .export with no argument throw a warning saying
to use .export-all

Reviewed by: rillig


To generate a diff of this commit:
cvs rdiff -u -r1.376 -r1.377 src/usr.bin/make/make.1
cvs rdiff -u -r1.336 -r1.337 src/usr.bin/make/make.h
cvs rdiff -u -r1.728 -r1.729 src/usr.bin/make/parse.c
cvs rdiff -u -r1.1116 -r1.1117 src/usr.bin/make/var.c
cvs rdiff -u -r1.6 -r1.7 src/usr.bin/make/unit-tests/directive-export.exp
cvs rdiff -u -r1.10 -r1.11 src/usr.bin/make/unit-tests/directive-export.mk
cvs rdiff -u -r1.5 -r1.6 src/usr.bin/make/unit-tests/export-all.mk

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/make/make.1
diff -u src/usr.bin/make/make.1:1.376 src/usr.bin/make/make.1:1.377
--- src/usr.bin/make/make.1:1.376	Tue May 28 19:09:04 2024
+++ src/usr.bin/make/make.1	Sat Jun  1 06:26:36 2024
@@ -1,4 +1,4 @@
-.\"	$NetBSD: make.1,v 1.376 2024/05/28 19:09:04 sjg Exp $
+.\"	$NetBSD: make.1,v 1.377 2024/06/01 06:26:36 sjg Exp $
 .\"
 .\" Copyright (c) 1990, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"	from: @(#)make.1	8.4 (Berkeley) 3/19/94
 .\"
-.Dd May 28, 2024
+.Dd June 1, 2024
 .Dt MAKE 1
 .Os
 .Sh NAME
@@ -1960,12 +1960,7 @@ The directives for exporting and unexpor
 .Bl -tag -width Ds
 .It Ic .export Ar variable No ...
 Export the specified global variable.
-If no variable list is provided, all globals are exported
-except for internal variables (those that start with
-.Ql \&. ) .
-This is not affected by the
-.Fl X
-flag, so should be used with caution.
+.Pp
 For compatibility with other make programs,
 .Cm export Ar variable\| Ns Cm \&= Ns Ar value
 (without leading dot) is also accepted.
@@ -1973,6 +1968,12 @@ For compatibility with other make progra
 Appending a variable name to
 .Va .MAKE.EXPORTED
 is equivalent to exporting a variable.
+.It Ic .export-all
+Export all globals except for internal variables (those that start with
+.Ql \&. ) .
+This is not affected by the
+.Fl X
+flag, so should be used with caution.
 .It Ic .export-env Ar variable No ...
 The same as
 .Ql .export ,

Index: src/usr.bin/make/make.h
diff -u src/usr.bin/make/make.h:1.336 src/usr.bin/make/make.h:1.337
--- src/usr.bin/make/make.h:1.336	Sat Jun  1 05:08:48 2024
+++ src/usr.bin/make/make.h	Sat Jun  1 06:26:36 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: make.h,v 1.336 2024/06/01 05:08:48 rillig Exp $	*/
+/*	$NetBSD: make.h,v 1.337 2024/06/01 06:26:36 sjg Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -992,6 +992,8 @@ typedef enum VarSetFlags {
 } VarSetFlags;
 
 typedef enum VarExportMode {
+	/* .export-all */
+	VEM_ALL,
 	/* .export-env */
 	VEM_ENV,
 	/* .export: Initial export or update an already exported variable. */

Index: src/usr.bin/make/parse.c
diff -u src/usr.bin/make/parse.c:1.728 src/usr.bin/make/parse.c:1.729
--- src/usr.bin/make/parse.c:1.728	Fri May 31 05:50:11 2024
+++ src/usr.bin/make/parse.c	Sat Jun  1 06:26:36 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.c,v 1.728 2024/05/31 05:50:11 rillig Exp $	*/
+/*	$NetBSD: parse.c,v 1.729 2024/06/01 06:26:36 sjg Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -105,7 +105,7 @@
 #include "pathnames.h"
 
 /*	"@(#)parse.c	8.3 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: parse.c,v 1.728 2024/05/31 05:50:11 rillig Exp $");
+MAKE_RCSID("$NetBSD: parse.c,v 1.729 2024/06/01 06:26:36 sjg Exp $");
 
 /* Detects a multiple-inclusion guard in a makefile. */
 typedef enum {
@@ -2759,6 +2759,8 @@ ParseDirective(char *line)
 		Var_Undef(arg);
 	else if (Substring_Equals(dir, "export"))
 		Var_Export(VEM_PLAIN, arg);
+	else if (Substring_Equals(dir, "export-all"))
+		Var_Export(VEM_ALL, arg);
 	else if (Substring_Equals(dir, "export-env"))
 		Var_Export(VEM_ENV, arg);
 	else if (Substring_Equals(dir, "export-literal"))

Index: src/usr.bin/make/var.c
diff -u src/usr.bin/make/var.c:1.1116 src/usr.bin/make/var.c:1.1117
--- src/usr.bin/make/var.c:1.1116	Sat Jun  1 05:08:48 2024
+++ src/usr.bin/make/var.c	Sat Jun  1 06:26:36 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.1116 2024/06/01 05:08:48 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.1117 2024/06/01 06:26:36 sjg Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -132,7 +132,7 @@
 #include "metachar.h"
 
 /*	"@(#)var.c	8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1116 2024/06/01 05:08:48 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1117 2024/06/01 06:26:36 sjg Exp $");
 
 /*
  * Variables are defined using one of the VAR=value assignments.  Their
@@ -838,9 +838,12 @@ ExportVarsExpand(const char *uvarnames, 
 void
 Var_Export(VarExportMode mode, const char *varnames)
 {
-	if (mode == VEM_PLAIN && varnames[0] == '\0') {
+	if (mode == VEM_ALL) {
 		var_exportedVars = VAR_EXPORTED_ALL; /* use with caution! */
 		return;
+	} else if (mode == VEM_PLAIN && varnames[0] == '\0') {
+		Parse_Error(PARSE_WARNING, ".export requires an argument.");
+		return;
 	}
 
 	ExportVarsExpand(varnames, true, mode);

Index: src/usr.bin/make/unit-tests/directive-export.exp
diff -u src/usr.bin/make/unit-tests/directive-export.exp:1.6 src/usr.bin/make/unit-tests/directive-export.exp:1.7
--- src/usr.bin/make/unit-tests/directive-export.exp:1.6	Sun Nov 19 09:45:19 2023
+++ src/usr.bin/make/unit-tests/directive-export.exp	Sat Jun  1 06:26:36 2024
@@ -1,4 +1,5 @@
-make: "directive-export.mk" line 56: 00:00:00
-make: "directive-export.mk" line 61: 00:00:00
-make: "directive-export.mk" line 64: 16:00:00
+make: "directive-export.mk" line 33: warning: .export requires an argument.
+make: "directive-export.mk" line 57: 00:00:00
+make: "directive-export.mk" line 62: 00:00:00
+make: "directive-export.mk" line 65: 16:00:00
 exit status 0

Index: src/usr.bin/make/unit-tests/directive-export.mk
diff -u src/usr.bin/make/unit-tests/directive-export.mk:1.10 src/usr.bin/make/unit-tests/directive-export.mk:1.11
--- src/usr.bin/make/unit-tests/directive-export.mk:1.10	Sun Nov 19 09:45:19 2023
+++ src/usr.bin/make/unit-tests/directive-export.mk	Sat Jun  1 06:26:36 2024
@@ -1,4 +1,4 @@
-# $NetBSD: directive-export.mk,v 1.10 2023/11/19 09:45:19 rillig Exp $
+# $NetBSD: directive-export.mk,v 1.11 2024/06/01 06:26:36 sjg Exp $
 #
 # Tests for the .export directive.
 #
@@ -28,7 +28,8 @@ VAR=		value $$ ${INDIRECT}
 .  error
 .endif
 
-# No syntactical argument means to export all variables.
+# No syntactical argument used to mean export all variables.
+# Since var.c 1.1117 2024/06/01 it causes a warning.
 .export
 
 # An empty argument means no additional variables to export.

Index: src/usr.bin/make/unit-tests/export-all.mk
diff -u src/usr.bin/make/unit-tests/export-all.mk:1.5 src/usr.bin/make/unit-tests/export-all.mk:1.6
--- src/usr.bin/make/unit-tests/export-all.mk:1.5	Sat Oct 24 08:50:17 2020
+++ src/usr.bin/make/unit-tests/export-all.mk	Sat Jun  1 06:26:36 2024
@@ -1,4 +1,4 @@
-# $NetBSD: export-all.mk,v 1.5 2020/10/24 08:50:17 rillig Exp $
+# $NetBSD: export-all.mk,v 1.6 2024/06/01 06:26:36 sjg Exp $
 
 UT_OK=	good
 UT_F=	fine
@@ -15,7 +15,7 @@ UT_BADDIR=	${${here}/../${here:T}:L:${M_
 # this will be ok
 UT_OKDIR=	${${here}/../${here:T}:L:${M_tA}:T}
 
-.export
+.export-all
 
 FILTER_CMD=	grep ^UT_
 .include "export.mk"

Reply via email to