So I did a full bulk build with the following diff. No failure due to old keyword.
This contains exactly: - abort directly instead of setting pgn->must_make = false - tag as "SPECIAL_DEPRECATED" all old keywords - remove the conditionals with those OP. We just keep OP_INVISIBLE because it's actually also used by cohorts (those pesky :: dependencies in imake) diff --git a/compat.c b/compat.c index fd78d78..af18ce3 100644 --- a/compat.c +++ b/compat.c @@ -101,24 +101,13 @@ CompatMake(void *gnp, /* The node to make */ if (pgn == NULL) pgn = gn; - if (pgn->type & OP_MADE) { - sib = gn; - do { - sib->mtime = gn->mtime; - sib->built_status = UPTODATE; - sib = sib->sibling; - } while (sib != gn); - } - switch(gn->built_status) { case UNKNOWN: /* First mark ourselves to be built, then apply whatever * transformations the suffix module thinks are necessary. * Once that's done, we can descend and make all our children. * If any of them has an error but the -k flag was given, - * our 'must_make' field will be set false again. This is our - * signal to not attempt to do anything but abort our - * parent as well. */ + * we will abort. */ gn->must_make = true; gn->built_status = BUILDING; /* note that, in case we have siblings, we only check all @@ -132,10 +121,9 @@ CompatMake(void *gnp, /* The node to make */ sib = sib->sibling; } while (sib != gn); - if (!gn->must_make) { + if (gn->built_status == ABORTED) { Error("Build for %s aborted", gn->name); - gn->built_status = ABORTED; - pgn->must_make = false; + pgn->built_status = ABORTED; return; } @@ -228,12 +216,10 @@ CompatMake(void *gnp, /* The node to make */ if (DEBUG(MAKE)) printf("update time: %s\n", time_to_string(&gn->mtime)); - if (!(gn->type & OP_EXEC)) { - pgn->child_rebuilt = true; - Make_TimeStamp(pgn, gn); - } + pgn->child_rebuilt = true; + Make_TimeStamp(pgn, gn); } else if (keepgoing) - pgn->must_make = false; + pgn->built_status = ABORTED; else { print_errors(); exit(1); @@ -242,22 +228,19 @@ CompatMake(void *gnp, /* The node to make */ case ERROR: /* Already had an error when making this beastie. Tell the * parent to abort. */ - pgn->must_make = false; + pgn->built_status = ABORTED; break; case BUILDING: Error("Graph cycles through %s", gn->name); gn->built_status = ERROR; - pgn->must_make = false; + pgn->built_status = ABORTED; break; case REBUILT: - if ((gn->type & OP_EXEC) == 0) { - pgn->child_rebuilt = true; - Make_TimeStamp(pgn, gn); - } + pgn->child_rebuilt = true; + Make_TimeStamp(pgn, gn); break; case UPTODATE: - if ((gn->type & OP_EXEC) == 0) - Make_TimeStamp(pgn, gn); + Make_TimeStamp(pgn, gn); break; default: break; diff --git a/dump.c b/dump.c index b3820eb..f35cacf 100644 --- a/dump.c +++ b/dump.c @@ -117,7 +117,7 @@ TargPrintNode(GNode *gn, bool full) } if (full) { printf("# %d unmade prerequisites\n", gn->children_left); - if (! (gn->type & (OP_JOIN|OP_USE|OP_EXEC))) { + if (! (gn->type & OP_USE)) { if (!is_out_of_date(gn->mtime)) { printf("# last modified %s: %s\n", time_to_string(&gn->mtime), diff --git a/engine.c b/engine.c index 535d8dd..4d7c128 100644 --- a/engine.c +++ b/engine.c @@ -241,7 +241,7 @@ void Job_Touch(GNode *gn) { handle_all_signals(); - if (gn->type & (OP_JOIN|OP_USE|OP_EXEC|OP_OPTIONAL|OP_PHONY)) { + if (gn->type & (OP_USE|OP_OPTIONAL|OP_PHONY)) { /* * .JOIN, .USE, and .OPTIONAL targets are "virtual" targets * and, as such, shouldn't really be created. @@ -347,7 +347,7 @@ Make_DoAllVar(GNode *gn) for (ln = Lst_First(&gn->children); ln != NULL; ln = Lst_Adv(ln)) { child = Lst_Datum(ln); - if ((child->type & (OP_EXEC|OP_USE|OP_INVISIBLE)) != 0) + if ((child->type & (OP_USE|OP_INVISIBLE)) != 0) continue; if (OP_NOP(child->type) || (target = Var(TARGET_INDEX, child)) == NULL) { @@ -371,10 +371,7 @@ Make_DoAllVar(GNode *gn) * hosed. */ do_oodate = false; - if (gn->type & OP_JOIN) { - if (child->built_status == REBUILT) - do_oodate = true; - } else if (is_strictly_before(gn->mtime, child->mtime) || + if (is_strictly_before(gn->mtime, child->mtime) || (!is_strictly_before(child->mtime, starttime) && child->built_status == REBUILT)) do_oodate = true; @@ -413,9 +410,6 @@ Make_DoAllVar(GNode *gn) if (gn->impliedsrc) Var(IMPSRC_INDEX, gn) = Var(TARGET_INDEX, gn->impliedsrc); - - if (gn->type & OP_JOIN) - Var(TARGET_INDEX, gn) = Var(ALLSRC_INDEX, gn); } /* Wrapper to call Make_TimeStamp from a forEach loop. */ @@ -434,7 +428,7 @@ Make_OODate(GNode *gn) * Certain types of targets needn't even be sought as their datedness * doesn't depend on their modification time... */ - if ((gn->type & (OP_JOIN|OP_USE|OP_EXEC|OP_PHONY)) == 0) { + if ((gn->type & (OP_USE|OP_PHONY)) == 0) { (void)Dir_MTime(gn); if (DEBUG(MAKE)) { if (!is_out_of_date(gn->mtime)) @@ -462,15 +456,7 @@ Make_OODate(GNode *gn) if (DEBUG(MAKE)) printf(".USE node..."); oodate = false; - } else if (gn->type & OP_JOIN) { - /* - * A target with the .JOIN attribute is only considered - * out-of-date if any of its children was out-of-date. - */ - if (DEBUG(MAKE)) - printf(".JOIN node..."); - oodate = gn->child_rebuilt; - } else if (gn->type & (OP_FORCE|OP_EXEC|OP_PHONY)) { + } else if (gn->type & (OP_FORCE|OP_PHONY)) { /* * A node which is the object of the force (!) operator or which * has the .EXEC attribute is always considered out-of-date. diff --git a/expandchildren.c b/expandchildren.c index 28a1004..4ceb5c1 100644 --- a/expandchildren.c +++ b/expandchildren.c @@ -66,7 +66,7 @@ LinkParent(GNode *cgn, GNode *pgn) Lst_AtEnd(&cgn->parents, pgn); if (!has_been_built(cgn)) pgn->children_left++; - else if ( ! (cgn->type & (OP_EXEC|OP_USE))) { + else if ( ! (cgn->type & OP_USE)) { if (cgn->built_status == REBUILT) pgn->child_rebuilt = true; (void)Make_TimeStamp(pgn, cgn); diff --git a/gnode.h b/gnode.h index 283fead..a787955 100644 --- a/gnode.h +++ b/gnode.h @@ -77,6 +77,8 @@ #define SPECIAL_NOTHING 6U /* this is used for things we * recognize for compatibility but * don't do anything with... */ +#define SPECIAL_DEPRECATED 7U /* this is an old keyword and it will + * trigger a fatal error. */ #define SPECIAL_INVISIBLE 8U #define SPECIAL_JOIN 9U #define SPECIAL_MADE 11U @@ -186,10 +188,6 @@ struct command #define OP_OPTIONAL 0x00000008 /* Don't care if the target doesn't * exist and can't be created */ #define OP_USE 0x00000010 /* Use associated commands for parents */ -#define OP_EXEC 0x00000020 /* Target is never out of date, but always - * execute commands anyway. Its time - * doesn't matter, so it has none...sort - * of */ #define OP_IGNORE 0x00000040 /* Ignore errors when creating the node */ #define OP_PRECIOUS 0x00000080 /* Don't remove the target when * interrupted */ @@ -198,13 +196,10 @@ struct command * commands should always be executed when * it is out of date, regardless of the * state of the -n or -t flags */ -#define OP_JOIN 0x00000400 /* Target is out-of-date only if any of its - * children was out-of-date */ -#define OP_MADE 0x00000800 /* Assume the node is already made; even if - * it really is out of date */ #define OP_INVISIBLE 0x00001000 /* The node is invisible to its parents. * I.e. it doesn't show up in the parents's - * local variables. */ + * local variables. Used by :: for + * supplementary nodes (cohorts). */ #define OP_NOTMAIN 0x00002000 /* The node is exempt from normal 'main * target' processing in parse.c */ #define OP_PHONY 0x00004000 /* Not a file target; run always */ @@ -232,7 +227,7 @@ struct command */ #define OP_NOP(t) (((t) & OP_OPMASK) == OP_ZERO) -#define OP_NOTARGET (OP_NOTMAIN|OP_USE|OP_EXEC|OP_TRANSFORM) +#define OP_NOTARGET (OP_NOTMAIN|OP_USE|OP_TRANSFORM) #endif diff --git a/make.1 b/make.1 index b653025..0b56a4f 100644 --- a/make.1 +++ b/make.1 @@ -1405,8 +1405,6 @@ Mark its prerequisites as Command lines attached to this target are executed if .Nm is interrupted by a SIGINT. -.It Ic .MADE -Mark its prerequisites as being up to date. .It Ic .MAKE Mark its prerequisites as .Dq Always build . diff --git a/make.c b/make.c index 1eff38e..1f0a7a2 100644 --- a/make.c +++ b/make.c @@ -279,7 +279,7 @@ Make_Update(GNode *cgn) /* the child node */ printf("%s--=%d ", pgn->name, pgn->children_left); - if ( ! (cgn->type & (OP_EXEC|OP_USE))) { + if ( ! (cgn->type & OP_USE)) { if (cgn->built_status == REBUILT) pgn->child_rebuilt = true; (void)Make_TimeStamp(pgn, cgn); @@ -388,15 +388,6 @@ try_to_make_node(GNode *gn) if (DEBUG(MAKE)) printf("up-to-date\n"); gn->built_status = UPTODATE; - if (gn->type & OP_JOIN) { - /* - * Even for an up-to-date .JOIN node, we need its - * local variables, so that we have the right - * value for .TARGET when computing the - * local variables of its parent(s)... - */ - Make_DoAllVar(gn); - } Make_Update(gn); } diff --git a/parse.c b/parse.c index dfc2abc..100a048 100644 --- a/parse.c +++ b/parse.c @@ -184,13 +184,13 @@ static struct { unsigned int special; unsigned int special_op; } specials[] = { - { P(NODE_EXEC), SPECIAL_EXEC, OP_EXEC }, + { P(NODE_EXEC), SPECIAL_DEPRECATED, 0 }, { P(NODE_IGNORE), SPECIAL_IGNORE, OP_IGNORE }, - { P(NODE_INCLUDES), SPECIAL_NOTHING, 0 }, - { P(NODE_INVISIBLE), SPECIAL_INVISIBLE, OP_INVISIBLE }, - { P(NODE_JOIN), SPECIAL_JOIN, OP_JOIN }, - { P(NODE_LIBS), SPECIAL_NOTHING, 0 }, - { P(NODE_MADE), SPECIAL_MADE, OP_MADE }, + { P(NODE_INCLUDES), SPECIAL_DEPRECATED, 0 }, + { P(NODE_INVISIBLE), SPECIAL_DEPRECATED, 0 }, + { P(NODE_JOIN), SPECIAL_DEPRECATED, 0 }, + { P(NODE_LIBS), SPECIAL_DEPRECATED, 0 }, + { P(NODE_MADE), SPECIAL_DEPRECATED, 0 }, { P(NODE_MAIN), SPECIAL_MAIN, 0 }, { P(NODE_MAKE), SPECIAL_MAKE, OP_MAKE }, { P(NODE_MAKEFLAGS), SPECIAL_MFLAGS, 0 }, @@ -198,7 +198,7 @@ static struct { { P(NODE_NOTMAIN), SPECIAL_NOTMAIN, OP_NOTMAIN }, { P(NODE_NOTPARALLEL), SPECIAL_NOTPARALLEL, 0 }, { P(NODE_NO_PARALLEL), SPECIAL_NOTPARALLEL, 0 }, - { P(NODE_NULL), SPECIAL_NOTHING, 0 }, + { P(NODE_NULL), SPECIAL_DEPRECATED, 0 }, { P(NODE_OPTIONAL), SPECIAL_OPTIONAL, OP_OPTIONAL }, { P(NODE_ORDER), SPECIAL_ORDER, 0 }, { P(NODE_PARALLEL), SPECIAL_PARALLEL, 0 }, @@ -418,6 +418,11 @@ ParseDoSrc( const char *esrc) { GNode *gn = Targ_FindNodei(src, esrc, TARG_CREATE); + if (gn->special == SPECIAL_DEPRECATED) { + Parse_Error(PARSE_FATAL, "Deprecated keyword found %s\n", + gn->name); + return; + } if (gn->special_op) { Array_ForEach(targets, ParseDoSpecial, gn->special_op); return; @@ -702,6 +707,13 @@ handle_special_targets(Lst paths) for (i = 0; i < gtargets.n; i++) { type = gtargets.a[i]->special; + if (type == SPECIAL_DEPRECATED) { + Parse_Error(PARSE_FATAL, + "Deprecated keyword found %s\n", + gtargets.a[i]->name); + specType = SPECIAL_ERROR; + return 0; + } if (type == SPECIAL_PATH) { seen_path++; Lst_AtEnd(paths, find_suffix_path(gtargets.a[i])); diff --git a/targ.c b/targ.c index bba0192..a8f3db6 100644 --- a/targ.c +++ b/targ.c @@ -307,12 +307,10 @@ Targ_PrintType(int type) switch (tbit) { PRINTBIT(OPTIONAL); PRINTBIT(USE); - PRINTBIT(EXEC); PRINTBIT(IGNORE); PRINTBIT(PRECIOUS); PRINTBIT(SILENT); PRINTBIT(MAKE); - PRINTBIT(JOIN); PRINTBIT(INVISIBLE); PRINTBIT(NOTMAIN); /*XXX: MEMBER is defined, so CONCAT(OP_,MEMBER) gives OP_"%" */