Skip to content

Commit 3594af2

Browse files
authored
Merge pull request #10 from zadockmaloba/main
Add macOS support with platform-specific build configurations and source files
2 parents af9c32c + 225e345 commit 3594af2

4 files changed

Lines changed: 311 additions & 0 deletions

File tree

.github/workflows/ci.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,7 @@ jobs:
3535

3636
- name: Build for Linux
3737
run: zig build example -Dtarget=x86_64-linux-gnu --summary all
38+
39+
- name: Build for macOS
40+
if: runner.os == 'macOS'
41+
run: zig build example -Dtarget=x86_64-macos-gnu --summary all

build.zig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const std = @import("std");
22
const linux = @import("src/linux.zig");
33
const windows = @import("src/windows.zig");
4+
const macos = @import("src/macos.zig");
45
const build_zon = @import("build.zig.zon");
56

67
const assert = std.debug.assert;
@@ -107,6 +108,7 @@ pub fn build(b: *std.Build) !void {
107108
switch (target.result.os.tag) {
108109
.linux => linux.build(b, target.result, lib, build_config_h),
109110
.windows => windows.build(b, target.result, lib, build_config_h),
111+
.macos => macos.build(b, target.result, lib, build_config_h),
110112
else => @panic("target has no default config"),
111113
}
112114
}

src/macos.zig

