@ -11,36 +11,6 @@ comptime {
@compileError("Raylib requires zig version " ++ min_ver);
@compileError("Raylib requires zig version " ++ min_ver);
}
}
// NOTE(freakmangd): I don't like using a global here, but it prevents having to
// get the flags a second time when adding raygui
var raylib_flags_arr: std.ArrayListUnmanaged([]const u8) = .{};
// This has been tested with zig version 0.13.0
pub fn addRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, options: Options) !*std.Build.Step.Compile {
const raylib_dep = b.dependencyFromBuildZig(@This(), .{
.target = target,
.optimize = optimize,
.raudio = options.raudio,
.rmodels = options.rmodels,
.rshapes = options.rshapes,
.rtext = options.rtext,
.rtextures = options.rtextures,
.platform = options.platform,
.shared = options.shared,
.linux_display_backend = options.linux_display_backend,
.opengl_version = options.opengl_version,
.config = options.config,
});
const raylib = raylib_dep.artifact("raylib");
if (options.raygui) {
const raygui_dep = b.dependency(options.raygui_dependency_name, .{});
addRaygui(b, raylib, raygui_dep);
}
return raylib;
}
fn setDesktopPlatform(raylib: *std.Build.Step.Compile, platform: PlatformBackend) void {
fn setDesktopPlatform(raylib: *std.Build.Step.Compile, platform: PlatformBackend) void {
raylib.defineCMacro("PLATFORM_DESKTOP", null);
raylib.defineCMacro("PLATFORM_DESKTOP", null);
@ -107,21 +77,26 @@ const config_h_flags = outer: {
};
};
fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, options: Options) !*std.Build.Step.Compile {
fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, options: Options) !*std.Build.Step.Compile {
raylib_flags_arr.clearRetainingCapacity();
var raylib_flags_arr = std.ArrayList([]const u8).init(b.allocator);
defer raylib_flags_arr.deinit();
const shared_flags = &[_][]const u8{
"-fPIC",
"-DBUILD_LIBTYPE_SHARED",
};
try raylib_flags_arr.appendSlice(b.allocator, &[_][]const u8{
try raylib_flags_arr.appendSlice(&[_][]const u8{
"-std=gnu99",
"-std=gnu99",
"-D_GNU_SOURCE",
"-D_GNU_SOURCE",
"-DGL_SILENCE_DEPRECATION=199309L",
"-DGL_SILENCE_DEPRECATION=199309L",
"-fno-sanitize=undefined", // https://github.com/raysan5/raylib/issues/3674
"-fno-sanitize=undefined", // https://github.com/raysan5/raylib/issues/3674
});
});
if (options.shared) {
try raylib_flags_arr.appendSlice(&[_][]const u8{
"-fPIC",
"-DBUILD_LIBTYPE_SHARED",
});
}
if (options.config.len > 0) {
if (options.config.len > 0) {
// Sets a flag indiciating the use of a custom `config.h`
// Sets a flag indiciating the use of a custom `config.h`
try raylib_flags_arr.append(b.allocator, "-DEXTERNAL_CONFIG_FLAGS");
try raylib_flags_arr.append("-DEXTERNAL_CONFIG_FLAGS");
// Splits a space-separated list of config flags into multiple flags
// Splits a space-separated list of config flags into multiple flags
//
//
@ -131,7 +106,7 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
// Apply config flags supplied by the user
// Apply config flags supplied by the user
while (config_iter.next()) |config_flag|
while (config_iter.next()) |config_flag|
try raylib_flags_arr.append(b.allocator, config_flag);
try raylib_flags_arr.append(config_flag);
// Apply all relevant configs from `src/config.h` *except* the user-specified ones
// Apply all relevant configs from `src/config.h` *except* the user-specified ones
//
//
@ -149,14 +124,10 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
}
}
// Otherwise, append default value from config.h to compile flags
// Otherwise, append default value from config.h to compile flags
try raylib_flags_arr.append(b.allocator, flag);
try raylib_flags_arr.append(flag);
}
}
}
}
if (options.shared) {
try raylib_flags_arr.appendSlice(b.allocator, shared_flags);
}
const raylib = if (options.shared)
const raylib = if (options.shared)
b.addSharedLibrary(.{
b.addSharedLibrary(.{
.name = "raylib",
.name = "raylib",
@ -288,7 +259,7 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
}
}
// On macos rglfw.c include Objective-C files.
// On macos rglfw.c include Objective-C files.
try raylib_flags_arr.append(b.allocator, "-ObjC");
try raylib_flags_arr.append("-ObjC");
raylib.root_module.addCSourceFile(.{
raylib.root_module.addCSourceFile(.{
.file = b.path("src/rglfw.c"),
.file = b.path("src/rglfw.c"),
.flags = raylib_flags_arr.items,
.flags = raylib_flags_arr.items,
@ -327,25 +298,19 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
.flags = raylib_flags_arr.items,
.flags = raylib_flags_arr.items,
});
});
return raylib;
}
/// This function does not need to be called if you passed .raygui = true to addRaylib
pub fn addRaygui(b: *std.Build, raylib: *std.Build.Step.Compile, raygui_dep: *std.Build.Dependency) void {
if (raylib_flags_arr.items.len == 0) {
@panic(
\\argument 2 `raylib` in `addRaygui` must come from b.dependency("raylib", ...).artifact("raylib")
);
}
if (options.raygui) {
const raygui_dep = b.dependency(options.raygui_dependency_name, .{});
var gen_step = b.addWriteFiles();
raylib.step.dependOn(&gen_step.step);
var gen_step = b.addWriteFiles();
raylib.step.dependOn(&gen_step.step);
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(raygui_dep.path("src"));
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(raygui_dep.path("src"));
raylib.installHeader(raygui_dep.path("src/raygui.h"), "raygui.h");
}
raylib.installHeader(raygui_dep.path("src/raygui.h"), "raygui.h");
return raylib ;
}
}
pub const Options = struct {
pub const Options = struct {