forked from ryupold/raylib.zig
-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.zig
149 lines (132 loc) · 5.83 KB
/
build.zig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
const std = @import("std");
const generate = @import("generate.zig");
pub fn build(b: *std.Build) !void {
const raylibSrc = "raylib/src/";
const target = b.standardTargetOptions(.{});
//--- parse raylib and generate JSONs for all signatures --------------------------------------
const jsons = b.step("parse", "parse raylib headers and generate raylib jsons");
const raylib_parser_build = b.addExecutable(.{
.name = "raylib_parser",
.root_source_file = std.build.FileSource.relative("raylib_parser.zig"),
.target = target,
.optimize = .ReleaseFast,
});
raylib_parser_build.addCSourceFile(.{ .file = .{ .path = "raylib/parser/raylib_parser.c" }, .flags = &.{} });
raylib_parser_build.linkLibC();
//raylib
const raylib_H = b.addRunArtifact(raylib_parser_build);
raylib_H.addArgs(&.{
"-i", raylibSrc ++ "raylib.h",
"-o", "raylib.json",
"-f", "JSON",
"-d", "RLAPI",
});
jsons.dependOn(&raylib_H.step);
//raymath
const raymath_H = b.addRunArtifact(raylib_parser_build);
raymath_H.addArgs(&.{
"-i", raylibSrc ++ "raymath.h",
"-o", "raymath.json",
"-f", "JSON",
"-d", "RMAPI",
});
jsons.dependOn(&raymath_H.step);
//rlgl
const rlgl_H = b.addRunArtifact(raylib_parser_build);
rlgl_H.addArgs(&.{
"-i", raylibSrc ++ "rlgl.h",
"-o", "rlgl.json",
"-f", "JSON",
"-d", "RLAPI",
});
jsons.dependOn(&rlgl_H.step);
//--- Generate intermediate -------------------------------------------------------------------
const intermediate = b.step("intermediate", "generate intermediate representation of the results from 'zig build parse' (keep custom=true)");
var intermediateZigStep = b.addRunArtifact(b.addExecutable(.{
.name = "intermediate",
.root_source_file = std.build.FileSource.relative("intermediate.zig"),
.target = target,
}));
intermediate.dependOn(&intermediateZigStep.step);
//--- Generate bindings -----------------------------------------------------------------------
const bindings = b.step("bindings", "generate bindings in from bindings.json");
var generateZigStep = b.addRunArtifact(b.addExecutable(.{
.name = "generate",
.root_source_file = std.build.FileSource.relative("generate.zig"),
.target = target,
}));
const fmt = b.addFmt(.{ .paths = &.{generate.outputFile} });
fmt.step.dependOn(&generateZigStep.step);
bindings.dependOn(&fmt.step);
//--- just build raylib_parser.exe ------------------------------------------------------------
const raylib_parser_install = b.step("raylib_parser", "build ./zig-out/bin/raylib_parser.exe");
const generateBindings_install = b.addInstallArtifact(raylib_parser_build, .{});
raylib_parser_install.dependOn(&generateBindings_install.step);
}
// above: generate library
// below: linking (use as dependency)
fn current_file() []const u8 {
return @src().file;
}
const sep = std.fs.path.sep_str;
const cwd = std.fs.path.dirname(current_file()).?;
const dir_raylib = cwd ++ sep ++ "raylib" ++ sep ++ "src";
const raylib_build = @import("raylib/src/build.zig");
fn linkThisLibrary(b: *std.Build, target: std.Target.Query, optimize: std.builtin.Mode) *std.Build.Step.Compile {
const lib = b.addStaticLibrary(.{ .name = "raylib.zig", .target = b.resolveTargetQuery(target), .optimize = optimize });
lib.addIncludePath(.{ .path = dir_raylib });
lib.addIncludePath(.{ .path = cwd });
lib.linkLibC();
lib.addCSourceFile(.{ .file = .{ .path = cwd ++ sep ++ "marshal.c" }, .flags = &.{} });
std.log.info("include '{s}' to {s}", .{ dir_raylib, lib.name });
std.log.info("include '{s}' to {s}", .{ cwd, lib.name });
return lib;
}
/// add this package to exe
pub fn addTo(b: *std.Build, exe: *std.Build.Step.Compile, target: std.Target.Query, optimize: std.builtin.Mode, raylibOptions: raylib_build.Options) void {
exe.root_module.addAnonymousImport("raylib", .{ .root_source_file = .{ .path = cwd ++ sep ++ "raylib.zig" } });
std.log.info("include '{s}' to {s}", .{ dir_raylib, exe.name });
std.log.info("include '{s}' to {s}", .{ cwd, exe.name });
exe.addIncludePath(.{ .path = dir_raylib });
exe.addIncludePath(.{ .path = cwd });
const lib = linkThisLibrary(b, target, optimize);
const lib_raylib = raylib_build.addRaylib(b, b.resolveTargetQuery(target), optimize, raylibOptions) catch |err| std.debug.panic("addRaylib: {any}", .{err});
exe.linkLibrary(lib_raylib);
exe.linkLibrary(lib);
std.log.info("linked raylib.zig", .{});
}
pub fn linkSystemDependencies(exe: *std.build.Step.Compile) void {
switch (exe.target.getOsTag()) {
.macos => {
exe.linkFramework("Foundation");
exe.linkFramework("Cocoa");
exe.linkFramework("OpenGL");
exe.linkFramework("CoreAudio");
exe.linkFramework("CoreVideo");
exe.linkFramework("IOKit");
},
.linux => {
exe.addLibraryPath(.{ .path = "/usr/lib" });
exe.addIncludePath(.{ .path = "/usr/include" });
exe.linkSystemLibrary("GL");
exe.linkSystemLibrary("rt");
exe.linkSystemLibrary("dl");
exe.linkSystemLibrary("m");
exe.linkSystemLibrary("X11");
},
.freebsd, .openbsd, .netbsd, .dragonfly => {
exe.linkSystemLibrary("GL");
exe.linkSystemLibrary("rt");
exe.linkSystemLibrary("dl");
exe.linkSystemLibrary("m");
exe.linkSystemLibrary("X11");
exe.linkSystemLibrary("Xrandr");
exe.linkSystemLibrary("Xinerama");
exe.linkSystemLibrary("Xi");
exe.linkSystemLibrary("Xxf86vm");
exe.linkSystemLibrary("Xcursor");
},
else => {},
}
exe.linkLibC();
}