diff options
author | Simon J. Gerraty <sjg@FreeBSD.org> | 2020-09-05 16:11:04 +0000 |
---|---|---|
committer | Simon J. Gerraty <sjg@FreeBSD.org> | 2020-09-05 16:11:04 +0000 |
commit | 6bbc783f48498b808e19db4441299dc7d85a278b (patch) | |
tree | be201219a56594c76537191ee91fdd3ef8cfb348 /meta.c | |
parent | 367d32e2b15fe0397ddecccaa04cf9ed0164c969 (diff) | |
download | src-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.c | 151 |
1 files changed, 67 insertions, 84 deletions
@@ -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; } |