commit 2d98333

shrub  ·  2026-04-12 19:08:41 +0000 UTC
parent cb7ea0c
be less picky about rule lookup for targets, make sure default sufrules can be overridden, make instsufrule resolve the inferred source not the explicit
4 files changed,  +42, -14
A TODO
A TODO
+0, -0
+9, -9
 1@@ -291,15 +291,15 @@ struct func {
 2 };
 3 
 4 static const struct func funcs[] = {
 5-	{"wildcard",   1, {.f1 = fnwildcard}},
 6-	{"shell",      1, {.f1 = fnshell}},
 7-	{"sort",       1, {.f1 = fnsort}},
 8-	{"info",       1, {.f1 = fninfo}},
 9-	{"filter-out", 2, {.f2 = fnfilterout}},
10-	{"filter",     2, {.f2 = fnfilter}},
11-	{"addprefix",  2, {.f2 = fnaddprefix}},
12-	{"addsuffix",  2, {.f2 = fnaddsuffix}},
13-	{0, 0, {.f1 = 0}},
14+    {"wildcard", 1, {.f1 = fnwildcard}},
15+    {"shell", 1, {.f1 = fnshell}},
16+    {"sort", 1, {.f1 = fnsort}},
17+    {"info", 1, {.f1 = fninfo}},
18+    {"filter-out", 2, {.f2 = fnfilterout}},
19+    {"filter", 2, {.f2 = fnfilter}},
20+    {"addprefix", 2, {.f2 = fnaddprefix}},
21+    {"addsuffix", 2, {.f2 = fnaddsuffix}},
22+    {0, 0, {.f1 = 0}},
23 };
24 
25 static char *
+2, -3
 1@@ -185,9 +185,8 @@ buildgraph(const struct Ast *ast, struct Graph *graph)
 2 		for (i = start; i < current_n; i++) {
 3 			struct Target *t = &graph->v[i];
 4 			size_t nprereqs;
 5-			/* for placeholder targets with no recipe or prereqs,
 6-			 * try a pattern rule or suffix rule */
 7-			if (t->recipes.n == 0 && t->prereqs.n == 0 && t->order_only.n == 0) {
 8+			/* for targets with no recipe, try a pattern rule or suffix rule */
 9+			if (t->recipes.n == 0) {
10 				int matched;
11 				struct Env env;
12 
+31, -2
 1@@ -177,8 +177,18 @@ collectsufrule(struct SufRules *rules, const struct RuleNode *rule)
 2 	if (rule->targets.n != 1 || rule->prereqs.n != 0 || rule->order_only.n != 0)
 3 		return 0;
 4 	if (issinglesuf(rule->targets.v[0], &from)) {
 5+		size_t k;
 6 		struct SingleSufRule *sr;
 7 
 8+		for (k = 0; k < rules->nsinglesuf; k++) {
 9+			if (strcmp(rules->singlesuf[k].from, from) == 0) {
10+				free(from);
11+				freerecipes(&rules->singlesuf[k].recipes);
12+				memset(&rules->singlesuf[k].recipes, 0, sizeof(rules->singlesuf[k].recipes));
13+				addrecipes(&rules->singlesuf[k].recipes, &rule->recipes);
14+				return 1;
15+			}
16+		}
17 		rules->singlesuf = xrealloc(rules->singlesuf,
18 		                            (rules->nsinglesuf + 1) * sizeof(rules->singlesuf[0]));
19 		sr = &rules->singlesuf[rules->nsinglesuf++];
20@@ -189,6 +199,21 @@ collectsufrule(struct SufRules *rules, const struct RuleNode *rule)
21 	}
22 	if (!issuf(rule->targets.v[0], &from, &to))
23 		return 0;
24+	{
25+		size_t k;
26+
27+		for (k = 0; k < rules->nsufs; k++) {
28+			if (strcmp(rules->sufs[k].from, from) == 0 &&
29+			    strcmp(rules->sufs[k].to, to) == 0) {
30+				free(from);
31+				free(to);
32+				freerecipes(&rules->sufs[k].recipes);
33+				memset(&rules->sufs[k].recipes, 0, sizeof(rules->sufs[k].recipes));
34+				addrecipes(&rules->sufs[k].recipes, &rule->recipes);
35+				return 1;
36+			}
37+		}
38+	}
39 	rules->sufs = xrealloc(rules->sufs, (rules->nsufs + 1) * sizeof(rules->sufs[0]));
40 	memset(&rules->sufs[rules->nsufs], 0, sizeof(rules->sufs[rules->nsufs]));
41 	rules->sufs[rules->nsufs].from = from;
42@@ -213,7 +238,9 @@ instsufrule(const struct SufRules *rules,
43 			continue;
44 		src = cat3(stem, "", rules->sufs[i].from);
45 		t->prereqs.v = xrealloc(t->prereqs.v, (t->prereqs.n + 1) * sizeof(t->prereqs.v[0]));
46-		t->prereqs.v[t->prereqs.n++] = src;
47+		memmove(t->prereqs.v + 1, t->prereqs.v, t->prereqs.n * sizeof(t->prereqs.v[0]));
48+		t->prereqs.v[0] = src;
49+		t->prereqs.n++;
50 		for (k = 0; k < rules->sufs[i].recipes.n; k++) {
51 			char *vars, *exp;
52 
53@@ -242,7 +269,9 @@ instsufrule(const struct SufRules *rules,
54 			continue;
55 		}
56 		t->prereqs.v = xrealloc(t->prereqs.v, (t->prereqs.n + 1) * sizeof(t->prereqs.v[0]));
57-		t->prereqs.v[t->prereqs.n++] = src;
58+		memmove(t->prereqs.v + 1, t->prereqs.v, t->prereqs.n * sizeof(t->prereqs.v[0]));
59+		t->prereqs.v[0] = src;
60+		t->prereqs.n++;
61 		for (k = 0; k < rules->singlesuf[i].recipes.n; k++) {
62 			char *vars, *exp;
63