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(
 | 
					                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,
 | 
				
			||||||
 | 
					                    &cache,
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            break :blk try Builder.create(
 | 
				
			||||||
 | 
					                allocator,
 | 
				
			||||||
 | 
					                zig_exe,
 | 
				
			||||||
 | 
					                build_root_directory,
 | 
				
			||||||
 | 
					                local_cache_directory,
 | 
				
			||||||
 | 
					                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