aboutsummaryrefslogtreecommitdiff
path: root/meta.c
diff options
context:
space:
mode:
authorSimon J. Gerraty <sjg@FreeBSD.org>2020-09-05 16:11:04 +0000
committerSimon J. Gerraty <sjg@FreeBSD.org>2020-09-05 16:11:04 +0000
commit6bbc783f48498b808e19db4441299dc7d85a278b (patch)
treebe201219a56594c76537191ee91fdd3ef8cfb348 /meta.c
parent367d32e2b15fe0397ddecccaa04cf9ed0164c969 (diff)
downloadsrc-6bbc783f48498b808e19db4441299dc7d85a278b.tar.gz
src-6bbc783f48498b808e19db4441299dc7d85a278b.zip
Import bmake-20200902vendor/NetBSD/bmake/20200902
Lots of code refactoring, simplification and cleanup. Lots of new unit-tests providing much higher code coverage. All courtesy of rillig at netbsd. Other significant changes: o new read-only variable .SHELL which provides the path of the shell used to run scripts (as defined by the .SHELL target). o new debug option -dl: LINT mode, does the equivalent of := for all variable assignments so that file and line number are reported for variable parse errors.
Notes
Notes: svn path=/vendor/NetBSD/bmake/dist/; revision=365361 svn path=/vendor/NetBSD/bmake/20200902/; revision=365363; tag=vendor/NetBSD/bmake/20200902
Diffstat (limited to 'meta.c')
-rw-r--r--meta.c151
1 files changed, 67 insertions, 84 deletions
diff --git a/meta.c b/meta.c
index 27f16a0da908..5d87febb0496 100644
--- a/meta.c
+++ b/meta.c
@@ -1,4 +1,4 @@
-/* $NetBSD: meta.c,v 1.86 2020/07/11 00:39:53 sjg Exp $ */
+/* $NetBSD: meta.c,v 1.113 2020/09/02 04:08:54 rillig Exp $ */
/*
* Implement 'meta' mode.
@@ -47,6 +47,7 @@ char * dirname(char *);
#endif
#include "make.h"
+#include "dir.h"
#include "job.h"
#ifdef USE_FILEMON
@@ -318,7 +319,7 @@ meta_name(char *mname, size_t mnamelen,
static int
is_submake(void *cmdp, void *gnp)
{
- static char *p_make = NULL;
+ static const char *p_make = NULL;
static int p_len;
char *cmd = cmdp;
GNode *gn = gnp;
@@ -333,7 +334,7 @@ is_submake(void *cmdp, void *gnp)
}
cp = strchr(cmd, '$');
if ((cp)) {
- mp = Var_Subst(NULL, cmd, gn, VARF_WANTRES);
+ mp = Var_Subst(cmd, gn, VARE_WANTRES);
cmd = mp;
}
cp2 = strstr(cmd, p_make);
@@ -372,13 +373,13 @@ printCMD(void *cmdp, void *mfpp)
{
meta_file_t *mfp = mfpp;
char *cmd = cmdp;
- char *cp = NULL;
+ char *cmd_freeIt = NULL;
if (strchr(cmd, '$')) {
- cmd = cp = Var_Subst(NULL, cmd, mfp->gn, VARF_WANTRES);
+ cmd = cmd_freeIt = Var_Subst(cmd, mfp->gn, VARE_WANTRES);
}
fprintf(mfp->fp, "CMD %s\n", cmd);
- free(cp);
+ free(cmd_freeIt);
return 0;
}
@@ -403,7 +404,7 @@ static Boolean
meta_needed(GNode *gn, const char *dname,
char *objdir, int verbose)
{
- struct stat fs;
+ struct make_stat mst;
if (verbose)
verbose = DEBUG(META);
@@ -437,7 +438,7 @@ meta_needed(GNode *gn, const char *dname,
}
/* The object directory may not exist. Check it.. */
- if (cached_stat(dname, &fs) != 0) {
+ if (cached_stat(dname, &mst) != 0) {
if (verbose)
fprintf(debug_file, "Skipping meta for %s: no .OBJDIR\n",
gn->name);
@@ -488,7 +489,7 @@ meta_create(BuildMon *pbm, GNode *gn)
char *mp;
/* Describe the target we are building */
- mp = Var_Subst(NULL, "${" MAKE_META_PREFIX "}", gn, VARF_WANTRES);
+ mp = Var_Subst("${" MAKE_META_PREFIX "}", gn, VARE_WANTRES);
if (*mp)
fprintf(stdout, "%s\n", mp);
free(mp);
@@ -546,7 +547,7 @@ meta_create(BuildMon *pbm, GNode *gn)
}
out:
for (i--; i >= 0; i--) {
- free(p[i]);
+ bmake_free(p[i]);
}
return mf.fp;
@@ -629,24 +630,19 @@ meta_mode_init(const char *make_mode)
/*
* We consider ourselves master of all within ${.MAKE.META.BAILIWICK}
*/
- metaBailiwick = Lst_Init(FALSE);
- metaBailiwickStr = Var_Subst(NULL, "${.MAKE.META.BAILIWICK:O:u:tA}",
- VAR_GLOBAL, VARF_WANTRES);
- if (metaBailiwickStr) {
- str2Lst_Append(metaBailiwick, metaBailiwickStr, NULL);
- }
+ metaBailiwick = Lst_Init();
+ metaBailiwickStr = Var_Subst("${.MAKE.META.BAILIWICK:O:u:tA}",
+ VAR_GLOBAL, VARE_WANTRES);
+ str2Lst_Append(metaBailiwick, metaBailiwickStr, NULL);
/*
* We ignore any paths that start with ${.MAKE.META.IGNORE_PATHS}
*/
- metaIgnorePaths = Lst_Init(FALSE);
+ metaIgnorePaths = Lst_Init();
Var_Append(MAKE_META_IGNORE_PATHS,
"/dev /etc /proc /tmp /var/run /var/tmp ${TMPDIR}", VAR_GLOBAL);
- metaIgnorePathsStr = Var_Subst(NULL,
- "${" MAKE_META_IGNORE_PATHS ":O:u:tA}", VAR_GLOBAL,
- VARF_WANTRES);
- if (metaIgnorePathsStr) {
- str2Lst_Append(metaIgnorePaths, metaIgnorePathsStr, NULL);
- }
+ metaIgnorePathsStr = Var_Subst("${" MAKE_META_IGNORE_PATHS ":O:u:tA}",
+ VAR_GLOBAL, VARE_WANTRES);
+ str2Lst_Append(metaIgnorePaths, metaIgnorePathsStr, NULL);
/*
* We ignore any paths that match ${.MAKE.META.IGNORE_PATTERNS}
@@ -654,12 +650,12 @@ meta_mode_init(const char *make_mode)
cp = NULL;
if (Var_Value(MAKE_META_IGNORE_PATTERNS, VAR_GLOBAL, &cp)) {
metaIgnorePatterns = TRUE;
- free(cp);
+ bmake_free(cp);
}
cp = NULL;
if (Var_Value(MAKE_META_IGNORE_FILTER, VAR_GLOBAL, &cp)) {
metaIgnoreFilter = TRUE;
- free(cp);
+ bmake_free(cp);
}
}
@@ -822,8 +818,8 @@ meta_job_output(Job *job, char *cp, const char *nl)
if (!meta_prefix) {
char *cp2;
- meta_prefix = Var_Subst(NULL, "${" MAKE_META_PREFIX "}",
- VAR_GLOBAL, VARF_WANTRES);
+ meta_prefix = Var_Subst("${" MAKE_META_PREFIX "}",
+ VAR_GLOBAL, VARE_WANTRES);
if ((cp2 = strchr(meta_prefix, '$')))
meta_prefix_len = cp2 - meta_prefix;
else
@@ -894,9 +890,11 @@ meta_job_finish(Job *job)
void
meta_finish(void)
{
- Lst_Destroy(metaBailiwick, NULL);
+ if (metaBailiwick != NULL)
+ Lst_Free(metaBailiwick);
free(metaBailiwickStr);
- Lst_Destroy(metaIgnorePaths, NULL);
+ if (metaIgnorePaths != NULL)
+ Lst_Free(metaIgnorePaths);
free(metaIgnorePathsStr);
}
@@ -958,39 +956,23 @@ prefix_match(void *p, void *q)
return strncmp(path, prefix, n) == 0;
}
-/*
- * looking for exact or prefix/ match to
- * Lst_Find wants 0 to stop search
- */
-static int
+/* See if the path equals prefix or starts with "prefix/". */
+static Boolean
path_match(const void *p, const void *q)
{
- const char *prefix = q;
const char *path = p;
+ const char *prefix = q;
size_t n = strlen(prefix);
- int rc;
- if ((rc = strncmp(path, prefix, n)) == 0) {
- switch (path[n]) {
- case '\0':
- case '/':
- break;
- default:
- rc = 1;
- break;
- }
- }
- return rc;
+ if (strncmp(path, prefix, n) != 0)
+ return FALSE;
+ return path[n] == '\0' || path[n] == '/';
}
-/* Lst_Find wants 0 to stop search */
-static int
+static Boolean
string_match(const void *p, const void *q)
{
- const char *p1 = p;
- const char *p2 = q;
-
- return strcmp(p1, p2);
+ return strcmp(p, q) == 0;
}
@@ -1015,12 +997,12 @@ meta_ignore(GNode *gn, const char *p)
}
if (metaIgnorePatterns) {
+ const char *expr;
char *pm;
Var_Set(".p.", p, gn);
- pm = Var_Subst(NULL,
- "${" MAKE_META_IGNORE_PATTERNS ":@m@${.p.:M$m}@}",
- gn, VARF_WANTRES);
+ expr = "${" MAKE_META_IGNORE_PATTERNS ":@m@${.p.:M$m}@}";
+ pm = Var_Subst(expr, gn, VARE_WANTRES);
if (*pm) {
#ifdef DEBUG_META_MODE
if (DEBUG(META))
@@ -1040,7 +1022,7 @@ meta_ignore(GNode *gn, const char *p)
snprintf(fname, sizeof(fname),
"${%s:L:${%s:ts:}}",
p, MAKE_META_IGNORE_FILTER);
- fm = Var_Subst(NULL, fname, gn, VARF_WANTRES);
+ fm = Var_Subst(fname, gn, VARE_WANTRES);
if (*fm == '\0') {
#ifdef DEBUG_META_MODE
if (DEBUG(META))
@@ -1122,7 +1104,7 @@ meta_oodate(GNode *gn, Boolean oodate)
goto oodate_out;
dname = fname3;
- missingFiles = Lst_Init(FALSE);
+ missingFiles = Lst_Init();
/*
* We need to check if the target is out-of-date. This includes
@@ -1147,7 +1129,7 @@ meta_oodate(GNode *gn, Boolean oodate)
int pid;
int x;
LstNode ln;
- struct stat fs;
+ struct make_stat mst;
if (!buf) {
bufsz = 8 * BUFSIZ;
@@ -1240,7 +1222,7 @@ meta_oodate(GNode *gn, Boolean oodate)
CHECK_VALID_META(p);
pid = atoi(p);
if (pid > 0 && pid != lastpid) {
- char *ldir;
+ const char *ldir;
char *tp;
if (lastpid > 0) {
@@ -1254,12 +1236,12 @@ meta_oodate(GNode *gn, Boolean oodate)
ldir = Var_Value(ldir_vname, VAR_GLOBAL, &tp);
if (ldir) {
strlcpy(latestdir, ldir, sizeof(latestdir));
- free(tp);
+ bmake_free(tp);
}
ldir = Var_Value(lcwd_vname, VAR_GLOBAL, &tp);
if (ldir) {
strlcpy(lcwd, ldir, sizeof(lcwd));
- free(tp);
+ bmake_free(tp);
}
}
/* Skip past the pid. */
@@ -1337,15 +1319,16 @@ meta_oodate(GNode *gn, Boolean oodate)
case 'D': /* unlink */
if (*p == '/' && !Lst_IsEmpty(missingFiles)) {
/* remove any missingFiles entries that match p */
- if ((ln = Lst_Find(missingFiles, p,
- path_match)) != NULL) {
+ ln = Lst_Find(missingFiles, path_match, p);
+ if (ln != NULL) {
LstNode nln;
char *tp;
do {
- nln = Lst_FindFrom(missingFiles, Lst_Succ(ln),
- p, path_match);
- tp = Lst_Datum(ln);
+ nln = Lst_FindFrom(missingFiles,
+ LstNode_Next(ln),
+ path_match, p);
+ tp = LstNode_Datum(ln);
Lst_Remove(missingFiles, ln);
free(tp);
} while ((ln = nln) != NULL);
@@ -1411,11 +1394,11 @@ meta_oodate(GNode *gn, Boolean oodate)
if ((strstr("tmp", p)))
break;
- if ((link_src != NULL && cached_lstat(p, &fs) < 0) ||
- (link_src == NULL && cached_stat(p, &fs) < 0)) {
+ if ((link_src != NULL && cached_lstat(p, &mst) < 0) ||
+ (link_src == NULL && cached_stat(p, &mst) < 0)) {
if (!meta_ignore(gn, p)) {
- if (Lst_Find(missingFiles, p, string_match) == NULL)
- Lst_AtEnd(missingFiles, bmake_strdup(p));
+ if (Lst_Find(missingFiles, string_match, p) == NULL)
+ Lst_Append(missingFiles, bmake_strdup(p));
}
}
break;
@@ -1475,7 +1458,7 @@ meta_oodate(GNode *gn, Boolean oodate)
if (DEBUG(META))
fprintf(debug_file, "%s: %d: looking for: %s\n", fname, lineno, *sdp);
#endif
- if (cached_stat(*sdp, &fs) == 0) {
+ if (cached_stat(*sdp, &mst) == 0) {
found = 1;
p = *sdp;
}
@@ -1485,12 +1468,12 @@ meta_oodate(GNode *gn, Boolean oodate)
if (DEBUG(META))
fprintf(debug_file, "%s: %d: found: %s\n", fname, lineno, p);
#endif
- if (!S_ISDIR(fs.st_mode) &&
- fs.st_mtime > gn->mtime) {
+ if (!S_ISDIR(mst.mst_mode) &&
+ mst.mst_mtime > gn->mtime) {
if (DEBUG(META))
fprintf(debug_file, "%s: %d: file '%s' is newer than the target...\n", fname, lineno, p);
oodate = TRUE;
- } else if (S_ISDIR(fs.st_mode)) {
+ } else if (S_ISDIR(mst.mst_mode)) {
/* Update the latest directory. */
cached_realpath(p, latestdir);
}
@@ -1500,8 +1483,8 @@ meta_oodate(GNode *gn, Boolean oodate)
* A referenced file outside of CWD is missing.
* We cannot catch every eventuality here...
*/
- if (Lst_Find(missingFiles, p, string_match) == NULL)
- Lst_AtEnd(missingFiles, bmake_strdup(p));
+ if (Lst_Find(missingFiles, string_match, p) == NULL)
+ Lst_Append(missingFiles, bmake_strdup(p));
}
}
if (buf[0] == 'E') {
@@ -1524,7 +1507,7 @@ meta_oodate(GNode *gn, Boolean oodate)
fprintf(debug_file, "%s: %d: there were more build commands in the meta data file than there are now...\n", fname, lineno);
oodate = TRUE;
} else {
- char *cmd = (char *)Lst_Datum(ln);
+ char *cmd = LstNode_Datum(ln);
Boolean hasOODATE = FALSE;
if (strstr(cmd, "$?"))
@@ -1539,7 +1522,7 @@ meta_oodate(GNode *gn, Boolean oodate)
if (DEBUG(META))
fprintf(debug_file, "%s: %d: cannot compare command using .OODATE\n", fname, lineno);
}
- cmd = Var_Subst(NULL, cmd, gn, VARF_WANTRES|VARF_UNDEFERR);
+ cmd = Var_Subst(cmd, gn, VARE_WANTRES|VARE_UNDEFERR);
if ((cp = strchr(cmd, '\n'))) {
int n;
@@ -1576,7 +1559,7 @@ meta_oodate(GNode *gn, Boolean oodate)
oodate = TRUE;
}
free(cmd);
- ln = Lst_Succ(ln);
+ ln = LstNode_Next(ln);
}
} else if (strcmp(buf, "CWD") == 0) {
/*
@@ -1601,7 +1584,7 @@ meta_oodate(GNode *gn, Boolean oodate)
if (!Lst_IsEmpty(missingFiles)) {
if (DEBUG(META))
fprintf(debug_file, "%s: missing files: %s...\n",
- fname, (char *)Lst_Datum(Lst_First(missingFiles)));
+ fname, (char *)LstNode_Datum(Lst_First(missingFiles)));
oodate = TRUE;
}
if (!oodate && !have_filemon && filemonMissing) {
@@ -1628,7 +1611,7 @@ meta_oodate(GNode *gn, Boolean oodate)
}
}
- Lst_Destroy(missingFiles, (FreeProc *)free);
+ Lst_Destroy(missingFiles, free);
if (oodate && needOODATE) {
/*
@@ -1638,12 +1621,12 @@ meta_oodate(GNode *gn, Boolean oodate)
*/
Var_Delete(OODATE, gn);
Var_Set(OODATE, Var_Value(ALLSRC, gn, &cp), gn);
- free(cp);
+ bmake_free(cp);
}
oodate_out:
for (i--; i >= 0; i--) {
- free(pa[i]);
+ bmake_free(pa[i]);
}
return oodate;
}