mirror of
https://github.com/ziglang/zig.git
synced 2026-02-12 20:37:54 +00:00
Merge pull request #14344 from ziglang/config-header-step
zig build: enhance LibExeObjStep and ConfigHeaderStep
This commit is contained in:
commit
f3107e2cb2
@ -188,34 +188,7 @@ fn render_autoconf(
|
||||
any_errors = true;
|
||||
continue;
|
||||
};
|
||||
switch (kv.value) {
|
||||
.undef => {
|
||||
try output.appendSlice("/* #undef ");
|
||||
try output.appendSlice(name);
|
||||
try output.appendSlice(" */\n");
|
||||
},
|
||||
.defined => {
|
||||
try output.appendSlice("#define ");
|
||||
try output.appendSlice(name);
|
||||
try output.appendSlice("\n");
|
||||
},
|
||||
.boolean => |b| {
|
||||
try output.appendSlice("#define ");
|
||||
try output.appendSlice(name);
|
||||
try output.appendSlice(" ");
|
||||
try output.appendSlice(if (b) "true\n" else "false\n");
|
||||
},
|
||||
.int => |i| {
|
||||
try output.writer().print("#define {s} {d}\n", .{ name, i });
|
||||
},
|
||||
.ident => |ident| {
|
||||
try output.writer().print("#define {s} {s}\n", .{ name, ident });
|
||||
},
|
||||
.string => |string| {
|
||||
// TODO: use C-specific escaping instead of zig string literals
|
||||
try output.writer().print("#define {s} \"{}\"\n", .{ name, std.zig.fmtEscapes(string) });
|
||||
},
|
||||
}
|
||||
try renderValue(output, name, kv.value);
|
||||
}
|
||||
|
||||
{
|
||||
@ -237,9 +210,79 @@ fn render_cmake(
|
||||
values_copy: *std.StringHashMap(Value),
|
||||
src_path: []const u8,
|
||||
) !void {
|
||||
_ = contents;
|
||||
_ = output;
|
||||
_ = values_copy;
|
||||
_ = src_path;
|
||||
@panic("TODO: render_cmake is not implemented yet");
|
||||
var any_errors = false;
|
||||
var line_index: u32 = 0;
|
||||
var line_it = std.mem.split(u8, contents, "\n");
|
||||
while (line_it.next()) |line| : (line_index += 1) {
|
||||
if (!std.mem.startsWith(u8, line, "#")) {
|
||||
try output.appendSlice(line);
|
||||
try output.appendSlice("\n");
|
||||
continue;
|
||||
}
|
||||
var it = std.mem.tokenize(u8, line[1..], " \t\r");
|
||||
const cmakedefine = it.next().?;
|
||||
if (!std.mem.eql(u8, cmakedefine, "cmakedefine")) {
|
||||
try output.appendSlice(line);
|
||||
try output.appendSlice("\n");
|
||||
continue;
|
||||
}
|
||||
const name = it.next() orelse {
|
||||
std.debug.print("{s}:{d}: error: missing define name\n", .{
|
||||
src_path, line_index + 1,
|
||||
});
|
||||
any_errors = true;
|
||||
continue;
|
||||
};
|
||||
const kv = values_copy.fetchRemove(name) orelse {
|
||||
std.debug.print("{s}:{d}: error: unspecified config header value: '{s}'\n", .{
|
||||
src_path, line_index + 1, name,
|
||||
});
|
||||
any_errors = true;
|
||||
continue;
|
||||
};
|
||||
try renderValue(output, name, kv.value);
|
||||
}
|
||||
|
||||
{
|
||||
var it = values_copy.iterator();
|
||||
while (it.next()) |entry| {
|
||||
const name = entry.key_ptr.*;
|
||||
std.debug.print("{s}: error: config header value unused: '{s}'\n", .{ src_path, name });
|
||||
}
|
||||
}
|
||||
|
||||
if (any_errors) {
|
||||
return error.HeaderConfigFailed;
|
||||
}
|
||||
}
|
||||
|
||||
fn renderValue(output: *std.ArrayList(u8), name: []const u8, value: Value) !void {
|
||||
switch (value) {
|
||||
.undef => {
|
||||
try output.appendSlice("/* #undef ");
|
||||
try output.appendSlice(name);
|
||||
try output.appendSlice(" */\n");
|
||||
},
|
||||
.defined => {
|
||||
try output.appendSlice("#define ");
|
||||
try output.appendSlice(name);
|
||||
try output.appendSlice("\n");
|
||||
},
|
||||
.boolean => |b| {
|
||||
try output.appendSlice("#define ");
|
||||
try output.appendSlice(name);
|
||||
try output.appendSlice(" ");
|
||||
try output.appendSlice(if (b) "true\n" else "false\n");
|
||||
},
|
||||
.int => |i| {
|
||||
try output.writer().print("#define {s} {d}\n", .{ name, i });
|
||||
},
|
||||
.ident => |ident| {
|
||||
try output.writer().print("#define {s} {s}\n", .{ name, ident });
|
||||
},
|
||||
.string => |string| {
|
||||
// TODO: use C-specific escaping instead of zig string literals
|
||||
try output.writer().print("#define {s} \"{}\"\n", .{ name, std.zig.fmtEscapes(string) });
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@ -474,9 +474,8 @@ pub fn installRaw(self: *LibExeObjStep, dest_filename: []const u8, options: Inst
|
||||
return self.builder.installRaw(self, dest_filename, options);
|
||||
}
|
||||
|
||||
pub fn installHeader(a: *LibExeObjStep, src_path: []const u8) void {
|
||||
const basename = fs.path.basename(src_path);
|
||||
const install_file = a.builder.addInstallHeaderFile(src_path, basename);
|
||||
pub fn installHeader(a: *LibExeObjStep, src_path: []const u8, dest_rel_path: []const u8) void {
|
||||
const install_file = a.builder.addInstallHeaderFile(src_path, dest_rel_path);
|
||||
a.builder.getInstallStep().dependOn(&install_file.step);
|
||||
a.installed_headers.append(&install_file.step) catch unreachable;
|
||||
}
|
||||
@ -486,7 +485,7 @@ pub fn installHeadersDirectory(
|
||||
src_dir_path: []const u8,
|
||||
dest_rel_path: []const u8,
|
||||
) void {
|
||||
return a.builder.addInstallDirectoryOptions(.{
|
||||
return installHeadersDirectoryOptions(a, .{
|
||||
.source_dir = src_dir_path,
|
||||
.install_dir = .header,
|
||||
.install_subdir = dest_rel_path,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user