From b3dfa2d8abff549a9a9129f7ef2462ef1261ac4d Mon Sep 17 00:00:00 2001 From: freakmangd <53349189+freakmangd@users.noreply.github.com> Date: Wed, 10 Apr 2024 04:36:18 -0400 Subject: [PATCH] Update to latest zig and simplify build.zig (#3905) * update to latest zig, and don't use srcdir * preserve compatibility, simplify Child.run compatibility --- src/build.zig | 107 +++++++++++++++++++++++--------------------------- 1 file changed, 49 insertions(+), 58 deletions(-) diff --git a/src/build.zig b/src/build.zig index 91cd9cb1..fe6365ef 100644 --- a/src/build.zig +++ b/src/build.zig @@ -3,8 +3,7 @@ const builtin = @import("builtin"); // This has been tested with zig version(s): // 0.11.0 -// 0.12.0-dev.2075+f5978181e -// 0.12.0-dev.2990+31763d28c +// 0.12.0-dev.3580+e204a6edb // // Anytype is used here to preserve compatibility, in 0.12.0dev the std.zig.CrossTarget type // was reworked into std.Target.Query and std.Build.ResolvedTarget. Using anytype allows @@ -51,37 +50,37 @@ pub fn addRaylib(b: *std.Build, target: anytype, optimize: std.builtin.OptimizeM // No GLFW required on PLATFORM_DRM if (!options.platform_drm) { - raylib.addIncludePath(.{ .cwd_relative = srcdir ++ "/external/glfw/include" }); + raylib.addIncludePath(.{ .path = "src/external/glfw/include" }); } addCSourceFilesVersioned(raylib, &.{ - try join2(gpa, srcdir, "rcore.c"), - try join2(gpa, srcdir, "utils.c"), + "src/rcore.c", + "src/utils.c", }, raylib_flags_arr.items); if (options.raudio) { addCSourceFilesVersioned(raylib, &.{ - try join2(gpa, srcdir, "raudio.c"), + "src/raudio.c", }, raylib_flags_arr.items); } if (options.rmodels) { addCSourceFilesVersioned(raylib, &.{ - try join2(gpa, srcdir, "rmodels.c"), + "src/rmodels.c", }, raylib_flags_arr.items); } if (options.rshapes) { addCSourceFilesVersioned(raylib, &.{ - try join2(gpa, srcdir, "rshapes.c"), + "src/rshapes.c", }, raylib_flags_arr.items); } if (options.rtext) { addCSourceFilesVersioned(raylib, &.{ - try join2(gpa, srcdir, "rtext.c"), + "src/rtext.c", }, raylib_flags_arr.items); } if (options.rtextures) { addCSourceFilesVersioned(raylib, &.{ - try join2(gpa, srcdir, "rtextures.c"), + "src/rtextures.c", }, raylib_flags_arr.items); } @@ -91,14 +90,14 @@ pub fn addRaylib(b: *std.Build, target: anytype, optimize: std.builtin.OptimizeM if (options.raygui) { const raygui_c_path = gen_step.add("raygui.c", "#define RAYGUI_IMPLEMENTATION\n#include \"raygui.h\"\n"); raylib.addCSourceFile(.{ .file = raygui_c_path, .flags = raylib_flags_arr.items }); - raylib.addIncludePath(.{ .cwd_relative = srcdir }); - raylib.addIncludePath(.{ .cwd_relative = srcdir ++ "/../../raygui/src" }); + raylib.addIncludePath(.{ .path = "src" }); + raylib.addIncludePath(.{ .path = "../raygui/src" }); } switch (getOsTagVersioned(target)) { .windows => { addCSourceFilesVersioned(raylib, &.{ - try join2(gpa, srcdir, "rglfw.c"), + "src/rglfw.c", }, raylib_flags_arr.items); raylib.linkSystemLibrary("winmm"); raylib.linkSystemLibrary("gdi32"); @@ -109,7 +108,7 @@ pub fn addRaylib(b: *std.Build, target: anytype, optimize: std.builtin.OptimizeM .linux => { if (!options.platform_drm) { addCSourceFilesVersioned(raylib, &.{ - try join2(gpa, srcdir, "rglfw.c"), + "src/rglfw.c", }, raylib_flags_arr.items); raylib.linkSystemLibrary("GL"); raylib.linkSystemLibrary("rt"); @@ -130,7 +129,7 @@ pub fn addRaylib(b: *std.Build, target: anytype, optimize: std.builtin.OptimizeM raylib.linkSystemLibrary("wayland-cursor"); raylib.linkSystemLibrary("wayland-egl"); raylib.linkSystemLibrary("xkbcommon"); - raylib.addIncludePath(.{ .path = srcdir }); + raylib.addIncludePath(.{ .path = "src" }); try waylandGenerate(gpa, "wayland.xml", "wayland-client-protocol"); try waylandGenerate(gpa, "xdg-shell.xml", "xdg-shell-client-protocol"); try waylandGenerate(gpa, "xdg-decoration-unstable-v1.xml", "xdg-decoration-unstable-v1-client-protocol"); @@ -163,7 +162,7 @@ pub fn addRaylib(b: *std.Build, target: anytype, optimize: std.builtin.OptimizeM }, .freebsd, .openbsd, .netbsd, .dragonfly => { addCSourceFilesVersioned(raylib, &.{ - try join2(gpa, srcdir, "rglfw.c"), + "src/rglfw.c", }, raylib_flags_arr.items); raylib.linkSystemLibrary("GL"); raylib.linkSystemLibrary("rt"); @@ -182,7 +181,7 @@ pub fn addRaylib(b: *std.Build, target: anytype, optimize: std.builtin.OptimizeM // On macos rglfw.c include Objective-C files. try raylib_flags_arr.append("-ObjC"); addCSourceFilesVersioned(raylib, &.{ - try join2(gpa, srcdir, "rglfw.c"), + "src/rglfw.c", }, raylib_flags_arr.items); raylib.linkFramework("Foundation"); raylib.linkFramework("CoreServices"); @@ -259,24 +258,18 @@ pub fn build(b: *std.Build) !void { const lib = try addRaylib(b, target, optimize, options); - lib.installHeader("src/raylib.h", "raylib.h"); - lib.installHeader("src/raymath.h", "raymath.h"); - lib.installHeader("src/rlgl.h", "rlgl.h"); + installHeaderVersioned(lib, "src/raylib.h", "raylib.h"); + installHeaderVersioned(lib, "src/raymath.h", "raymath.h"); + installHeaderVersioned(lib, "src/rlgl.h", "rlgl.h"); if (options.raygui) { - lib.installHeader("../raygui/src/raygui.h", "raygui.h"); + installHeaderVersioned(lib, "../raygui/src/raygui.h", "raygui.h"); } b.installArtifact(lib); } -const srcdir = struct { - fn getSrcDir() []const u8 { - return std.fs.path.dirname(@src().file).?; - } -}.getSrcDir(); - -const waylandDir = srcdir ++ "/external/glfw/deps/wayland"; +const waylandDir = "src/external/glfw/deps/wayland"; fn getOsTagVersioned(target: anytype) std.Target.Os.Tag { if (comptime builtin.zig_version.minor >= 12) { @@ -291,14 +284,11 @@ fn addCSourceFilesVersioned( files: []const []const u8, flags: []const []const u8, ) void { - //- HACK(cabarger): I hate this so much!!! if (comptime builtin.zig_version.minor >= 12) { - for (files) |file| { - exe.addCSourceFile(.{ - .file = .{ .path = file }, - .flags = flags, - }); - } + exe.addCSourceFiles(.{ + .files = files, + .flags = flags, + }); } else if (comptime builtin.zig_version.minor == 11) { exe.addCSourceFiles(files, flags); } else { @@ -306,32 +296,33 @@ fn addCSourceFilesVersioned( } } -fn waylandGenerate(allocator: std.mem.Allocator, comptime protocol: []const u8, comptime basename: []const u8) !void { - const protocolDir = waylandDir ++ "/" ++ protocol; - const clientHeader = srcdir ++ "/" ++ basename ++ ".h"; - const privateCode = srcdir ++ "/" ++ basename ++ "-code.h"; +fn installHeaderVersioned( + lib: *std.Build.Step.Compile, + source: []const u8, + dest: []const u8, +) void { if (comptime builtin.zig_version.minor >= 12) { - _ = try std.process.Child.run(.{ - .allocator = allocator, - .argv = &[_][]const u8{ "wayland-scanner", "client-header", protocolDir, clientHeader }, - }); - _ = try std.process.Child.run(.{ - .allocator = allocator, - .argv = &[_][]const u8{ "wayland-scanner", "private-code", protocolDir, privateCode }, - }); + lib.installHeader(.{ .path = source }, dest); } else { - _ = try std.process.Child.exec(.{ - .allocator = allocator, - .argv = &[_][]const u8{ "wayland-scanner", "client-header", protocolDir, clientHeader }, - }); - _ = try std.process.Child.exec(.{ - .allocator = allocator, - .argv = &[_][]const u8{ "wayland-scanner", "private-code", protocolDir, privateCode }, - }); + lib.installHeader(source, dest); } } -fn join2(allocator: std.mem.Allocator, path1: []const u8, path2: []const u8) ![]u8 { - const joinedPath = try std.fs.path.join(allocator, &[_][]const u8{ path1, path2 }); - return joinedPath; +const childRunVersioned = if (builtin.zig_version.minor >= 12) + std.process.Child.run +else + std.process.Child.exec; + +fn waylandGenerate(allocator: std.mem.Allocator, comptime protocol: []const u8, comptime basename: []const u8) !void { + const protocolDir = waylandDir ++ "/" ++ protocol; + const clientHeader = "src/" ++ basename ++ ".h"; + const privateCode = "src/" ++ basename ++ "-code.h"; + _ = try childRunVersioned(.{ + .allocator = allocator, + .argv = &[_][]const u8{ "wayland-scanner", "client-header", protocolDir, clientHeader }, + }); + _ = try childRunVersioned(.{ + .allocator = allocator, + .argv = &[_][]const u8{ "wayland-scanner", "private-code", protocolDir, privateCode }, + }); }