authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-01-17 08:10:36-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-01-17 08:10:36-05:00
logf3107e2cb2b0fb3c97ce4c567d670134b91b400c
treea1e1fa351321ef979a3e0b3fb16b868f967a8a7d
parentf4b4e570d87c53d31cb4bee27b0468bdc8b826ae
parent65586b9869f2f4ed9dfb4d90d6cad3f3e9912f79
signature Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #14344 from ziglang/config-header-step

zig build: enhance LibExeObjStep and ConfigHeaderStep

2 files changed, 79 insertions(+), 37 deletions(-)

lib/std/build/ConfigHeaderStep.zig+76-33
......@@ -188,34 +188,7 @@ fn render_autoconf(
188188 any_errors = true;
189189 continue;
190190 };
191 switch (kv.value) {
192 .undef => {
193 try output.appendSlice("/* #undef ");
194 try output.appendSlice(name);
195 try output.appendSlice(" */\n");
196 },
197 .defined => {
198 try output.appendSlice("#define ");
199 try output.appendSlice(name);
200 try output.appendSlice("\n");
201 },
202 .boolean => |b| {
203 try output.appendSlice("#define ");
204 try output.appendSlice(name);
205 try output.appendSlice(" ");
206 try output.appendSlice(if (b) "true\n" else "false\n");
207 },
208 .int => |i| {
209 try output.writer().print("#define {s} {d}\n", .{ name, i });
210 },
211 .ident => |ident| {
212 try output.writer().print("#define {s} {s}\n", .{ name, ident });
213 },
214 .string => |string| {
215 // TODO: use C-specific escaping instead of zig string literals
216 try output.writer().print("#define {s} \"{}\"\n", .{ name, std.zig.fmtEscapes(string) });
217 },
218 }
191 try renderValue(output, name, kv.value);
219192 }
220193
221194 {
......@@ -237,9 +210,79 @@ fn render_cmake(
237210 values_copy: *std.StringHashMap(Value),
238211 src_path: []const u8,
239212) !void {
240 _ = contents;
241 _ = output;
242 _ = values_copy;
243 _ = src_path;
244 @panic("TODO: render_cmake is not implemented yet");
213 var any_errors = false;
214 var line_index: u32 = 0;
215 var line_it = std.mem.split(u8, contents, "\n");
216 while (line_it.next()) |line| : (line_index += 1) {
217 if (!std.mem.startsWith(u8, line, "#")) {
218 try output.appendSlice(line);
219 try output.appendSlice("\n");
220 continue;
221 }
222 var it = std.mem.tokenize(u8, line[1..], " \t\r");
223 const cmakedefine = it.next().?;
224 if (!std.mem.eql(u8, cmakedefine, "cmakedefine")) {
225 try output.appendSlice(line);
226 try output.appendSlice("\n");
227 continue;
228 }
229 const name = it.next() orelse {
230 std.debug.print("{s}:{d}: error: missing define name\n", .{
231 src_path, line_index + 1,
232 });
233 any_errors = true;
234 continue;
235 };
236 const kv = values_copy.fetchRemove(name) orelse {
237 std.debug.print("{s}:{d}: error: unspecified config header value: '{s}'\n", .{
238 src_path, line_index + 1, name,
239 });
240 any_errors = true;
241 continue;
242 };
243 try renderValue(output, name, kv.value);
244 }
245
246 {
247 var it = values_copy.iterator();
248 while (it.next()) |entry| {
249 const name = entry.key_ptr.*;
250 std.debug.print("{s}: error: config header value unused: '{s}'\n", .{ src_path, name });
251 }
252 }
253
254 if (any_errors) {
255 return error.HeaderConfigFailed;
256 }
257}
258
259fn renderValue(output: *std.ArrayList(u8), name: []const u8, value: Value) !void {
260 switch (value) {
261 .undef => {
262 try output.appendSlice("/* #undef ");
263 try output.appendSlice(name);
264 try output.appendSlice(" */\n");
265 },
266 .defined => {
267 try output.appendSlice("#define ");
268 try output.appendSlice(name);
269 try output.appendSlice("\n");
270 },
271 .boolean => |b| {
272 try output.appendSlice("#define ");
273 try output.appendSlice(name);
274 try output.appendSlice(" ");
275 try output.appendSlice(if (b) "true\n" else "false\n");
276 },
277 .int => |i| {
278 try output.writer().print("#define {s} {d}\n", .{ name, i });
279 },
280 .ident => |ident| {
281 try output.writer().print("#define {s} {s}\n", .{ name, ident });
282 },
283 .string => |string| {
284 // TODO: use C-specific escaping instead of zig string literals
285 try output.writer().print("#define {s} \"{}\"\n", .{ name, std.zig.fmtEscapes(string) });
286 },
287 }
245288}
lib/std/build/LibExeObjStep.zig+3-4
......@@ -474,9 +474,8 @@ pub fn installRaw(self: *LibExeObjStep, dest_filename: []const u8, options: Inst
474474 return self.builder.installRaw(self, dest_filename, options);
475475}
476476
477pub fn installHeader(a: *LibExeObjStep, src_path: []const u8) void {
478 const basename = fs.path.basename(src_path);
479 const install_file = a.builder.addInstallHeaderFile(src_path, basename);
477pub fn installHeader(a: *LibExeObjStep, src_path: []const u8, dest_rel_path: []const u8) void {
478 const install_file = a.builder.addInstallHeaderFile(src_path, dest_rel_path);
480479 a.builder.getInstallStep().dependOn(&install_file.step);
481480 a.installed_headers.append(&install_file.step) catch unreachable;
482481}
......@@ -486,7 +485,7 @@ pub fn installHeadersDirectory(
486485 src_dir_path: []const u8,
487486 dest_rel_path: []const u8,
488487) void {
489 return a.builder.addInstallDirectoryOptions(.{
488 return installHeadersDirectoryOptions(a, .{
490489 .source_dir = src_dir_path,
491490 .install_dir = .header,
492491 .install_subdir = dest_rel_path,