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
+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