Skip to content

Commit f3107e2

Browse files
authored
Merge pull request #14344 from ziglang/config-header-step
zig build: enhance LibExeObjStep and ConfigHeaderStep
2 parents f4b4e57 + 65586b9 commit f3107e2

File tree

2 files changed

+79
-37
lines changed

2 files changed

+79
-37
lines changed

lib/std/build/ConfigHeaderStep.zig

Lines changed: 76 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
259+
fn 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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

477-
pub 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);
477+
pub 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,

0 commit comments

Comments
 (0)