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 {
100100 return config_header;
101101}
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
103107pub 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 }
105111}
106112
107113pub fn getOutput(config_header: *ConfigHeader) std.Build.LazyPath {
108114 return .{ .generated = .{ .file = &config_header.output_file } };
109115}
110116
111fn addValuesInner(config_header: *ConfigHeader, values: anytype) !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 {
117fn addValueInner(config_header: *ConfigHeader, name: []const u8, comptime T: type, value: T) !void {
118118 switch (@typeInfo(T)) {
119119 .null => {
120 try config_header.values.put(field_name, .undef);
120 try config_header.values.put(name, .undef);
121121 },
122122 .void => {
123 try config_header.values.put(field_name, .defined);
123 try config_header.values.put(name, .defined);
124124 },
125125 .bool => {
126 try config_header.values.put(field_name, .{ .boolean = v });
126 try config_header.values.put(name, .{ .boolean = value });
127127 },
128128 .int => {
129 try config_header.values.put(field_name, .{ .int = v });
129 try config_header.values.put(name, .{ .int = value });
130130 },
131131 .comptime_int => {
132 try config_header.values.put(field_name, .{ .int = v });
132 try config_header.values.put(name, .{ .int = value });
133133 },
134134 .@"enum", .enum_literal => {
135 try config_header.values.put(field_name, .{ .ident = @tagName(v) });
135 try config_header.values.put(name, .{ .ident = @tagName(value) });
136136 },
137137 .optional => {
138 if (v) |x| {
139 return putValue(config_header, field_name, @TypeOf(x), x);
138 if (value) |x| {
139 return addValueInner(config_header, name, @TypeOf(x), x);
140140 } else {
141 try config_header.values.put(field_name, .undef);
141 try config_header.values.put(name, .undef);
142142 }
143143 },
144144 .pointer => |ptr| {
145145 switch (@typeInfo(ptr.child)) {
146146 .array => |array| {
147147 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 });
149149 return;
150150 }
151151 },
152152 .int => {
153153 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 });
155155 return;
156156 }
157157 },