authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-09-21 19:25:55-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-09-22 08:57:25+02:00
logb844605c524b9d7fe7327d7b95463ce70ed6fbf4
treedadc4abe23ea12c4d82fcc6de51bf1b93b70bd4a
parent41d3b9a3edacc7e0e903fffc5c912f7e69f30c3a

build system: translate-c supports arbitrary c flags

closes #35568

4 files changed, 18 insertions(+), 14 deletions(-)

lib/compiler/Maker/Step/TranslateC.zig+2-3
...@@ -59,9 +59,8 @@ pub fn make(...@@ -59,9 +59,8 @@ pub fn make(
59 for (0..conf_tc.include_dirs.len) |i|59 for (0..conf_tc.include_dirs.len) |i|
60 try Step.Compile.appendIncludeDirFlags(arena, conf_tc.include_dirs.get(conf.extra, i), &argv, step_index, maker);60 try Step.Compile.appendIncludeDirFlags(arena, conf_tc.include_dirs.get(conf.extra, i), &argv, step_index, maker);
6161
62 for (conf_tc.c_macros.slice) |c_macro| {62 try argv.ensureUnusedCapacity(arena, conf_tc.cc_argv.slice.len);
63 (try argv.addManyAsArray(arena, 2)).* = .{ "-D", c_macro.slice(conf) };63 for (conf_tc.cc_argv.slice) |arg| argv.appendAssumeCapacity(arg.slice(conf));
64 }
6564
66 var prev_search_strategy: std.Build.Module.SystemLib.SearchStrategy = .paths_first;65 var prev_search_strategy: std.Build.Module.SystemLib.SearchStrategy = .paths_first;
67 var prev_preferred_link_mode: std.builtin.LinkMode = .dynamic;66 var prev_preferred_link_mode: std.builtin.LinkMode = .dynamic;
lib/std/Build/Configuration.zig+2-2
...@@ -1402,14 +1402,14 @@ pub const Step = extern struct {...@@ -1402,14 +1402,14 @@ pub const Step = extern struct {
1402 output_file: GeneratedFileIndex,1402 output_file: GeneratedFileIndex,
1403 include_dirs: Storage.UnionList(.flags, .include_dirs, Module.IncludeDir),1403 include_dirs: Storage.UnionList(.flags, .include_dirs, Module.IncludeDir),
1404 system_libs: Storage.FlagLengthPrefixedList(.flags, .system_libs, SystemLib.Index),1404 system_libs: Storage.FlagLengthPrefixedList(.flags, .system_libs, SystemLib.Index),
1405 c_macros: Storage.FlagLengthPrefixedList(.flags, .c_macros, String),1405 cc_argv: Storage.FlagLengthPrefixedList(.flags, .cc_argv, String),
1406 target: ResolvedTarget.OptionalIndex,1406 target: ResolvedTarget.OptionalIndex,
14071407
1408 pub const Flags = packed struct(u32) {1408 pub const Flags = packed struct(u32) {
1409 tag: Tag = .translate_c,1409 tag: Tag = .translate_c,
1410 include_dirs: bool,1410 include_dirs: bool,
1411 system_libs: bool,1411 system_libs: bool,
1412 c_macros: bool,1412 cc_argv: bool,
1413 link_libc: bool,1413 link_libc: bool,
1414 optimize: Module.Optimize,1414 optimize: Module.Optimize,
1415 _: u20 = 0,1415 _: u20 = 0,
lib/std/Build/Serialize.zig+2-2
...@@ -357,7 +357,7 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi...@@ -357,7 +357,7 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi
357 .flags = .{357 .flags = .{
358 .include_dirs = tc.include_dirs.items.len != 0,358 .include_dirs = tc.include_dirs.items.len != 0,
359 .system_libs = system_libs.len != 0,359 .system_libs = system_libs.len != 0,
360 .c_macros = tc.c_macros.items.len != 0,360 .cc_argv = tc.cc_argv.items.len != 0,
361 .link_libc = tc.link_libc,361 .link_libc = tc.link_libc,
362 .optimize = .init(tc.optimize),362 .optimize = .init(tc.optimize),
363 },363 },
...@@ -365,7 +365,7 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi...@@ -365,7 +365,7 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi
365 .output_file = tc.output_file,365 .output_file = tc.output_file,
366 .include_dirs = .init(try s.initIncludeDirList(tc.include_dirs.items)),366 .include_dirs = .init(try s.initIncludeDirList(tc.include_dirs.items)),
367 .system_libs = .{ .slice = system_libs },367 .system_libs = .{ .slice = system_libs },
368 .c_macros = .{ .slice = tc.c_macros.items },368 .cc_argv = .{ .slice = tc.cc_argv.items },
369 .target = try addOptionalResolvedTarget(wc, tc.target),369 .target = try addOptionalResolvedTarget(wc, tc.target),
370 });370 });
371 },371 },
lib/std/Build/Step/TranslateC.zig+12-7
...@@ -11,7 +11,7 @@ step: Step,...@@ -11,7 +11,7 @@ step: Step,
11source: std.Build.LazyPath,11source: std.Build.LazyPath,
12include_dirs: std.ArrayList(std.Build.Module.IncludeDir) = .empty,12include_dirs: std.ArrayList(std.Build.Module.IncludeDir) = .empty,
13system_libs: std.ArrayList(std.Build.Module.SystemLib) = .empty,13system_libs: std.ArrayList(std.Build.Module.SystemLib) = .empty,
14c_macros: std.ArrayList(Configuration.String) = .empty,14cc_argv: std.ArrayList(Configuration.String) = .empty,
15target: std.Build.ResolvedTarget,15target: std.Build.ResolvedTarget,
16optimize: std.builtin.Optimize,16optimize: std.builtin.Optimize,
17output_file: Configuration.GeneratedFileIndex,17output_file: Configuration.GeneratedFileIndex,
...@@ -156,19 +156,24 @@ pub fn addCheckFile(translate_c: *TranslateC, expected_matches: []const []const...@@ -156,19 +156,24 @@ pub fn addCheckFile(translate_c: *TranslateC, expected_matches: []const []const
156pub fn defineCMacro(translate_c: *TranslateC, name: []const u8, value: ?[]const u8) void {156pub fn defineCMacro(translate_c: *TranslateC, name: []const u8, value: ?[]const u8) void {
157 const graph = translate_c.step.owner.graph;157 const graph = translate_c.step.owner.graph;
158 const arena = graph.arena;158 const arena = graph.arena;
159 const wc = &graph.wip_configuration;159 return addCFlags(translate_c, &.{
160 const macro = arena.print("{s}={s}", .{ name, value orelse "1" }) catch @panic("OOM");160 "-D",
161 const macro_string = wc.addString(macro) catch @panic("OOM");161 arena.print("{s}={s}", .{ name, value orelse "1" }) catch @panic("OOM"),
162 translate_c.c_macros.append(arena, macro_string) catch @panic("OOM");162 });
163}163}
164164
165/// name_and_value looks like [name]=[value].165/// name_and_value looks like [name]=[value].
166pub fn defineCMacroRaw(translate_c: *TranslateC, name_and_value: []const u8) void {166pub fn defineCMacroRaw(translate_c: *TranslateC, name_and_value: []const u8) void {
167 return addCFlags(translate_c, &.{ "-D", name_and_value });
168}
169
170/// Append arbitrary C compiler CLI arguments to the translation unit.
171pub fn addCFlags(translate_c: *TranslateC, args: []const []const u8) void {
167 const graph = translate_c.step.owner.graph;172 const graph = translate_c.step.owner.graph;
168 const arena = graph.arena;173 const arena = graph.arena;
169 const wc = &graph.wip_configuration;174 const wc = &graph.wip_configuration;
170 const macro_string = wc.addString(name_and_value) catch @panic("OOM");175 translate_c.cc_argv.ensureUnusedCapacity(arena, args.len) catch @panic("OOM");
171 translate_c.c_macros.append(arena, macro_string) catch @panic("OOM");176 for (args) |arg| translate_c.cc_argv.appendAssumeCapacity(wc.addString(arg) catch @panic("OOM"));
172}177}
173178
174pub fn linkSystemLibrary(179pub fn linkSystemLibrary(