Module Name: src
Committed By: sjg
Date: Thu Jan 13 04:51:50 UTC 2022
Modified Files:
src/usr.bin/make: make.1 meta.c
Log Message:
meta.c: add .MAKE.META.CMP_FILTER
On rare occasions it is useful to be able to filter command lines
before comparison.
To generate a diff of this commit:
cvs rdiff -u -r1.300 -r1.301 src/usr.bin/make/make.1
cvs rdiff -u -r1.186 -r1.187 src/usr.bin/make/meta.c
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/make.1
diff -u src/usr.bin/make/make.1:1.300 src/usr.bin/make/make.1:1.301
--- src/usr.bin/make/make.1:1.300 Sun Dec 12 20:45:48 2021
+++ src/usr.bin/make/make.1 Thu Jan 13 04:51:50 2022
@@ -1,4 +1,4 @@
-.\" $NetBSD: make.1,v 1.300 2021/12/12 20:45:48 sjg Exp $
+.\" $NetBSD: make.1,v 1.301 2022/01/13 04:51:50 sjg Exp $
.\"
.\" Copyright (c) 1990, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -29,7 +29,7 @@
.\"
.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
.\"
-.Dd December 12, 2021
+.Dd January 12, 2022
.Dt MAKE 1
.Os
.Sh NAME
@@ -954,6 +954,12 @@ If a file that was generated outside of
.Va .OBJDIR
but within said bailiwick is missing,
the current target is considered out-of-date.
+.It Va .MAKE.META.CMP_FILTER
+In "meta" mode, it can (very rarely!) be useful to filter command
+lines before comparison.
+This variable can be set to a set of modifiers that will be applied to
+each line of the old and new command that differ, if the filtered
+commands still differ, the target is considered out-of-date.
.It Va .MAKE.META.CREATED
In "meta" mode, this variable contains a list of all the meta files
updated.
Index: src/usr.bin/make/meta.c
diff -u src/usr.bin/make/meta.c:1.186 src/usr.bin/make/meta.c:1.187
--- src/usr.bin/make/meta.c:1.186 Mon Dec 13 01:51:12 2021
+++ src/usr.bin/make/meta.c Thu Jan 13 04:51:50 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: meta.c,v 1.186 2021/12/13 01:51:12 rillig Exp $ */
+/* $NetBSD: meta.c,v 1.187 2022/01/13 04:51:50 sjg Exp $ */
/*
* Implement 'meta' mode.
@@ -65,6 +65,9 @@ static char *metaIgnorePathsStr; /* stri
#ifndef MAKE_META_IGNORE_FILTER
#define MAKE_META_IGNORE_FILTER ".MAKE.META.IGNORE_FILTER"
#endif
+#ifndef MAKE_META_CMP_FILTER
+#define MAKE_META_CMP_FILTER ".MAKE.META.CMP_FILTER"
+#endif
bool useMeta = false;
static bool useFilemon = false;
@@ -76,6 +79,7 @@ static bool metaVerbose = false;
static bool metaIgnoreCMDs = false; /* ignore CMDs in .meta files */
static bool metaIgnorePatterns = false; /* do we need to do pattern matches */
static bool metaIgnoreFilter = false; /* do we have more complex filtering? */
+static bool metaCmpFilter = false; /* do we have CMP_FILTER ? */
static bool metaCurdirOk = false; /* write .meta in .CURDIR Ok? */
static bool metaSilent = false; /* if we have a .meta be SILENT */
@@ -661,6 +665,11 @@ meta_mode_init(const char *make_mode)
metaIgnoreFilter = true;
FStr_Done(&value);
}
+ value = Var_Value(SCOPE_GLOBAL, MAKE_META_CMP_FILTER);
+ if (value.str != NULL) {
+ metaCmpFilter = true;
+ FStr_Done(&value);
+ }
}
/*
@@ -1077,6 +1086,39 @@ append_if_new(StringList *list, const ch
Lst_Append(list, bmake_strdup(str));
}
+static char *
+meta_filter_cmd(Buffer *buf, GNode *gn, char *s)
+{
+ Buf_Clear(buf);
+ Buf_AddStr(buf, "${");
+ Buf_AddStr(buf, s);
+ Buf_AddStr(buf, ":L:${" MAKE_META_CMP_FILTER ":ts:}}");
+ Var_Subst(buf->data, gn, VARE_WANTRES, &s);
+ return s;
+}
+
+static int
+meta_cmd_cmp(GNode *gn, char *a, char *b)
+{
+ static int once = 0;
+ static Buffer buf;
+ int rc;
+
+ rc = strcmp(a, b);
+ if (rc == 0 || !metaCmpFilter)
+ return rc;
+ if (!once) {
+ once++;
+ Buf_InitSize(&buf, BUFSIZ);
+ }
+ a = meta_filter_cmd(&buf, gn, a);
+ b = meta_filter_cmd(&buf, gn, b);
+ rc = strcmp(a, b);
+ free(a);
+ free(b);
+ return rc;
+}
+
bool
meta_oodate(GNode *gn, bool oodate)
{
@@ -1552,7 +1594,7 @@ meta_oodate(GNode *gn, bool oodate)
if (p != NULL &&
!hasOODATE &&
!(gn->type & OP_NOMETA_CMP) &&
- (strcmp(p, cmd) != 0)) {
+ (meta_cmd_cmp(gn, p, cmd) != 0)) {
DEBUG4(META, "%s: %d: a build command has changed\n%s\nvs\n%s\n",
fname, lineno, p, cmd);
if (!metaIgnoreCMDs)