Lines changed: 280 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,280 @@
1+
const std = @import("std");
2+
const build_zon = @import("../build.zig.zon");
3+
const sources = @import("sdl.zon");
4+
const root = @import("../build.zig");
5+
const Subsystems = root.Subsystems;
6+
const AllDrivers = root.Drivers;
7+
8+
pub fn build(
9+
b: *std.Build,
10+
target: std.Target,
11+
lib: *std.Build.Step.Compile,
12+
build_config_h: *std.Build.Step.ConfigHeader,
13+
) void {
14+
_ = target;
15+
16+
const upstream = b.dependency("sdl", .{});
17+
18+
// Add the platform specific dependency include paths
19+
lib.addIncludePath(b.dependency("egl", .{}).path("api"));
20+
lib.addIncludePath(b.dependency("opengl", .{}).path("api"));
21+
22+
// Link with the platform specific system frameworks
23+
lib.linkFramework("Cocoa");
24+
lib.linkFramework("IOKit");
25+
lib.linkFramework("ForceFeedback");
26+
lib.linkFramework("CoreVideo");
27+
lib.linkFramework("CoreAudio");
28+
lib.linkFramework("CoreHaptics");
29+
lib.linkFramework("CoreFoundation");
30+
lib.linkFramework("CoreMedia");
31+
lib.linkFramework("CoreGraphics");
32+
lib.linkFramework("Carbon");
33+
lib.linkFramework("Metal");
34+
lib.linkFramework("QuartzCore");
35+
lib.linkFramework("AudioToolbox");
36+
lib.linkFramework("AVFoundation");
37+
lib.linkFramework("Foundation");
38+
lib.linkFramework("GameController");
39+
lib.linkFramework("CoreBluetooth");
40+
lib.linkFramework("UniformTypeIdentifiers");
41+
lib.linkSystemLibrary("iconv");
42+
43+
// Add the platform specific sources
44+
const objc_flags = root.flags.* ++ [_][]const u8{"-fobjc-arc"};
45+
lib.addCSourceFiles(.{
46+
.files = &(sources.cocoa ++ sources.darwin ++ sources.mac ++ sources.unix ++ sources.pthread),
47+
.root = upstream.path("src"),
48+
.flags = &objc_flags,
49+
});
50+
51+
// Set the platform specific build config
52+
build_config_h.addValues(.{
53+
.HAVE_GCC_ATOMICS = 1,
54+
55+
// Useful headers
56+
.HAVE_FLOAT_H = 1,
57+
.HAVE_STDARG_H = 1,
58+
.HAVE_STDDEF_H = 1,
59+
.HAVE_STDINT_H = 1,
60+
.HAVE_LIBC = 1,
61+
.HAVE_ALLOCA_H = 1,
62+
.HAVE_INTTYPES_H = 1,
63+
.HAVE_LIMITS_H = 1,
64+
.HAVE_MATH_H = 1,
65+
.HAVE_SIGNAL_H = 1,
66+
.HAVE_STDIO_H = 1,
67+
.HAVE_STDLIB_H = 1,
68+
.HAVE_STRINGS_H = 1,
69+
.HAVE_STRING_H = 1,
70+
.HAVE_SYS_TYPES_H = 1,
71+
.HAVE_WCHAR_H = 1,
72+
73+
// C library functions
74+
.HAVE_DLOPEN = 1,
75+
.HAVE_MALLOC = 1,
76+
.HAVE_CALLOC = 1,
77+
.HAVE_REALLOC = 1,
78+
.HAVE_FREE = 1,
79+
.HAVE_GETENV = 1,
80+
.HAVE_SETENV = 1,
81+
.HAVE_PUTENV = 1,
82+
.HAVE_UNSETENV = 1,
83+
.HAVE_ABS = 1,
84+
.HAVE_BCOPY = 1,
85+
.HAVE_MEMSET = 1,
86+
.HAVE_MEMCPY = 1,
87+
.HAVE_MEMMOVE = 1,
88+
.HAVE_MEMCMP = 1,
89+
.HAVE_WCSLEN = 1,
90+
.HAVE_WCSNLEN = 1,
91+
.HAVE_WCSCMP = 1,
92+
.HAVE_WCSNCMP = 1,
93+
.HAVE_STRLEN = 1,
94+
.HAVE_STRNLEN = 1,
95+
.HAVE_STRCHR = 1,
96+
.HAVE_STRRCHR = 1,
97+
.HAVE_STRSTR = 1,
98+
.HAVE_STRTOK_R = 1,
99+
.HAVE_STRTOL = 1,
100+
.HAVE_STRTOUL = 1,
101+
.HAVE_STRTOLL = 1,
102+
.HAVE_STRTOULL = 1,
103+
.HAVE_STRTOD = 1,
104+
.HAVE_ATOI = 1,
105+
.HAVE_ATOF = 1,
106+
.HAVE_STRCMP = 1,
107+
.HAVE_STRNCMP = 1,
108+
.HAVE_STRPBRK = 1,
109+
.HAVE_VSSCANF = 1,
110+
.HAVE_VSNPRINTF = 1,
111+
.HAVE_ACOS = 1,
112+
.HAVE_ACOSF = 1,
113+
.HAVE_ASIN = 1,
114+
.HAVE_ASINF = 1,
115+
.HAVE_ATAN = 1,
116+
.HAVE_ATANF = 1,
117+
.HAVE_ATAN2 = 1,
118+
.HAVE_ATAN2F = 1,
119+
.HAVE_CEIL = 1,
120+
.HAVE_CEILF = 1,
121+
.HAVE_COPYSIGN = 1,
122+
.HAVE_COPYSIGNF = 1,
123+
.HAVE_COS = 1,
124+
.HAVE_COSF = 1,
125+
.HAVE_EXP = 1,
126+
.HAVE_EXPF = 1,
127+
.HAVE_FABS = 1,
128+
.HAVE_FABSF = 1,
129+
.HAVE_FLOOR = 1,
130+
.HAVE_FLOORF = 1,
131+
.HAVE_FMOD = 1,
132+
.HAVE_FMODF = 1,
133+
.HAVE_ISINF = 1,
134+
.HAVE_ISINFF = 1,
135+
.HAVE_ISINF_FLOAT_MACRO = 1,
136+
.HAVE_ISNAN = 1,
137+
.HAVE_ISNANF = 1,
138+
.HAVE_ISNAN_FLOAT_MACRO = 1,
139+
.HAVE_LOG = 1,
140+
.HAVE_LOGF = 1,
141+
.HAVE_LOG10 = 1,
142+
.HAVE_LOG10F = 1,
143+
.HAVE_LROUND = 1,
144+
.HAVE_LROUNDF = 1,
145+
.HAVE_MODF = 1,
146+
.HAVE_MODFF = 1,
147+
.HAVE_POW = 1,
148+
.HAVE_POWF = 1,
149+
.HAVE_ROUND = 1,
150+
.HAVE_ROUNDF = 1,
151+
.HAVE_SCALBN = 1,
152+
.HAVE_SCALBNF = 1,
153+
.HAVE_SIN = 1,
154+
.HAVE_SINF = 1,
155+
.HAVE_SQRT = 1,
156+
.HAVE_SQRTF = 1,
157+
.HAVE_TAN = 1,
158+
.HAVE_TANF = 1,
159+
.HAVE_TRUNC = 1,
160+
.HAVE_TRUNCF = 1,
161+
.HAVE_FSEEKO = 1,
162+
.HAVE_SIGACTION = 1,
163+
.HAVE_SA_SIGACTION = 1,
164+
.HAVE_SETJMP = 1,
165+
.HAVE_NANOSLEEP = 1,
166+
.HAVE_GMTIME_R = 1,
167+
.HAVE_LOCALTIME_R = 1,
168+
.HAVE_NL_LANGINFO = 1,
169+
.HAVE_SYSCONF = 1,
170+
.HAVE_CLOCK_GETTIME = 1,
171+
.HAVE_GETPAGESIZE = 1,
172+
.HAVE_MPROTECT = 1,
173+
.HAVE_PTHREAD_SETNAME_NP = 1,
174+
.HAVE_SEM_TIMEDWAIT = 1,
175+
.HAVE_SYSCTL = 1,
176+
.HAVE_SYSCTLBYNAME = 1,
177+
.HAVE_O_CLOEXEC = 1,
178+
.USE_POSIX_SPAWN = 1,
179+
180+
// Enable various audio drivers
181+
.SDL_AUDIO_DRIVER_COREAUDIO = 1,
182+
.SDL_AUDIO_DRIVER_DISK = 1,
183+
.SDL_AUDIO_DRIVER_DUMMY = 1,
184+
185+
// Enable various input drivers
186+
.SDL_JOYSTICK_HIDAPI = 1,
187+
.SDL_JOYSTICK_IOKIT = 1,
188+
.SDL_JOYSTICK_MFI = 1,
189+
.SDL_JOYSTICK_VIRTUAL = 1,
190+
.SDL_HAPTIC_IOKIT = 1,
191+
192+
// Enable various process implementations
193+
.SDL_PROCESS_POSIX = 1,
194+
195+
// Enable the sensor driver
196+
.SDL_SENSOR_DUMMY = 1,
197+
198+
// Enable various shared object loading systems
199+
.SDL_LOADSO_DLOPEN = 1,
200+
201+
// Enable various threading systems
202+
.SDL_THREAD_PTHREAD = 1,
203+
.SDL_THREAD_PTHREAD_RECURSIVE_MUTEX = 1,
204+
205+
// Enable various RTC systems
206+
.SDL_TIME_UNIX = 1,
207+
208+
// Enable various timer systems
209+
.SDL_TIMER_UNIX = 1,
210+
211+
// Enable various video drivers
212+
.SDL_VIDEO_DRIVER_COCOA = 1,
213+
.SDL_VIDEO_DRIVER_DUMMY = 1,
214+
215+
// Enable video render APIs
216+
.SDL_VIDEO_RENDER_METAL = 1,
217+
.SDL_VIDEO_RENDER_GPU = 1,
218+
.SDL_VIDEO_RENDER_OGL = 1,
219+
.SDL_VIDEO_RENDER_OGL_ES2 = 1,
220+
221+
// Enable OpenGL support
222+
.SDL_VIDEO_OPENGL = 1,
223+
.SDL_VIDEO_OPENGL_CGL = 1,
224+
.SDL_VIDEO_OPENGL_EGL = 1,
225+
.SDL_VIDEO_OPENGL_ES2 = 1,
226+
227+
// Enable Vulkan support
228+
.SDL_VIDEO_VULKAN = 1,
229+
230+
// Enable Metal support
231+
.SDL_VIDEO_METAL = 1,
232+
233+
// Enable GPU support
234+
.SDL_GPU_METAL = 1,
235+
236+
// Enable system power support
237+
.SDL_POWER_MACOSX = 1,
238+
239+
// Enable filesystem support
240+
.SDL_FILESYSTEM_COCOA = 1,
241+
.SDL_FSOPS_POSIX = 1,
242+
243+
// Enable camera driver
244+
.SDL_CAMERA_DRIVER_COREMEDIA = 1,
245+
.SDL_CAMERA_DRIVER_DUMMY = 1,
246+
247+
// Enable Steam storage
248+
.SDL_STORAGE_STEAM = 1,
249+
250+
// Whether SDL_DYNAMIC_API needs dlopen
251+
.DYNAPI_NEEDS_DLOPEN = 1,
252+
253+
// Unused
254+
.SDL_AUDIO_DRIVER_ALSA_DYNAMIC = "",
255+
.SDL_AUDIO_DRIVER_JACK_DYNAMIC = "",
256+
.SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC = "",
257+
.SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC = "",
258+
.SDL_AUDIO_DRIVER_SNDIO_DYNAMIC = "",
259+
.SDL_LIBUSB_DYNAMIC = "",
260+
.SDL_UDEV_DYNAMIC = "",
261+
.SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC = "",
262+
.SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM = "",
263+
.SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC = "",
264+
.SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR = "",
265+
.SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL = "",
266+
.SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR = "",
267+
.SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON = "",
268+
.SDL_VIDEO_DRIVER_X11_DYNAMIC = "",
269+
.SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR = "",
270+
.SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT = "",
271+
.SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES = "",
272+
.SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 = "",
273+
.SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR = "",
274+
.SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS = "",
275+
.SDL_CAMERA_DRIVER_PIPEWIRE_DYNAMIC = "",
276+
.SDL_LIBDECOR_VERSION_MAJOR = "",
277+
.SDL_LIBDECOR_VERSION_MINOR = "",
278+
.SDL_LIBDECOR_VERSION_PATCH = "",
279+
});
280+
}

