diff --git a/lib/compiler/Maker/Step/TranslateC.zig b/lib/compiler/Maker/Step/TranslateC.zig index d3605c0dcb47993452f05dfddb30dcaede927ea0..fa3f2189a11e23781d559f1175cd57f1e5cfc7aa 100644 --- a/lib/compiler/Maker/Step/TranslateC.zig +++ b/lib/compiler/Maker/Step/TranslateC.zig @@ -59,9 +59,8 @@ pub fn make( for (0..conf_tc.include_dirs.len) |i| try Step.Compile.appendIncludeDirFlags(arena, conf_tc.include_dirs.get(conf.extra, i), &argv, step_index, maker); - for (conf_tc.c_macros.slice) |c_macro| { - (try argv.addManyAsArray(arena, 2)).* = .{ "-D", c_macro.slice(conf) }; - } + try argv.ensureUnusedCapacity(arena, conf_tc.cc_argv.slice.len); + for (conf_tc.cc_argv.slice) |arg| argv.appendAssumeCapacity(arg.slice(conf)); var prev_search_strategy: std.Build.Module.SystemLib.SearchStrategy = .paths_first; var prev_preferred_link_mode: std.builtin.LinkMode = .dynamic; diff --git a/lib/std/Build/Configuration.zig b/lib/std/Build/Configuration.zig index a902374974e43dba5cac3bf2653b067d1f1c2956..efcd9d86ed32f16d6cb1b24427f098fbcbf94747 100644 --- a/lib/std/Build/Configuration.zig +++ b/lib/std/Build/Configuration.zig @@ -1402,14 +1402,14 @@ pub const Step = extern struct { output_file: GeneratedFileIndex, include_dirs: Storage.UnionList(.flags, .include_dirs, Module.IncludeDir), system_libs: Storage.FlagLengthPrefixedList(.flags, .system_libs, SystemLib.Index), - c_macros: Storage.FlagLengthPrefixedList(.flags, .c_macros, String), + cc_argv: Storage.FlagLengthPrefixedList(.flags, .cc_argv, String), target: ResolvedTarget.OptionalIndex, pub const Flags = packed struct(u32) { tag: Tag = .translate_c, include_dirs: bool, system_libs: bool, - c_macros: bool, + cc_argv: bool, link_libc: bool, optimize: Module.Optimize, _: u20 = 0, diff --git a/lib/std/Build/Serialize.zig b/lib/std/Build/Serialize.zig index 4910fd954f044b23ff9a97957cdac124a1b9521a..eae93e66e46515fc5d5f3e33634966cc6cc9bbaf 100644 --- a/lib/std/Build/Serialize.zig +++ b/lib/std/Build/Serialize.zig @@ -357,7 +357,7 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi .flags = .{ .include_dirs = tc.include_dirs.items.len != 0, .system_libs = system_libs.len != 0, - .c_macros = tc.c_macros.items.len != 0, + .cc_argv = tc.cc_argv.items.len != 0, .link_libc = tc.link_libc, .optimize = .init(tc.optimize), }, @@ -365,7 +365,7 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi .output_file = tc.output_file, .include_dirs = .init(try s.initIncludeDirList(tc.include_dirs.items)), .system_libs = .{ .slice = system_libs }, - .c_macros = .{ .slice = tc.c_macros.items }, + .cc_argv = .{ .slice = tc.cc_argv.items }, .target = try addOptionalResolvedTarget(wc, tc.target), }); }, diff --git a/lib/std/Build/Step/TranslateC.zig b/lib/std/Build/Step/TranslateC.zig index fbe89039894c8575fee6e24ac7ace02b20232a8a..6af505dc48627f8550e22af194cfad57dc259653 100644 --- a/lib/std/Build/Step/TranslateC.zig +++ b/lib/std/Build/Step/TranslateC.zig @@ -11,7 +11,7 @@ step: Step, source: std.Build.LazyPath, include_dirs: std.ArrayList(std.Build.Module.IncludeDir) = .empty, system_libs: std.ArrayList(std.Build.Module.SystemLib) = .empty, -c_macros: std.ArrayList(Configuration.String) = .empty, +cc_argv: std.ArrayList(Configuration.String) = .empty, target: std.Build.ResolvedTarget, optimize: std.builtin.Optimize, output_file: Configuration.GeneratedFileIndex, @@ -156,19 +156,24 @@ pub fn addCheckFile(translate_c: *TranslateC, expected_matches: []const []const pub fn defineCMacro(translate_c: *TranslateC, name: []const u8, value: ?[]const u8) void { const graph = translate_c.step.owner.graph; const arena = graph.arena; - const wc = &graph.wip_configuration; - const macro = arena.print("{s}={s}", .{ name, value orelse "1" }) catch @panic("OOM"); - const macro_string = wc.addString(macro) catch @panic("OOM"); - translate_c.c_macros.append(arena, macro_string) catch @panic("OOM"); + return addCFlags(translate_c, &.{ + "-D", + arena.print("{s}={s}", .{ name, value orelse "1" }) catch @panic("OOM"), + }); } /// name_and_value looks like [name]=[value]. pub fn defineCMacroRaw(translate_c: *TranslateC, name_and_value: []const u8) void { + return addCFlags(translate_c, &.{ "-D", name_and_value }); +} + +/// Append arbitrary C compiler CLI arguments to the translation unit. +pub fn addCFlags(translate_c: *TranslateC, args: []const []const u8) void { const graph = translate_c.step.owner.graph; const arena = graph.arena; const wc = &graph.wip_configuration; - const macro_string = wc.addString(name_and_value) catch @panic("OOM"); - translate_c.c_macros.append(arena, macro_string) catch @panic("OOM"); + translate_c.cc_argv.ensureUnusedCapacity(arena, args.len) catch @panic("OOM"); + for (args) |arg| translate_c.cc_argv.appendAssumeCapacity(wc.addString(arg) catch @panic("OOM")); } pub fn linkSystemLibrary(