Module Name: src
Committed By: rillig
Date: Sun Jun 18 19:16:51 UTC 2023
Modified Files:
src/usr.bin/make/unit-tests: directive-include-guard.exp
directive-include-guard.mk
Log Message:
tests/make: extend test for multiple-inclusion guards
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 \
src/usr.bin/make/unit-tests/directive-include-guard.exp \
src/usr.bin/make/unit-tests/directive-include-guard.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/unit-tests/directive-include-guard.exp
diff -u src/usr.bin/make/unit-tests/directive-include-guard.exp:1.1 src/usr.bin/make/unit-tests/directive-include-guard.exp:1.2
--- src/usr.bin/make/unit-tests/directive-include-guard.exp:1.1 Fri Jun 16 09:25:13 2023
+++ src/usr.bin/make/unit-tests/directive-include-guard.exp Sun Jun 18 19:16:51 2023
@@ -22,4 +22,14 @@ Parse_PushInput: file directive-include-
Parse_PushInput: file directive-include-guard-reuse.tmp, line 1
Parse_PushInput: file directive-include-guard-swapped.tmp, line 1
Parse_PushInput: file directive-include-guard-swapped.tmp, line 1
+Parse_PushInput: file directive-include-guard-undef-between.tmp, line 1
+Parse_PushInput: file directive-include-guard-undef-between.tmp, line 1
+Parse_PushInput: file directive-include-guard-undef-inside.tmp, line 1
+Parse_PushInput: file directive-include-guard-undef-inside.tmp, line 1
+Parse_PushInput: file directive-include-guard-if-elif.tmp, line 1
+Parse_PushInput: file directive-include-guard-if-elif.tmp, line 1
+Parse_PushInput: file directive-include-guard-if-else.tmp, line 1
+Parse_PushInput: file directive-include-guard-if-else.tmp, line 1
+Parse_PushInput: file directive-include-guard-inner-if-elif-else.tmp, line 1
+Parse_PushInput: file directive-include-guard-inner-if-elif-else.tmp, line 1
exit status 0
Index: src/usr.bin/make/unit-tests/directive-include-guard.mk
diff -u src/usr.bin/make/unit-tests/directive-include-guard.mk:1.1 src/usr.bin/make/unit-tests/directive-include-guard.mk:1.2
--- src/usr.bin/make/unit-tests/directive-include-guard.mk:1.1 Fri Jun 16 09:25:13 2023
+++ src/usr.bin/make/unit-tests/directive-include-guard.mk Sun Jun 18 19:16:51 2023
@@ -1,4 +1,4 @@
-# $NetBSD: directive-include-guard.mk,v 1.1 2023/06/16 09:25:13 rillig Exp $
+# $NetBSD: directive-include-guard.mk,v 1.2 2023/06/18 19:16:51 rillig Exp $
#
# Tests for multiple-inclusion guards in makefiles.
#
@@ -9,9 +9,12 @@
# ...
# .endif
#
-# When such a file is included for the second time, it has no effect as all
+# When such a file is included for the second time, it has no effect, as all
# its content is skipped.
#
+# See also:
+# https://gcc.gnu.org/onlinedocs/cppinternals/Guard-Macros.html
+#
# TODO: In these cases, do not include the file, to increase performance.
@@ -66,6 +69,11 @@ LINES.varname-indirect= \
'.endif'
# The variable assignment for the guard must directly follow the conditional.
+#
+# This requirement may be dropped entirely later, as the guard variable could
+# also be undefined while reading the file or at a later point, and as long as
+# the implementation checks the guard variable before skipping the file, the
+# optimization is still valid.
INCS+= late-assignment
LINES.late-assignment= \
'.ifndef LATE_ASSIGNMENT' \
@@ -78,7 +86,7 @@ LINES.late-assignment= \
INCS+= two-conditions
LINES.two-conditions= \
'.ifndef TWO_CONDITIONS' \
- '. if 0' \
+ '. if 1' \
'TWO_CONDITIONS=' \
'. endif' \
'.endif'
@@ -119,6 +127,57 @@ LINES.swapped= \
'.ifndef SWAPPED' \
'.endif'
+# If the guard variable is undefined at some later point, the guarded file is
+# included again.
+INCS+= undef-between
+LINES.undef-between= \
+ '.ifndef UNDEF_BETWEEN' \
+ 'UNDEF_BETWEEN=' \
+ '.endif'
+
+# If the guarded file undefines the guard variable, the guarded file is
+# included again.
+INCS+= undef-inside
+LINES.undef-inside= \
+ '.ifndef UNDEF_INSIDE' \
+ 'UNDEF_INSIDE=' \
+ '.undef UNDEF_INSIDE' \
+ '.endif'
+
+# The outermost '.if' must not have an '.elif' branch.
+INCS+= if-elif
+LINES.if-elif = \
+ '.ifndef IF_ELIF' \
+ 'IF_ELIF=' \
+ '.elif 1' \
+ '.endif'
+
+# The outermost '.if' must not have an '.else' branch.
+INCS+= if-else
+LINES.if-else = \
+ '.ifndef IF_ELSE' \
+ 'IF_ELSE=' \
+ '.else' \
+ '.endif'
+
+# The inner '.if' directives may have an '.elif' or '.else'.
+INCS+= inner-if-elif-else
+LINES.inner-if-elif-else = \
+ '.ifndef INNER_IF_ELIF_ELSE' \
+ 'INNER_IF_ELIF_ELSE=' \
+ '. if 0' \
+ '. elif 0' \
+ '. else' \
+ '. endif' \
+ '. if 0' \
+ '. elif 1' \
+ '. else' \
+ '. endif' \
+ '. if 1' \
+ '. elif 1' \
+ '. else' \
+ '. endif' \
+ '.endif'
# Include each of the files twice. The directive-include-guard.exp file
# contains a single entry for the files whose multiple-inclusion guard works,
@@ -131,6 +190,7 @@ LINES.swapped= \
_!= printf '%s\n' ${LINES.$i} > ${fname}
.MAKEFLAGS: -dp
.include "${.CURDIR}/${fname}"
+.undef ${i:Mundef-between:%=UNDEF_BETWEEN}
.include "${.CURDIR}/${fname}"
.MAKEFLAGS: -d0
_!= rm ${fname}