src/sdl.zon

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,31 @@
437437
.darwin = .{
438438
"haptic/darwin/SDL_syshaptic.c",
439439
},
440+
.cocoa = .{
441+
"filesystem/cocoa/SDL_sysfilesystem.m",
442+
"locale/macos/SDL_syslocale.m",
443+
"misc/macos/SDL_sysurl.m",
444+
"video/cocoa/SDL_cocoaclipboard.m",
445+
"video/cocoa/SDL_cocoaevents.m",
446+
"video/cocoa/SDL_cocoakeyboard.m",
447+
"video/cocoa/SDL_cocoamessagebox.m",
448+
"video/cocoa/SDL_cocoametalview.m",
449+
"video/cocoa/SDL_cocoamodes.m",
450+
"video/cocoa/SDL_cocoamouse.m",
451+
"video/cocoa/SDL_cocoaopengl.m",
452+
"video/cocoa/SDL_cocoaopengles.m",
453+
"video/cocoa/SDL_cocoapen.m",
454+
"video/cocoa/SDL_cocoashape.m",
455+
"video/cocoa/SDL_cocoavideo.m",
456+
"video/cocoa/SDL_cocoavulkan.m",
457+
"video/cocoa/SDL_cocoawindow.m",
458+
"audio/coreaudio/SDL_coreaudio.m",
459+
"camera/coremedia/SDL_camera_coremedia.m",
460+
"render/metal/SDL_render_metal.m",
461+
"gpu/metal/SDL_gpu_metal.m",
462+
"joystick/darwin/SDL_iokitjoystick.c",
463+
"joystick/apple/SDL_mfijoystick.m",
464+
},
440465
.emscripten = .{
441466
"filesystem/emscripten/SDL_sysfilesystem.c",
442467
"joystick/emscripten/SDL_sysjoystick.c",

0 commit comments

Comments
 (0)