Fix build runner for latest changes (#1005)
* build_runner: update to use new caching system * build_runner: switch ci to use 0.10.1 instead of 0.10.0 * build_runner: support older versions * build_runner: ensure depreciated functions and types are handled when they are removed * build_runner: prevent access denied on global cache
This commit is contained in:
parent
4f42c68a0a
commit
abe07e601e
2
.github/workflows/build_runner.yml
vendored
2
.github/workflows/build_runner.yml
vendored
@ -15,7 +15,7 @@ jobs:
|
|||||||
check_build_runner:
|
check_build_runner:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
zig_version: [0.9.1, 0.10.0, master]
|
zig_version: [0.9.1, 0.10.1, master]
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
@ -2,10 +2,22 @@ const root = @import("@build@");
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const log = std.log;
|
const log = std.log;
|
||||||
const process = std.process;
|
const process = std.process;
|
||||||
const Builder = std.build.Builder;
|
|
||||||
const InstallArtifactStep = std.build.InstallArtifactStep;
|
// Zig 0.11.0-dev.1524+
|
||||||
const LibExeObjStep = std.build.LibExeObjStep;
|
const Build = if (@hasDecl(std, "Build")) std.Build else std.build;
|
||||||
const OptionsStep = std.build.OptionsStep;
|
|
||||||
|
// Zig 0.11.0-dev.1524+
|
||||||
|
const Builder = if (@hasDecl(std, "Build")) std.Build else std.build.Builder;
|
||||||
|
|
||||||
|
// Zig 0.11.0-dev.1637+
|
||||||
|
const Cache = if (@hasDecl(Build, "Cache")) std.Build.Cache else void;
|
||||||
|
const has_cache = Cache != void;
|
||||||
|
|
||||||
|
// Zig 0.11.0-dev.1524+
|
||||||
|
const CompileStep = if (@hasDecl(Build, "CompileStep")) Build.CompileStep else Build.LibExeObjStep;
|
||||||
|
|
||||||
|
const InstallArtifactStep = Build.InstallArtifactStep;
|
||||||
|
const OptionsStep = Build.OptionsStep;
|
||||||
|
|
||||||
pub const BuildConfig = struct {
|
pub const BuildConfig = struct {
|
||||||
packages: []Pkg,
|
packages: []Pkg,
|
||||||
@ -48,19 +60,64 @@ pub fn main() !void {
|
|||||||
return error.InvalidArgs;
|
return error.InvalidArgs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const build_root_directory = if (has_cache) Cache.Directory{
|
||||||
|
.path = build_root,
|
||||||
|
.handle = try std.fs.cwd().openDir(build_root, .{}),
|
||||||
|
} else build_root;
|
||||||
|
|
||||||
|
const local_cache_directory = if (has_cache) Cache.Directory{
|
||||||
|
.path = cache_root,
|
||||||
|
.handle = try std.fs.cwd().makeOpenPath(cache_root, .{}),
|
||||||
|
} else cache_root;
|
||||||
|
|
||||||
|
const global_cache_directory = if (has_cache) Cache.Directory{
|
||||||
|
.path = global_cache_root,
|
||||||
|
// I don't know if with the incomming changes around caching whether `openDir` is correct,
|
||||||
|
// but `makeOpenPath` which zig build runner uses causes access denied
|
||||||
|
.handle = try std.fs.cwd().openDir(global_cache_root, .{}),
|
||||||
|
} else global_cache_root;
|
||||||
|
|
||||||
|
var cache = if (has_cache) Cache{
|
||||||
|
.gpa = allocator,
|
||||||
|
.manifest_dir = try local_cache_directory.handle.makeOpenPath("h", .{}),
|
||||||
|
} else {};
|
||||||
|
if (has_cache) {
|
||||||
|
cache.addPrefix(.{ .path = null, .handle = std.fs.cwd() });
|
||||||
|
cache.addPrefix(build_root_directory);
|
||||||
|
cache.addPrefix(local_cache_directory);
|
||||||
|
cache.addPrefix(global_cache_directory);
|
||||||
|
}
|
||||||
|
|
||||||
const builder = blk: {
|
const builder = blk: {
|
||||||
// Zig 0.11.0-dev.1524+
|
// Zig 0.11.0-dev.1524+
|
||||||
if (@hasDecl(std, "Build")) {
|
const does_builder_need_host = @hasDecl(std, "Build");
|
||||||
const host = try std.zig.system.NativeTargetInfo.detect(.{});
|
|
||||||
|
const host = if (does_builder_need_host) try std.zig.system.NativeTargetInfo.detect(.{}) else {};
|
||||||
|
|
||||||
|
if (does_builder_need_host) {
|
||||||
|
if (has_cache) {
|
||||||
|
break :blk try Builder.create(
|
||||||
|
allocator,
|
||||||
|
zig_exe,
|
||||||
|
build_root_directory,
|
||||||
|
local_cache_directory,
|
||||||
|
global_cache_directory,
|
||||||
|
host,
|
||||||
|
&cache,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
break :blk try Builder.create(
|
break :blk try Builder.create(
|
||||||
allocator,
|
allocator,
|
||||||
zig_exe,
|
zig_exe,
|
||||||
build_root,
|
build_root_directory,
|
||||||
cache_root,
|
local_cache_directory,
|
||||||
global_cache_root,
|
global_cache_directory,
|
||||||
host,
|
host,
|
||||||
);
|
);
|
||||||
} else break :blk try Builder.create(
|
}
|
||||||
|
|
||||||
|
break :blk try Builder.create(
|
||||||
allocator,
|
allocator,
|
||||||
zig_exe,
|
zig_exe,
|
||||||
build_root,
|
build_root,
|
||||||
@ -131,7 +188,7 @@ pub fn main() !void {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reifyOptions(step: *std.build.Step) anyerror!void {
|
fn reifyOptions(step: *Build.Step) anyerror!void {
|
||||||
// Support Zig 0.9.1
|
// Support Zig 0.9.1
|
||||||
if (!@hasDecl(OptionsStep, "base_id")) return;
|
if (!@hasDecl(OptionsStep, "base_id")) return;
|
||||||
|
|
||||||
@ -151,7 +208,7 @@ fn processStep(
|
|||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
packages: *std.ArrayListUnmanaged(BuildConfig.Pkg),
|
packages: *std.ArrayListUnmanaged(BuildConfig.Pkg),
|
||||||
include_dirs: *std.StringArrayHashMapUnmanaged(void),
|
include_dirs: *std.StringArrayHashMapUnmanaged(void),
|
||||||
step: *std.build.Step,
|
step: *Build.Step,
|
||||||
) anyerror!void {
|
) anyerror!void {
|
||||||
if (step.cast(InstallArtifactStep)) |install_exe| {
|
if (step.cast(InstallArtifactStep)) |install_exe| {
|
||||||
if (install_exe.artifact.root_src) |src| {
|
if (install_exe.artifact.root_src) |src| {
|
||||||
@ -164,7 +221,7 @@ fn processStep(
|
|||||||
|
|
||||||
try processIncludeDirs(allocator, include_dirs, install_exe.artifact.include_dirs.items);
|
try processIncludeDirs(allocator, include_dirs, install_exe.artifact.include_dirs.items);
|
||||||
try processPkgConfig(allocator, include_dirs, install_exe.artifact);
|
try processPkgConfig(allocator, include_dirs, install_exe.artifact);
|
||||||
if (@hasField(LibExeObjStep, "modules")) {
|
if (@hasField(CompileStep, "modules")) {
|
||||||
var modules_it = install_exe.artifact.modules.iterator();
|
var modules_it = install_exe.artifact.modules.iterator();
|
||||||
while (modules_it.next()) |module_entry| {
|
while (modules_it.next()) |module_entry| {
|
||||||
try processModule(allocator, packages, module_entry);
|
try processModule(allocator, packages, module_entry);
|
||||||
@ -174,7 +231,7 @@ fn processStep(
|
|||||||
try processPackage(allocator, packages, pkg);
|
try processPackage(allocator, packages, pkg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (step.cast(LibExeObjStep)) |exe| {
|
} else if (step.cast(CompileStep)) |exe| {
|
||||||
if (exe.root_src) |src| {
|
if (exe.root_src) |src| {
|
||||||
const maybe_path = switch (src) {
|
const maybe_path = switch (src) {
|
||||||
.path => |path| path,
|
.path => |path| path,
|
||||||
@ -184,7 +241,7 @@ fn processStep(
|
|||||||
}
|
}
|
||||||
try processIncludeDirs(allocator, include_dirs, exe.include_dirs.items);
|
try processIncludeDirs(allocator, include_dirs, exe.include_dirs.items);
|
||||||
try processPkgConfig(allocator, include_dirs, exe);
|
try processPkgConfig(allocator, include_dirs, exe);
|
||||||
if (@hasField(LibExeObjStep, "modules")) {
|
if (@hasField(CompileStep, "modules")) {
|
||||||
var modules_it = exe.modules.iterator();
|
var modules_it = exe.modules.iterator();
|
||||||
while (modules_it.next()) |module_entry| {
|
while (modules_it.next()) |module_entry| {
|
||||||
try processModule(allocator, packages, module_entry);
|
try processModule(allocator, packages, module_entry);
|
||||||
@ -204,7 +261,7 @@ fn processStep(
|
|||||||
fn processModule(
|
fn processModule(
|
||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
packages: *std.ArrayListUnmanaged(BuildConfig.Pkg),
|
packages: *std.ArrayListUnmanaged(BuildConfig.Pkg),
|
||||||
module: std.StringArrayHashMap(*std.Build.Module).Entry,
|
module: std.StringArrayHashMap(*Build.Module).Entry,
|
||||||
) !void {
|
) !void {
|
||||||
for (packages.items) |package| {
|
for (packages.items) |package| {
|
||||||
if (std.mem.eql(u8, package.name, module.key_ptr.*)) return;
|
if (std.mem.eql(u8, package.name, module.key_ptr.*)) return;
|
||||||
@ -228,14 +285,14 @@ fn processModule(
|
|||||||
fn processPackage(
|
fn processPackage(
|
||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
packages: *std.ArrayListUnmanaged(BuildConfig.Pkg),
|
packages: *std.ArrayListUnmanaged(BuildConfig.Pkg),
|
||||||
pkg: std.build.Pkg,
|
pkg: Build.Pkg,
|
||||||
) anyerror!void {
|
) anyerror!void {
|
||||||
for (packages.items) |package| {
|
for (packages.items) |package| {
|
||||||
if (std.mem.eql(u8, package.name, pkg.name)) return;
|
if (std.mem.eql(u8, package.name, pkg.name)) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Support Zig 0.9.1
|
// Support Zig 0.9.1
|
||||||
const source = if (@hasField(std.build.Pkg, "source")) pkg.source else pkg.path;
|
const source = if (@hasField(Build.Pkg, "source")) pkg.source else pkg.path;
|
||||||
|
|
||||||
const maybe_path = switch (source) {
|
const maybe_path = switch (source) {
|
||||||
.path => |path| path,
|
.path => |path| path,
|
||||||
@ -256,7 +313,7 @@ fn processPackage(
|
|||||||
fn processIncludeDirs(
|
fn processIncludeDirs(
|
||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
include_dirs: *std.StringArrayHashMapUnmanaged(void),
|
include_dirs: *std.StringArrayHashMapUnmanaged(void),
|
||||||
dirs: []std.build.LibExeObjStep.IncludeDir,
|
dirs: []CompileStep.IncludeDir,
|
||||||
) !void {
|
) !void {
|
||||||
try include_dirs.ensureUnusedCapacity(allocator, dirs.len);
|
try include_dirs.ensureUnusedCapacity(allocator, dirs.len);
|
||||||
|
|
||||||
@ -274,7 +331,7 @@ fn processIncludeDirs(
|
|||||||
fn processPkgConfig(
|
fn processPkgConfig(
|
||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
include_dirs: *std.StringArrayHashMapUnmanaged(void),
|
include_dirs: *std.StringArrayHashMapUnmanaged(void),
|
||||||
exe: *std.build.LibExeObjStep,
|
exe: *CompileStep,
|
||||||
) !void {
|
) !void {
|
||||||
for (exe.link_objects.items) |link_object| {
|
for (exe.link_objects.items) |link_object| {
|
||||||
if (link_object != .system_lib) continue;
|
if (link_object != .system_lib) continue;
|
||||||
@ -308,7 +365,7 @@ fn processPkgConfig(
|
|||||||
fn getPkgConfigIncludes(
|
fn getPkgConfigIncludes(
|
||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
include_dirs: *std.StringArrayHashMapUnmanaged(void),
|
include_dirs: *std.StringArrayHashMapUnmanaged(void),
|
||||||
exe: *std.build.LibExeObjStep,
|
exe: *CompileStep,
|
||||||
name: []const u8,
|
name: []const u8,
|
||||||
) !void {
|
) !void {
|
||||||
if (exe.runPkgConfig(name)) |args| {
|
if (exe.runPkgConfig(name)) |args| {
|
||||||
|
Loading…
Reference in New Issue
Block a user