Browse Source

Make zig build functionality available to zig programs (#2271)

Nikolas 3 years ago
parent
commit
a6aa5a1e4c
1 changed files with 73 additions and 62 deletions
  1. 73 62
      src/build.zig

+ 73 - 62
src/build.zig

@@ -1,72 +1,83 @@
 const std = @import("std");
 
-pub fn build(b: *std.build.Builder) void {
-    // Standard target options allows the person running `zig build` to choose
-    // what target to build for. Here we do not override the defaults, which
-    // means any target is allowed, and the default is native. Other options
-    // for restricting supported target set are available.
-    const target = b.standardTargetOptions(.{});
+pub fn Pkg(srcdir: []const u8) type {
+    return struct {
+        pub fn addRaylib(b: *std.build.Builder, target: std.zig.CrossTarget) *std.build.LibExeObjStep {
+            // Standard release options allow the person running `zig build` to select
+            // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
+            const mode = b.standardReleaseOptions();
 
-    // Standard release options allow the person running `zig build` to select
-    // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
-    const mode = b.standardReleaseOptions();
+            const raylib_flags = &[_][]const u8{
+                "-std=gnu99",
+                "-DPLATFORM_DESKTOP",
+                "-DGL_SILENCE_DEPRECATION=199309L",
+                "-fno-sanitize=undefined", // https://github.com/raysan5/raylib/issues/1891
+            };
 
-    const raylib_flags = &[_][]const u8{
-        "-std=gnu99",
-        "-DPLATFORM_DESKTOP",
-        "-DGL_SILENCE_DEPRECATION",
-        "-fno-sanitize=undefined", // https://github.com/raysan5/raylib/issues/1891
-    };
+            const raylib = b.addStaticLibrary("raylib", srcdir ++ "/raylib.h");
+            raylib.setTarget(target);
+            raylib.setBuildMode(mode);
+            raylib.linkLibC();
 
-    const raylib = b.addStaticLibrary("raylib", "raylib.h");
-    raylib.setTarget(target);
-    raylib.setBuildMode(mode);
-    raylib.linkLibC();
+            raylib.addIncludeDir(srcdir ++ "/external/glfw/include");
 
-    raylib.addIncludeDir("external/glfw/include");
+            raylib.addCSourceFiles(&.{
+                srcdir ++ "/raudio.c",
+                srcdir ++ "/rcore.c",
+                srcdir ++ "/rmodels.c",
+                srcdir ++ "/rshapes.c",
+                srcdir ++ "/rtext.c",
+                srcdir ++ "/rtextures.c",
+                srcdir ++ "/utils.c",
+            }, raylib_flags);
 
-    raylib.addCSourceFiles(&.{
-        "raudio.c",
-        "rcore.c",
-        "rmodels.c",
-        "rshapes.c",
-        "rtext.c",
-        "rtextures.c",
-        "utils.c",
-    }, raylib_flags);
+            switch (raylib.target.toTarget().os.tag) {
+                .windows => {
+                    raylib.addCSourceFiles(&.{srcdir ++ "/rglfw.c"}, raylib_flags);
+                    raylib.linkSystemLibrary("winmm");
+                    raylib.linkSystemLibrary("gdi32");
+                    raylib.linkSystemLibrary("opengl32");
+                    raylib.addIncludeDir("external/glfw/deps/mingw");
+                },
+                .linux => {
+                    raylib.addCSourceFiles(&.{srcdir ++ "/rglfw.c"}, raylib_flags);
+                    raylib.linkSystemLibrary("GL");
+                    raylib.linkSystemLibrary("rt");
+                    raylib.linkSystemLibrary("dl");
+                    raylib.linkSystemLibrary("m");
+                    raylib.linkSystemLibrary("X11");
+                },
+                .macos => {
+                    // On macos rglfw.c include Objective-C files.
+                    const raylib_flags_extra_macos = &[_][]const u8{
+                        "-ObjC",
+                    };
+                    raylib.addCSourceFiles(
+                        &.{srcdir ++ "/rglfw.c"},
+                        raylib_flags ++ raylib_flags_extra_macos,
+                    );
+                    raylib.linkFramework("Foundation");
+                },
+                else => {
+                    @panic("Unsupported OS");
+                },
+            }
 
-    switch (raylib.target.toTarget().os.tag) {
-        .windows => {
-            raylib.addCSourceFiles(&.{"rglfw.c"}, raylib_flags);
-            raylib.linkSystemLibrary("winmm");
-            raylib.linkSystemLibrary("gdi32");
-            raylib.linkSystemLibrary("opengl32");
-            raylib.addIncludeDir("external/glfw/deps/mingw");
-        },
-        .linux => {
-            raylib.addCSourceFiles(&.{"rglfw.c"}, raylib_flags);
-            raylib.linkSystemLibrary("GL");
-            raylib.linkSystemLibrary("rt");
-            raylib.linkSystemLibrary("dl");
-            raylib.linkSystemLibrary("m");
-            raylib.linkSystemLibrary("X11");
-        },
-        .macos => {
-            // On macos rglfw.c include Objective-C files.
-            const raylib_flags_extra_macos = &[_][]const u8{
-                "-ObjC",
-            };
-            raylib.addCSourceFiles(
-                &.{"rglfw.c"},
-                raylib_flags ++ raylib_flags_extra_macos,
-            );
-            raylib.linkFramework("Foundation");
-        },
-        else => {
-            @panic("Unsupported OS");
-        },
-    }
+            raylib.setOutputDir("./");
+            raylib.install();
+            return raylib;
+        }
+    };
+}
+
+const lib = Pkg(".");
+
+pub fn build(b: *std.build.Builder) void {
+    // Standard target options allows the person running `zig build` to choose
+    // what target to build for. Here we do not override the defaults, which
+    // means any target is allowed, and the default is native. Other options
+    // for restricting supported target set are available.
+    const target = b.standardTargetOptions(.{});
 
-    raylib.setOutputDir("./");
-    raylib.install();
+    _ = lib.addRaylib(b, target);
 }