Module Name: src Committed By: sjg Date: Wed Jun 21 04:20:21 UTC 2023
Modified Files: src/usr.bin/make: cond.c src/usr.bin/make/unit-tests: directive-include-guard.exp directive-include-guard.mk Log Message: Allow guard targets to use variables. I commonly use __${.PARSEDIR:tA}__ where a unique guard is needed, __${.PARSEDIR}__ is also useful in many cases. Combination of patch from rillig and mine To generate a diff of this commit: cvs rdiff -u -r1.350 -r1.351 src/usr.bin/make/cond.c cvs rdiff -u -r1.6 -r1.7 \ src/usr.bin/make/unit-tests/directive-include-guard.exp cvs rdiff -u -r1.7 -r1.8 \ 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/cond.c diff -u src/usr.bin/make/cond.c:1.350 src/usr.bin/make/cond.c:1.351 --- src/usr.bin/make/cond.c:1.350 Tue Jun 20 09:25:33 2023 +++ src/usr.bin/make/cond.c Wed Jun 21 04:20:20 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: cond.c,v 1.350 2023/06/20 09:25:33 rillig Exp $ */ +/* $NetBSD: cond.c,v 1.351 2023/06/21 04:20:20 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -92,7 +92,7 @@ #include "dir.h" /* "@(#)cond.c 8.2 (Berkeley) 1/2/94" */ -MAKE_RCSID("$NetBSD: cond.c,v 1.350 2023/06/20 09:25:33 rillig Exp $"); +MAKE_RCSID("$NetBSD: cond.c,v 1.351 2023/06/21 04:20:20 sjg Exp $"); /* * Conditional expressions conform to this grammar: @@ -1252,22 +1252,6 @@ ParseVarnameGuard(const char **pp, const return false; } -static bool -ParseTargetGuard(const char **pp, const char **target) -{ - const char *p = *pp; - - if (ch_isalpha(*p) || *p == '_') { - while (ch_isalnum(*p) || *p == '_' || *p == '-' - || *p == '<' || *p == '>' || *p == '.' || *p == '/') - p++; - *target = *pp; - *pp = p; - return true; - } - return false; -} - /* Extracts the multiple-inclusion guard from a conditional, if any. */ Guard * Cond_ExtractGuard(const char *line) @@ -1292,9 +1276,17 @@ Cond_ExtractGuard(const char *line) && strcmp(p, ")") == 0) goto found_variable; } else if (skip_string(&p, "!target(")) { - if (ParseTargetGuard(&p, &name) - && strcmp(p, ")") == 0) - goto found_target; + name = p; + free(ParseWord(&p, false)); + if (strcmp(p, ")") == 0) { + char *target; + p = name; + target = ParseWord(&p, true); + guard = bmake_malloc(sizeof(*guard)); + guard->kind = GK_TARGET; + guard->name = target; + return guard; + } } } else if (Substring_Equals(dir, "ifndef")) { if (ParseVarnameGuard(&p, &name) && *p == '\0') @@ -1304,10 +1296,6 @@ Cond_ExtractGuard(const char *line) found_variable: kind = GK_VARIABLE; - goto found; -found_target: - kind = GK_TARGET; -found: guard = bmake_malloc(sizeof(*guard)); guard->kind = kind; guard->name = bmake_strsedup(name, p); Index: src/usr.bin/make/unit-tests/directive-include-guard.exp diff -u src/usr.bin/make/unit-tests/directive-include-guard.exp:1.6 src/usr.bin/make/unit-tests/directive-include-guard.exp:1.7 --- src/usr.bin/make/unit-tests/directive-include-guard.exp:1.6 Tue Jun 20 09:25:34 2023 +++ src/usr.bin/make/unit-tests/directive-include-guard.exp Wed Jun 21 04:20:21 2023 @@ -47,7 +47,13 @@ Skipping 'target.tmp' because '__target. Parse_PushInput: file target-sys.tmp, line 1 Skipping 'target-sys.tmp' because '__<target-sys.tmp>__' is defined Parse_PushInput: file target-indirect.tmp, line 1 -Parse_PushInput: file target-indirect.tmp, line 1 +Skipping 'target-indirect.tmp' because 'target-indirect.tmp' is defined +Parse_PushInput: file target-indirect-PARSEFILE.tmp, line 1 +Skipping 'target-indirect-PARSEFILE.tmp' because '__target-indirect-PARSEFILE.tmp__' is defined +Parse_PushInput: file target-indirect-PARSEFILE2.tmp, line 1 +Skipping 'target-indirect-PARSEFILE2.tmp' because '__target-indirect-PARSEFILE2.tmp__' is defined +Parse_PushInput: file target-indirect-PARSEFILE-tA.tmp, line 1 +Skipping 'target-indirect-PARSEFILE-tA.tmp' because '__target-indirect-PARSEFILE-tA.tmp__' is defined Parse_PushInput: file target-unguarded.tmp, line 1 Parse_PushInput: file target-unguarded.tmp, line 1 Parse_PushInput: file target-plus.tmp, line 1 Index: src/usr.bin/make/unit-tests/directive-include-guard.mk diff -u src/usr.bin/make/unit-tests/directive-include-guard.mk:1.7 src/usr.bin/make/unit-tests/directive-include-guard.mk:1.8 --- src/usr.bin/make/unit-tests/directive-include-guard.mk:1.7 Tue Jun 20 09:25:34 2023 +++ src/usr.bin/make/unit-tests/directive-include-guard.mk Wed Jun 21 04:20:21 2023 @@ -1,4 +1,4 @@ -# $NetBSD: directive-include-guard.mk,v 1.7 2023/06/20 09:25:34 rillig Exp $ +# $NetBSD: directive-include-guard.mk,v 1.8 2023/06/21 04:20:21 sjg Exp $ # # Tests for multiple-inclusion guards in makefiles. # @@ -282,14 +282,45 @@ LINES.target-sys= \ # expect: Parse_PushInput: file target-sys.tmp, line 1 # expect: Skipping 'target-sys.tmp' because '__<target-sys.tmp>__' is defined -# The target name must not include '$' or other special characters. +# The target name may include variable references - which will be expanded. INCS+= target-indirect LINES.target-indirect= \ '.if !target($${target-indirect.tmp:L})' \ 'target-indirect.tmp: .PHONY' \ '.endif' # expect: Parse_PushInput: file target-indirect.tmp, line 1 -# expect: Parse_PushInput: file target-indirect.tmp, line 1 +# expect: Skipping 'target-indirect.tmp' because 'target-indirect.tmp' is defined + +# A common form of guard target is __${.PARSEFILE}__. +# This is only useful of course if basename is unique. +INCS+= target-indirect-PARSEFILE +LINES.target-indirect-PARSEFILE= \ + '.if !target(__$${.PARSEFILE}__)' \ + '__$${.PARSEFILE}__: .NOTMAIN' \ + '.endif' +# expect: Parse_PushInput: file target-indirect-PARSEFILE.tmp, line 1 +# expect: Skipping 'target-indirect-PARSEFILE.tmp' because '__target-indirect-PARSEFILE.tmp__' is defined + +# Confirm that two such guards do not conflict +# again, assuming the basenames are unique. +INCS+= target-indirect-PARSEFILE2 +LINES.target-indirect-PARSEFILE2= \ + '.if !target(__$${.PARSEFILE}__)' \ + '__$${.PARSEFILE}__: .NOTMAIN' \ + '.endif' +# expect: Parse_PushInput: file target-indirect-PARSEFILE2.tmp, line 1 +# expect: Skipping 'target-indirect-PARSEFILE2.tmp' because '__target-indirect-PARSEFILE2.tmp__' is defined + +# Another common form of guard target is __${.PARSEFILE:tA}__. +INCS+= target-indirect-PARSEFILE-tA +LINES.target-indirect-PARSEFILE-tA= \ + '.if !target(__$${.PARSEFILE:tA}__)' \ + '__$${.PARSEFILE:tA}__: .NOTMAIN' \ + '.endif' +# expect: Parse_PushInput: file target-indirect-PARSEFILE-tA.tmp, line 1 +# expect: Skipping 'target-indirect-PARSEFILE-tA.tmp' because '__target-indirect-PARSEFILE-tA.tmp__' is defined +# The actual target is __${.OBJDIR}/target-indirect-PARSEFILE-tA.tmp__ but +# ${.OBJDIR}/ gets stripped in post processing. # If the target is not defined when including the file the next time, the file # is not guarded.