pkgsrc-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: odd -J complaint from make on netbsd-11
>Actually it occurs to me now, that if GNode_AddCommand checks the
>expanded command then the above is unnecessary.
>
>We'll still have the test result changes to deal with though, as there
>should be fewer false positives etc.
The patch below will check for both progname and "make" (if progname !=
"make") in the expanded (if needed) commands.
It does a much better job of spotting "make" as a word (preceded by '/'
or space, and followed by space or nul.
This change however results in a *lot* more (19) changes to test results.
Some of them are obviously correct like;
no longer setting OP_SUBMAKE for 'make-index'
and setting OP_SUBMAKE for a target containing ${MAKE:T}
but others are not at all obvious.
--sjg
diff -r 73b7c4c0b3fd bmake/parse.c
--- a/bmake/parse.c Mon Jan 12 20:37:41 2026 -0800
+++ b/bmake/parse.c Wed Feb 04 09:45:55 2026 -0800
@@ -1984,6 +1984,24 @@
}
}
+/*
+ * Does cmd contain name?
+ * To match; name must be at the start or preceded by '/' or space,
+ * and it must be followed by '\0' or space.
+ */
+static bool
+maybeSubMake(const char *cmd, const char *name, size_t len)
+{
+ const char *p;
+
+ for (p = strstr(cmd, name); p != NULL; p = strstr(&p[1], name)) {
+ if (p == cmd || p[-1] == '/' || ch_isspace(p[-1])) {
+ if (p[len] == '\0' || ch_isspace(p[len]))
+ return true;
+ }
+ }
+ return false;
+}
/*
* See if the command possibly calls a sub-make by using the
@@ -1992,37 +2010,31 @@
static bool
MaybeSubMake(const char *cmd)
{
- const char *start;
-
- for (start = cmd; *start != '\0'; start++) {
- const char *p = start;
- char endc;
-
- /* XXX: What if progname != "make"? */
- if (strncmp(p, "make", 4) == 0)
- if (start == cmd || !ch_isalnum(p[-1]))
- if (!ch_isalnum(p[4]))
- return true;
-
- if (*p != '$')
- continue;
- p++;
-
- if (*p == '{')
- endc = '}';
- else if (*p == '(')
- endc = ')';
- else
- continue;
- p++;
-
- if (*p == '.') /* Accept either ${.MAKE} or ${MAKE}. */
- p++;
-
- if (strncmp(p, "MAKE", 4) == 0 && p[4] == endc)
- return true;
+ static size_t prognameLen;
+ static size_t makeLen;
+ char *ecmd;
+ bool rc = false;
+
+ if (!prognameLen) {
+ prognameLen = strlen(progname);
+
+ /* we are always called make for unit-tests */
+ if (prognameLen != 4 || strcmp(progname, "make") != 0)
+ makeLen = 4;
}
- return false;
+ if (strchr(cmd, '$') != NULL)
+ ecmd = Var_Subst(cmd, SCOPE_GLOBAL, VARE_EVAL);
+ else
+ ecmd = NULL; /* const correctness is a PITA */
+
+ if (maybeSubMake(ecmd ? ecmd : cmd, progname, prognameLen))
+ rc = true;
+ else if (makeLen > 0 &&
+ maybeSubMake(ecmd ? ecmd : cmd, "make", makeLen))
+ rc = true;
+ if (ecmd != cmd)
+ free(ecmd);
+ return rc;
}
/* Append the command to the target node. */
Home |
Main Index |
Thread Index |
Old Index