Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/make/unit-tests tests/make: add test for multiple-in...
details: https://anonhg.NetBSD.org/src/rev/eae0fdb766e4
branches: trunk
changeset: 376400:eae0fdb766e4
user: rillig <rillig%NetBSD.org@localhost>
date: Fri Jun 16 09:25:13 2023 +0000
description:
tests/make: add test for multiple-inclusion guards
diffstat:
distrib/sets/lists/tests/mi | 4 +-
usr.bin/make/unit-tests/Makefile | 8 +-
usr.bin/make/unit-tests/directive-include-guard.exp | 25 +++
usr.bin/make/unit-tests/directive-include-guard.mk | 140 ++++++++++++++++++++
4 files changed, 175 insertions(+), 2 deletions(-)
diffs (220 lines):
diff -r 95e6c1fd2c99 -r eae0fdb766e4 distrib/sets/lists/tests/mi
--- a/distrib/sets/lists/tests/mi Fri Jun 16 07:20:45 2023 +0000
+++ b/distrib/sets/lists/tests/mi Fri Jun 16 09:25:13 2023 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1268 2023/06/16 07:20:45 rillig Exp $
+# $NetBSD: mi,v 1.1269 2023/06/16 09:25:13 rillig Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -5779,6 +5779,8 @@
./usr/tests/usr.bin/make/unit-tests/directive-ifnmake.mk tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/directive-include-fatal.exp tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/directive-include-fatal.mk tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/directive-include-guard.exp tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/directive-include-guard.mk tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/directive-include.exp tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/directive-include.mk tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/directive-info.exp tests-usr.bin-tests compattestfile,atf
diff -r 95e6c1fd2c99 -r eae0fdb766e4 usr.bin/make/unit-tests/Makefile
--- a/usr.bin/make/unit-tests/Makefile Fri Jun 16 07:20:45 2023 +0000
+++ b/usr.bin/make/unit-tests/Makefile Fri Jun 16 09:25:13 2023 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.337 2023/06/16 07:20:45 rillig Exp $
+# $NetBSD: Makefile,v 1.338 2023/06/16 09:25:13 rillig Exp $
#
# Unit tests for make(1)
#
@@ -196,6 +196,7 @@ TESTS+= directive-ifndef
TESTS+= directive-ifnmake
TESTS+= directive-include
TESTS+= directive-include-fatal
+TESTS+= directive-include-guard
TESTS+= directive-info
TESTS+= directive-misspellings
TESTS+= directive-sinclude
@@ -504,6 +505,11 @@ FLAGS.varname-empty= -dv '$${:U}=cmdlin
# Some tests need extra postprocessing.
SED_CMDS.deptgt-phony= ${STD_SED_CMDS.dd}
SED_CMDS.dir= ${STD_SED_CMDS.dd}
+SED_CMDS.directive-include-guard= \
+ -e '/\.MAKEFLAGS/d' \
+ -e '/^Parsing line/d' \
+ -e '/^SetFilenameVars:/d' \
+ -e '/^ParseEOF:/d'
SED_CMDS.export= -e '/^[^=_A-Za-z0-9]*=/d'
SED_CMDS.export-all= ${SED_CMDS.export}
SED_CMDS.export-env= ${SED_CMDS.export}
diff -r 95e6c1fd2c99 -r eae0fdb766e4 usr.bin/make/unit-tests/directive-include-guard.exp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.bin/make/unit-tests/directive-include-guard.exp Fri Jun 16 09:25:13 2023 +0000
@@ -0,0 +1,25 @@
+Parse_PushInput: file directive-include-guard-guarded-ifndef.tmp, line 1
+Parse_PushInput: file directive-include-guard-guarded-ifndef.tmp, line 1
+Parse_PushInput: file directive-include-guard-comments.tmp, line 1
+Parse_PushInput: file directive-include-guard-comments.tmp, line 1
+Parse_PushInput: file directive-include-guard-guarded-if.tmp, line 1
+Parse_PushInput: file directive-include-guard-guarded-if.tmp, line 1
+Parse_PushInput: file directive-include-guard-triple-negation.tmp, line 1
+Parse_PushInput: file directive-include-guard-triple-negation.tmp, line 1
+Parse_PushInput: file directive-include-guard-varname-mismatch.tmp, line 1
+Parse_PushInput: file directive-include-guard-varname-mismatch.tmp, line 1
+Parse_PushInput: file directive-include-guard-varname-indirect.tmp, line 1
+Parse_PushInput: file directive-include-guard-varname-indirect.tmp, line 1
+Parse_PushInput: file directive-include-guard-late-assignment.tmp, line 1
+Parse_PushInput: file directive-include-guard-late-assignment.tmp, line 1
+Parse_PushInput: file directive-include-guard-two-conditions.tmp, line 1
+Parse_PushInput: file directive-include-guard-two-conditions.tmp, line 1
+Parse_PushInput: file directive-include-guard-already-set.tmp, line 1
+Parse_PushInput: file directive-include-guard-already-set.tmp, line 1
+Parse_PushInput: file directive-include-guard-twice.tmp, line 1
+Parse_PushInput: file directive-include-guard-twice.tmp, line 1
+Parse_PushInput: file directive-include-guard-reuse.tmp, line 1
+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
+exit status 0
diff -r 95e6c1fd2c99 -r eae0fdb766e4 usr.bin/make/unit-tests/directive-include-guard.mk
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.bin/make/unit-tests/directive-include-guard.mk Fri Jun 16 09:25:13 2023 +0000
@@ -0,0 +1,140 @@
+# $NetBSD: directive-include-guard.mk,v 1.1 2023/06/16 09:25:13 rillig Exp $
+#
+# Tests for multiple-inclusion guards in makefiles.
+#
+# A file that is guarded by a multiple-inclusion guard has the following form:
+#
+# .ifndef GUARD_NAME
+# GUARD_NAME= # any value
+# ...
+# .endif
+#
+# When such a file is included for the second time, it has no effect as all
+# its content is skipped.
+#
+# TODO: In these cases, do not include the file, to increase performance.
+
+
+# This is the canonical form of a multiple-inclusion guard.
+INCS+= guarded-ifndef
+LINES.guarded-ifndef= \
+ '.ifndef GUARDED_IFNDEF' \
+ 'GUARDED_IFNDEF=' \
+ '.endif'
+
+# Comments and empty lines have no influence on the multiple-inclusion guard.
+INCS+= comments
+LINES.comments= \
+ '\# comment' \
+ '' \
+ '.ifndef GUARD' \
+ '\# comment' \
+ 'GUARD=\#comment' \
+ '.endif' \
+ '\# comment'
+
+# An alternative form uses the 'defined' function. It is more verbose than
+# the canonical form. There are other possible forms as well, such as with a
+# triple negation, but these are not recognized as they are not common.
+INCS+= guarded-if
+LINES.guarded-if= \
+ '.if !defined(GUARDED_IF)' \
+ 'GUARDED_IF=' \
+ '.endif'
+
+# Triple negation is so uncommon that it's not recognized.
+INCS+= triple-negation
+LINES.triple-negation= \
+ '.if !!!defined(TRIPLE_NEGATION)' \
+ 'TRIPLE_NEGATION=' \
+ '.endif'
+
+# The variable names in the '.if' and the assignment must be the same.
+INCS+= varname-mismatch
+LINES.varname-mismatch= \
+ '.ifndef VARNAME_MISMATCH' \
+ 'OTHER_NAME=' \
+ '.endif'
+
+# The variable name in the assignment must only contain alphanumeric
+# characters and underscores, in particular, it must not be a dynamically
+# computed name.
+INCS+= varname-indirect
+LINES.varname-indirect= \
+ '.ifndef VARNAME_INDIRECT' \
+ 'VARNAME_$${:UINDIRECT}=' \
+ '.endif'
+
+# The variable assignment for the guard must directly follow the conditional.
+INCS+= late-assignment
+LINES.late-assignment= \
+ '.ifndef LATE_ASSIGNMENT' \
+ 'OTHER=' \
+ 'LATE_ASSIGNMENT=' \
+ '.endif'
+
+# There must be no other condition between the guard condition and the
+# variable assignment.
+INCS+= two-conditions
+LINES.two-conditions= \
+ '.ifndef TWO_CONDITIONS' \
+ '. if 0' \
+ 'TWO_CONDITIONS=' \
+ '. endif' \
+ '.endif'
+
+# If the guard variable is already set before the file is included for the
+# first time, that file is not considered to be guarded. It's a situation
+# that is uncommon in practice.
+INCS+= already-set
+LINES.already-set= \
+ '.ifndef ALREADY_SET' \
+ 'ALREADY_SET=' \
+ '.endif'
+ALREADY_SET=
+
+# The whole file content must be guarded by a single '.if' conditional, not by
+# several, even if they have the same effect.
+INCS+= twice
+LINES.twice= \
+ '.ifndef TWICE' \
+ 'TWICE=' \
+ '.endif' \
+ '.ifndef TWICE' \
+ 'TWICE=' \
+ '.endif'
+
+# When multiple files use the same guard variable name, they exclude each
+# other. It's the responsibility of the makefile authors to choose suitable
+# variable names. Typical choices are ${PROJECT}_${DIR}_${FILE}_MK.
+INCS+= reuse
+LINES.reuse= \
+ ${LINES.guarded-if}
+
+# The conditional must come before the assignment, otherwise the conditional
+# is useless, as it always evaluates to false.
+INCS+= swapped
+LINES.swapped= \
+ 'SWAPPED=' \
+ '.ifndef SWAPPED' \
+ '.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,
+# and two entries for the files that are not protected against multiple
+# inclusion.
+#
+# Some debug output lines are suppressed in the .exp file, see ./Makefile.
+.for i in ${INCS}
+. for fname in directive-include-guard-$i.tmp
+_!= printf '%s\n' ${LINES.$i} > ${fname}
+.MAKEFLAGS: -dp
+.include "${.CURDIR}/${fname}"
+.include "${.CURDIR}/${fname}"
+.MAKEFLAGS: -d0
+_!= rm ${fname}
+. endfor
+.endfor
+
+all:
Home |
Main Index |
Thread Index |
Old Index