Module Name: src
Committed By: rillig
Date: Sun Nov 19 09:45:19 UTC 2023
Modified Files:
src/usr.bin/make: var.c
src/usr.bin/make/unit-tests: directive-export-gmake.exp
directive-export-gmake.mk directive-export.exp directive-export.mk
Log Message:
tests/make: test and explain exporting of variables
To generate a diff of this commit:
cvs rdiff -u -r1.1069 -r1.1070 src/usr.bin/make/var.c
cvs rdiff -u -r1.5 -r1.6 \
src/usr.bin/make/unit-tests/directive-export-gmake.exp \
src/usr.bin/make/unit-tests/directive-export.exp
cvs rdiff -u -r1.7 -r1.8 \
src/usr.bin/make/unit-tests/directive-export-gmake.mk
cvs rdiff -u -r1.9 -r1.10 src/usr.bin/make/unit-tests/directive-export.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/var.c
diff -u src/usr.bin/make/var.c:1.1069 src/usr.bin/make/var.c:1.1070
--- src/usr.bin/make/var.c:1.1069 Sat Nov 18 20:19:08 2023
+++ src/usr.bin/make/var.c Sun Nov 19 09:45:19 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.1069 2023/11/18 20:19:08 rillig Exp $ */
+/* $NetBSD: var.c,v 1.1070 2023/11/19 09:45:19 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -139,7 +139,7 @@
#include "metachar.h"
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1069 2023/11/18 20:19:08 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1070 2023/11/19 09:45:19 rillig Exp $");
/*
* Variables are defined using one of the VAR=value assignments. Their
@@ -615,13 +615,8 @@ ExportVarEnv(Var *v)
return true;
}
- if (v->inUse) {
- /*
- * We recursed while exporting in a child.
- * This isn't going to end well, just skip it.
- */
- return false;
- }
+ if (v->inUse)
+ return false; /* see EMPTY_SHELL in directive-export.mk */
/* XXX: name is injected without escaping it */
expr = str_concat3("${", name, "}");
Index: src/usr.bin/make/unit-tests/directive-export-gmake.exp
diff -u src/usr.bin/make/unit-tests/directive-export-gmake.exp:1.5 src/usr.bin/make/unit-tests/directive-export-gmake.exp:1.6
--- src/usr.bin/make/unit-tests/directive-export-gmake.exp:1.5 Sun Aug 20 20:48:32 2023
+++ src/usr.bin/make/unit-tests/directive-export-gmake.exp Sun Nov 19 09:45:19 2023
@@ -1,5 +1,6 @@
make: "directive-export-gmake.mk" line 71: Invalid line 'export VAR=${:U1}', expanded to 'export VAR=1'
make: "directive-export-gmake.mk" line 85: 16:00:00
+make: "directive-export-gmake.mk" line 92: Variable/Value missing from "export"
make: Fatal errors encountered -- cannot continue
make: stopped in unit-tests
exit status 1
Index: src/usr.bin/make/unit-tests/directive-export.exp
diff -u src/usr.bin/make/unit-tests/directive-export.exp:1.5 src/usr.bin/make/unit-tests/directive-export.exp:1.6
--- src/usr.bin/make/unit-tests/directive-export.exp:1.5 Sun Aug 20 20:48:32 2023
+++ src/usr.bin/make/unit-tests/directive-export.exp Sun Nov 19 09:45:19 2023
@@ -1,4 +1,4 @@
-make: "directive-export.mk" line 50: 00:00:00
-make: "directive-export.mk" line 55: 00:00:00
-make: "directive-export.mk" line 58: 16:00:00
+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
exit status 0
Index: src/usr.bin/make/unit-tests/directive-export-gmake.mk
diff -u src/usr.bin/make/unit-tests/directive-export-gmake.mk:1.7 src/usr.bin/make/unit-tests/directive-export-gmake.mk:1.8
--- src/usr.bin/make/unit-tests/directive-export-gmake.mk:1.7 Sun Aug 20 20:48:32 2023
+++ src/usr.bin/make/unit-tests/directive-export-gmake.mk Sun Nov 19 09:45:19 2023
@@ -1,4 +1,4 @@
-# $NetBSD: directive-export-gmake.mk,v 1.7 2023/08/20 20:48:32 rillig Exp $
+# $NetBSD: directive-export-gmake.mk,v 1.8 2023/11/19 09:45:19 rillig Exp $
#
# Tests for the export directive (without leading dot), as in GNU make.
@@ -83,3 +83,24 @@ INDIRECT_TZ= ${:UAmerica/Los_Angeles}
export TZ=${INDIRECT_TZ}
# expect+1: 16:00:00
.info ${%T:L:localtime=86400}
+
+
+# The '=' must be present in the unexpanded line, it cannot be generated by
+# an expression.
+EQ= =
+# expect+1: Variable/Value missing from "export"
+export EQ_VAR${EQ}eq-value
+.if ${:!env!:MEQ_VAR=*}
+. error
+.endif
+
+
+# The variable name must be given directly, it is not expanded. The name of
+# the exported variable thus starts with a '$', and that name may be filtered
+# out by the platform.
+INDIRECT_NAME= I_NAME
+INDIRECT_VALUE= indirect value
+export ${INDIRECT_NAME}=${INDIRECT_VALUE}
+.if ${:!env!:MI_NAME=*}
+. error
+.endif
Index: src/usr.bin/make/unit-tests/directive-export.mk
diff -u src/usr.bin/make/unit-tests/directive-export.mk:1.9 src/usr.bin/make/unit-tests/directive-export.mk:1.10
--- src/usr.bin/make/unit-tests/directive-export.mk:1.9 Sun Aug 20 20:48:32 2023
+++ src/usr.bin/make/unit-tests/directive-export.mk Sun Nov 19 09:45:19 2023
@@ -1,4 +1,4 @@
-# $NetBSD: directive-export.mk,v 1.9 2023/08/20 20:48:32 rillig Exp $
+# $NetBSD: directive-export.mk,v 1.10 2023/11/19 09:45:19 rillig Exp $
#
# Tests for the .export directive.
#
@@ -35,7 +35,13 @@ VAR= value $$ ${INDIRECT}
.export ${:U}
-# Trigger the "This isn't going to end well" in ExportVarEnv.
+# Before a child process is started, whether for the '!=' assignment operator
+# or for the ':sh' modifier, all variables that were marked for being exported
+# are expanded and then exported. If expanding such a variable requires
+# running a child command, the marked-as-exported variables would need to be
+# exported first, ending in an endless loop. To avoid this endless loop,
+# don't export the variables while preparing a child process, see
+# ExportVarEnv.
EMPTY_SHELL= ${:sh}
.export EMPTY_SHELL # only marked for export at this point
_!= :;: # Force the variable to be actually exported.