std.Build: introduce ConfigHeader.getOutputDir, small refactor
`std.Build.Step.ConfigHeader` emits a *directory* containing a config header under a given sub path, but there's no good way to actually access that directory as a `LazyPath` in the configure phase. This is silly; it's perfectly valid to refer to that directory, perhaps to explicitly pass as a "-I" flag to a different toolchain invoked via a `Step.Run`. So now, instead of the `GeneratedFile` being the actual *file*, it should be that *directory*, i.e. `cache/o/<digest>`. We can then easily get the *file* if needed just by using `LazyPath.path` to go "deeper", which there is a helper function for. The legacy `getOutput` function is now a deprecated alias for `getOutputFile`, and `getOutputDir` is introduced. `std.Build.Module.IncludeDir.appendZigProcessFlags` needed a fix after this change, so I took the opportunity to refactor it a little. I was looking at this function while working on ziglang/translate-c yesterday and realised it could be expressed much more simply -- particularly after the `ConfigHeader` change here. I had to update the test `standalone/cmakedefine/` -- it turns out this test was well and truly reaching into build system internals, and doing horrible not-really-allowed stuff like overriding the `makeFn` of a `TopLevelStep`. To top it all off, the test forgot to set `b.default_step` to its "test" step, so the test never even ran. I've refactored it to follow accepted practices and to actually, like, work.
This commit is contained in:
@@ -173,39 +173,25 @@ pub const IncludeDir = union(enum) {
|
||||
zig_args: *std.ArrayList([]const u8),
|
||||
asking_step: ?*Step,
|
||||
) !void {
|
||||
switch (include_dir) {
|
||||
.path => |include_path| {
|
||||
try zig_args.appendSlice(&.{ "-I", include_path.getPath2(b, asking_step) });
|
||||
const flag: []const u8, const lazy_path: LazyPath = switch (include_dir) {
|
||||
// zig fmt: off
|
||||
.path => |lp| .{ "-I", lp },
|
||||
.path_system => |lp| .{ "-isystem", lp },
|
||||
.path_after => |lp| .{ "-idirafter", lp },
|
||||
.framework_path => |lp| .{ "-F", lp },
|
||||
.framework_path_system => |lp| .{ "-iframework", lp },
|
||||
.config_header_step => |ch| .{ "-I", ch.getOutputDir() },
|
||||
.other_step => |comp| .{ "-I", comp.installed_headers_include_tree.?.getDirectory() },
|
||||
// zig fmt: on
|
||||
.embed_path => |lazy_path| {
|
||||
// Special case: this is a single arg.
|
||||
const resolved = lazy_path.getPath3(b, asking_step);
|
||||
const arg = b.fmt("--embed-dir={}", .{resolved});
|
||||
return zig_args.append(arg);
|
||||
},
|
||||
.path_system => |include_path| {
|
||||
try zig_args.appendSlice(&.{ "-isystem", include_path.getPath2(b, asking_step) });
|
||||
},
|
||||
.path_after => |include_path| {
|
||||
try zig_args.appendSlice(&.{ "-idirafter", include_path.getPath2(b, asking_step) });
|
||||
},
|
||||
.framework_path => |include_path| {
|
||||
try zig_args.appendSlice(&.{ "-F", include_path.getPath2(b, asking_step) });
|
||||
},
|
||||
.framework_path_system => |include_path| {
|
||||
try zig_args.appendSlice(&.{ "-iframework", include_path.getPath2(b, asking_step) });
|
||||
},
|
||||
.other_step => |other| {
|
||||
if (other.generated_h) |header| {
|
||||
try zig_args.appendSlice(&.{ "-isystem", std.fs.path.dirname(header.getPath()).? });
|
||||
}
|
||||
if (other.installed_headers_include_tree) |include_tree| {
|
||||
try zig_args.appendSlice(&.{ "-I", include_tree.generated_directory.getPath() });
|
||||
}
|
||||
},
|
||||
.config_header_step => |config_header| {
|
||||
const full_file_path = config_header.output_file.getPath();
|
||||
const header_dir_path = full_file_path[0 .. full_file_path.len - config_header.include_path.len];
|
||||
try zig_args.appendSlice(&.{ "-I", header_dir_path });
|
||||
},
|
||||
.embed_path => |embed_path| {
|
||||
try zig_args.append(try std.mem.concat(b.allocator, u8, &.{ "--embed-dir=", embed_path.getPath2(b, asking_step) }));
|
||||
},
|
||||
}
|
||||
};
|
||||
const resolved_str = try lazy_path.getPath3(b, asking_step).toString(b.graph.arena);
|
||||
return zig_args.appendSlice(&.{ flag, resolved_str });
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user