commit e886da2
shrub
·
2026-04-24 23:16:59 +0000 UTC
parent 4a88c5b
seed cli assigns and env override before makefile evaluation (+1080 test passes)
4 files changed,
+31,
-17
M
README
+1,
-1
1@@ -17,6 +17,6 @@ if you want to help out, there's lots to do. feel free to make a
2 contibution. some high-priority tasks are listed in the TODO file.
3
4 it is implemented in C99. the perl in this repo is just the gnu make
5-test suite (of which 880/3865 tests pass, at the time of writing)
6+test suite (of which 1960/3865 tests pass, at the time of writing)
7
8 this is public domain software
+9,
-1
1@@ -284,18 +284,26 @@ evalsnippet(struct EvalCtx *ctx, const char *path, const char *src)
2 }
3
4 int
5-eval(const struct Ast *ast, struct RuleSet *out)
6+eval(const struct Ast *ast, const struct Ast *pre, int envoverride, struct RuleSet *out)
7 {
8 struct Env env;
9 struct EvalCtx ctx;
10 int rc;
11
12 memset(out, 0, sizeof(*out));
13+ out->envoverride = envoverride;
14 memset(&env, 0, sizeof(env));
15 memset(&ctx, 0, sizeof(ctx));
16 seedenv(&env, 0, out->envoverride);
17 ctx.env = &env;
18 ctx.out = out;
19+ if (pre) {
20+ rc = evalnodes((const struct NodeList *)pre, out, &ctx);
21+ if (rc < 0) {
22+ freeenv(&env);
23+ return rc;
24+ }
25+ }
26 rc = evalnodes((const struct NodeList *)ast, out, &ctx);
27 freeenv(&env);
28 if (rc == 0 && ctx.errors)
+20,
-14
1@@ -479,18 +479,18 @@ static int
2 buildsubgraph0(struct SubGraph *sg, struct SubGraphStack *stack)
3 {
4 struct Ast ast;
5+ struct Ast pre;
6 struct RuleSet rs;
7 char *src;
8 char *path;
9 char *oldcwd;
10 char *key;
11 int rc;
12- size_t marked;
13- size_t k;
14 size_t i;
15 int envoverride;
16
17 memset(&ast, 0, sizeof(ast));
18+ memset(&pre, 0, sizeof(pre));
19 memset(&rs, 0, sizeof(rs));
20 freegraph(&sg->graph);
21 memset(&sg->graph, 0, sizeof(sg->graph));
22@@ -528,28 +528,33 @@ buildsubgraph0(struct SubGraph *sg, struct SubGraphStack *stack)
23 break;
24 }
25 }
26- src = appendassigns(src, &sg->assigns);
27+ if (sg->assigns.n) {
28+ char *assignsrc;
29+
30+ assignsrc = appendassigns(xstrdup(""), &sg->assigns);
31+ rc = parse("<command line>", assignsrc, &pre);
32+ free(assignsrc);
33+ if (rc < 0) {
34+ if (rc != -2)
35+ fprintf(stderr, "parse error in command line assignments\n");
36+ goto out;
37+ }
38+ for (i = 0; i < pre.n; i++) {
39+ if (pre.v[i].kind == NODE_ASSIGN)
40+ pre.v[i].data.assign.origin = ORIGIN_COMMAND;
41+ }
42+ }
43 rc = parse(path, src, &ast);
44 if (rc < 0) {
45 if (rc != -2)
46 fprintf(stderr, "parse error in %s/%s\n", sg->cwd, path);
47 goto out;
48 }
49- marked = 0;
50- k = ast.n;
51- while (k > 0 && marked < sg->assigns.n) {
52- k--;
53- if (ast.v[k].kind == NODE_ASSIGN) {
54- ast.v[k].data.assign.origin = ORIGIN_COMMAND;
55- marked++;
56- }
57- }
58- rc = eval(&ast, &rs);
59+ rc = eval(&ast, sg->assigns.n ? &pre : 0, envoverride, &rs);
60 if (rc < 0) {
61 fprintf(stderr, "eval error in %s/%s\n", sg->cwd, path);
62 goto out;
63 }
64- rs.envoverride = envoverride;
65 rc = buildgraph(&rs, &sg->graph);
66 if (rc < 0) {
67 fprintf(stderr, "graph error in %s/%s\n", sg->cwd, path);
68@@ -559,6 +564,7 @@ buildsubgraph0(struct SubGraph *sg, struct SubGraphStack *stack)
69 rc = expandsubgraphs(sg, stack);
70 out:
71 freeruleset(&rs);
72+ freeast(&pre);
73 freeast(&ast);
74 free(src);
75 free(path);
+1,
-1
1@@ -212,7 +212,7 @@ struct SubGraph {
2 int preproc(const char *path, struct Pre *pre);
3 void freepre(struct Pre *pre);
4 int buildast(const char *path, const struct Pre *pre, struct Ast *ast);
5-int eval(const struct Ast *ast, struct RuleSet *out);
6+int eval(const struct Ast *ast, const struct Ast *pre, int envoverride, struct RuleSet *out);
7 int parse(const char *path, const char *src, struct Ast *ast);
8 void freeast(struct Ast *ast);
9 void freeruleset(struct RuleSet *ruleset);