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
signaturebadge-question-mark 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(...@@ -188,34 +188,7 @@ fn render_autoconf(
188 any_errors = true;188 any_errors = true;
189 continue;189 continue;
190 };190 };
191 switch (kv.value) {191 try renderValue(output, name, 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 }
219 }192 }
220193
221 {194 {
...@@ -237,9 +210,79 @@ fn render_cmake(...@@ -237,9 +210,79 @@ fn render_cmake(
237 values_copy: *std.StringHashMap(Value),210 values_copy: *std.StringHashMap(Value),
238 src_path: []const u8,211 src_path: []const u8,
239) !void {212) !void {
240 _ = contents;213 var any_errors = false;
241 _ = output;214 var line_index: u32 = 0;
242 _ = values_copy;215 var line_it = std.mem.split(u8, contents, "\n");
243 _ = src_path;216 while (line_it.next()) |line| : (line_index += 1) {
244 @panic("TODO: render_cmake is not implemented yet");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 }
245}288}
lib/std/build/LibExeObjStep.zig+3-4
...@@ -474,9 +474,8 @@ pub fn installRaw(self: *LibExeObjStep, dest_filename: []const u8, options: Inst...@@ -474,9 +474,8 @@ pub fn installRaw(self: *LibExeObjStep, dest_filename: []const u8, options: Inst
474 return self.builder.installRaw(self, dest_filename, options);474 return self.builder.installRaw(self, dest_filename, options);
475}475}
476476
477pub fn installHeader(a: *LibExeObjStep, src_path: []const u8) void {477pub fn installHeader(a: *LibExeObjStep, src_path: []const u8, dest_rel_path: []const u8) void {
478 const basename = fs.path.basename(src_path);478 const install_file = a.builder.addInstallHeaderFile(src_path, dest_rel_path);
479 const install_file = a.builder.addInstallHeaderFile(src_path, basename);
480 a.builder.getInstallStep().dependOn(&install_file.step);479 a.builder.getInstallStep().dependOn(&install_file.step);
481 a.installed_headers.append(&install_file.step) catch unreachable;480 a.installed_headers.append(&install_file.step) catch unreachable;
482}481}
...@@ -486,7 +485,7 @@ pub fn installHeadersDirectory(...@@ -486,7 +485,7 @@ pub fn installHeadersDirectory(
486 src_dir_path: []const u8,485 src_dir_path: []const u8,
487 dest_rel_path: []const u8,486 dest_rel_path: []const u8,
488) void {487) void {
489 return a.builder.addInstallDirectoryOptions(.{488 return installHeadersDirectoryOptions(a, .{
490 .source_dir = src_dir_path,489 .source_dir = src_dir_path,
491 .install_dir = .header,490 .install_dir = .header,
492 .install_subdir = dest_rel_path,491 .install_subdir = dest_rel_path,