authorgravatar for cbilz@posteo.netConstantin Bilz <cbilz@posteo.net> 2025-02-06 18:56:48+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-02-22 23:31:17-05:00
log75b05386885de30ffdb4c21f6fd084500bf4fd55
tree87970b922bc79839f4c146f9ee2d4f42792457ff
parent77007445bf94f59b88db0ec6a9f0e76edafe2b74

std.Build: Allow ConfigHeader values to be added at build.zig runtime


1 files changed, 19 insertions(+), 19 deletions(-)

lib/std/Build/Step/ConfigHeader.zig+19-19
...@@ -100,58 +100,58 @@ pub fn create(owner: *std.Build, options: Options) *ConfigHeader {...@@ -100,58 +100,58 @@ pub fn create(owner: *std.Build, options: Options) *ConfigHeader {
100 return config_header;100 return config_header;
101}101}
102102
103pub fn addValue(config_header: *ConfigHeader, name: []const u8, comptime T: type, value: T) void {
104 return addValueInner(config_header, name, T, value) catch @panic("OOM");
105}
106
103pub fn addValues(config_header: *ConfigHeader, values: anytype) void {107pub fn addValues(config_header: *ConfigHeader, values: anytype) void {
104 return addValuesInner(config_header, values) catch @panic("OOM");108 inline for (@typeInfo(@TypeOf(values)).@"struct".fields) |field| {
109 addValue(config_header, field.name, field.type, @field(values, field.name));
110 }
105}111}
106112
107pub fn getOutput(config_header: *ConfigHeader) std.Build.LazyPath {113pub fn getOutput(config_header: *ConfigHeader) std.Build.LazyPath {
108 return .{ .generated = .{ .file = &config_header.output_file } };114 return .{ .generated = .{ .file = &config_header.output_file } };
109}115}
110116
111fn addValuesInner(config_header: *ConfigHeader, values: anytype) !void {117fn addValueInner(config_header: *ConfigHeader, name: []const u8, comptime T: type, value: T) !void {
112 inline for (@typeInfo(@TypeOf(values)).@"struct".fields) |field| {
113 try putValue(config_header, field.name, field.type, @field(values, field.name));
114 }
115}
116
117fn putValue(config_header: *ConfigHeader, field_name: []const u8, comptime T: type, v: T) !void {
118 switch (@typeInfo(T)) {118 switch (@typeInfo(T)) {
119 .null => {119 .null => {
120 try config_header.values.put(field_name, .undef);120 try config_header.values.put(name, .undef);
121 },121 },
122 .void => {122 .void => {
123 try config_header.values.put(field_name, .defined);123 try config_header.values.put(name, .defined);
124 },124 },
125 .bool => {125 .bool => {
126 try config_header.values.put(field_name, .{ .boolean = v });126 try config_header.values.put(name, .{ .boolean = value });
127 },127 },
128 .int => {128 .int => {
129 try config_header.values.put(field_name, .{ .int = v });129 try config_header.values.put(name, .{ .int = value });
130 },130 },
131 .comptime_int => {131 .comptime_int => {
132 try config_header.values.put(field_name, .{ .int = v });132 try config_header.values.put(name, .{ .int = value });
133 },133 },
134 .@"enum", .enum_literal => {134 .@"enum", .enum_literal => {
135 try config_header.values.put(field_name, .{ .ident = @tagName(v) });135 try config_header.values.put(name, .{ .ident = @tagName(value) });
136 },136 },
137 .optional => {137 .optional => {
138 if (v) |x| {138 if (value) |x| {
139 return putValue(config_header, field_name, @TypeOf(x), x);139 return addValueInner(config_header, name, @TypeOf(x), x);
140 } else {140 } else {
141 try config_header.values.put(field_name, .undef);141 try config_header.values.put(name, .undef);
142 }142 }
143 },143 },
144 .pointer => |ptr| {144 .pointer => |ptr| {
145 switch (@typeInfo(ptr.child)) {145 switch (@typeInfo(ptr.child)) {
146 .array => |array| {146 .array => |array| {
147 if (ptr.size == .one and array.child == u8) {147 if (ptr.size == .one and array.child == u8) {
148 try config_header.values.put(field_name, .{ .string = v });148 try config_header.values.put(name, .{ .string = value });
149 return;149 return;
150 }150 }
151 },151 },
152 .int => {152 .int => {
153 if (ptr.size == .slice and ptr.child == u8) {153 if (ptr.size == .slice and ptr.child == u8) {
154 try config_header.values.put(field_name, .{ .string = v });154 try config_header.values.put(name, .{ .string = value });
155 return;155 return;
156 }156 }
157 },157 },