authorgravatar for techatrix@mailbox.orgTechatrix <techatrix@mailbox.org> 2025-02-19 09:03:56+01:00
committergravatar for techatrix@mailbox.orgTechatrix <techatrix@mailbox.org> 2025-02-19 09:34:26+01:00
log7e548af8b1527d2d04de1c12df9bf8afd1ad23ea
tree4d0076eadb4163d6495d2e9dd7053378350f5da0
parentc390f55e727c8f4ace2eb7992403bf8332a22126
signaturebadge-check Signed by SSH key SHA256:HYC3SjXQcAt6uwv9pu/6OoVQ2rUH8rb5zKiUHSe9uxk

std.Build.Step.ConfigHeader: allow using autoconf values multiple times


3 files changed, 17 insertions(+), 6 deletions(-)

lib/std/Build/Step/ConfigHeader.zig+11-6
...@@ -264,8 +264,11 @@ fn render_autoconf(...@@ -264,8 +264,11 @@ fn render_autoconf(
264 values: std.StringArrayHashMap(Value),264 values: std.StringArrayHashMap(Value),
265 src_path: []const u8,265 src_path: []const u8,
266) !void {266) !void {
267 var values_copy = try values.clone();267 const build = step.owner;
268 defer values_copy.deinit();268 const allocator = build.allocator;
269
270 var is_used: std.DynamicBitSetUnmanaged = try .initEmpty(allocator, values.count());
271 defer is_used.deinit(allocator);
269272
270 var any_errors = false;273 var any_errors = false;
271 var line_index: u32 = 0;274 var line_index: u32 = 0;
...@@ -284,18 +287,20 @@ fn render_autoconf(...@@ -284,18 +287,20 @@ fn render_autoconf(
284 continue;287 continue;
285 }288 }
286 const name = it.rest();289 const name = it.rest();
287 const kv = values_copy.fetchSwapRemove(name) orelse {290 const index = values.getIndex(name) orelse {
288 try step.addError("{s}:{d}: error: unspecified config header value: '{s}'", .{291 try step.addError("{s}:{d}: error: unspecified config header value: '{s}'", .{
289 src_path, line_index + 1, name,292 src_path, line_index + 1, name,
290 });293 });
291 any_errors = true;294 any_errors = true;
292 continue;295 continue;
293 };296 };
294 try renderValueC(output, name, kv.value);297 is_used.set(index);
298 try renderValueC(output, name, values.values()[index]);
295 }299 }
296300
297 for (values_copy.keys()) |name| {301 var unused_value_it = is_used.iterator(.{ .kind = .unset });
298 try step.addError("{s}: error: config header value unused: '{s}'", .{ src_path, name });302 while (unused_value_it.next()) |index| {
303 try step.addError("{s}: error: config header value unused: '{s}'", .{ src_path, values.keys()[index] });
299 any_errors = true;304 any_errors = true;
300 }305 }
301306
test/standalone/config_header/config.h+3
...@@ -12,3 +12,6 @@ int foo();...@@ -12,3 +12,6 @@ int foo();
12#define SOME_ENUM_LITERAL test12#define SOME_ENUM_LITERAL test
13#define SOME_STRING "test"13#define SOME_STRING "test"
1414
15// Used twice
16#define SOME_TRUE 1
17
test/standalone/config_header/config.h.in+3
...@@ -10,3 +10,6 @@ int foo();...@@ -10,3 +10,6 @@ int foo();
10#undef SOME_TEN10#undef SOME_TEN
11#undef SOME_ENUM_LITERAL11#undef SOME_ENUM_LITERAL
12#undef SOME_STRING12#undef SOME_STRING
13
14// Used twice
15#undef SOME_TRUE