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
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);