Compile all the C files into a static lib first.

Fixes #125

The workaround was taken from here: https://github.com/ziglang/zig/issues/17091#issuecomment-1710907659
This commit is contained in:
IntegratedQuantum 2023-10-16 22:30:20 +02:00
parent 345bb0e419
commit 91bd0b031c

View File

@ -22,28 +22,34 @@ pub fn build(b: *std.build.Builder) !void {
.target = target, .target = target,
.optimize = optimize, .optimize = optimize,
}); });
const c_lib = b.addStaticLibrary(.{
.name = "c",
.target = target,
.optimize = optimize,
});
c_lib.addIncludePath(.{.path = "include"});
exe.addIncludePath(.{.path = "include"}); exe.addIncludePath(.{.path = "include"});
exe.linkLibC(); c_lib.linkLibC();
{ // compile glfw from source: { // compile glfw from source:
if(target.getOsTag() == .windows) { if(target.getOsTag() == .windows) {
exe.addCSourceFiles(&[_][]const u8 { c_lib.addCSourceFiles(&[_][]const u8 {
"lib/glfw/src/win32_init.c", "lib/glfw/src/win32_joystick.c", "lib/glfw/src/win32_monitor.c", "lib/glfw/src/win32_time.c", "lib/glfw/src/win32_thread.c", "lib/glfw/src/win32_window.c", "lib/glfw/src/wgl_context.c", "lib/glfw/src/egl_context.c", "lib/glfw/src/osmesa_context.c", "lib/glfw/src/context.c", "lib/glfw/src/init.c", "lib/glfw/src/input.c", "lib/glfw/src/monitor.c", "lib/glfw/src/vulkan.c", "lib/glfw/src/window.c" "lib/glfw/src/win32_init.c", "lib/glfw/src/win32_joystick.c", "lib/glfw/src/win32_monitor.c", "lib/glfw/src/win32_time.c", "lib/glfw/src/win32_thread.c", "lib/glfw/src/win32_window.c", "lib/glfw/src/wgl_context.c", "lib/glfw/src/egl_context.c", "lib/glfw/src/osmesa_context.c", "lib/glfw/src/context.c", "lib/glfw/src/init.c", "lib/glfw/src/input.c", "lib/glfw/src/monitor.c", "lib/glfw/src/vulkan.c", "lib/glfw/src/window.c"
}, &[_][]const u8{"-g", "-std=c99", "-D_GLFW_WIN32"}); }, &[_][]const u8{"-g", "-std=c99", "-D_GLFW_WIN32"});
exe.linkSystemLibrary("gdi32"); c_lib.linkSystemLibrary("gdi32");
exe.linkSystemLibrary("opengl32"); c_lib.linkSystemLibrary("opengl32");
exe.linkSystemLibrary("ws2_32"); c_lib.linkSystemLibrary("ws2_32");
} else if(target.getOsTag() == .linux) { } else if(target.getOsTag() == .linux) {
// TODO: if(isWayland) { // TODO: if(isWayland) {
// exe.addCSourceFiles(&[_][]const u8 { // c_lib.addCSourceFiles(&[_][]const u8 {
// "lib/glfw/src/linux_joystick.c", "lib/glfw/src/wl_init.c", "lib/glfw/src/wl_monitor.c", "lib/glfw/src/wl_window.c", "lib/glfw/src/posix_time.c", "lib/glfw/src/posix_thread.c", "lib/glfw/src/xkb_unicode.c", "lib/glfw/src/egl_context.c", "lib/glfw/src/osmesa_context.c", "lib/glfw/src/context.c", "lib/glfw/src/init.c", "lib/glfw/src/input.c", "lib/glfw/src/monitor.c", "lib/glfw/src/vulkan.c", "lib/glfw/src/window.c" // "lib/glfw/src/linux_joystick.c", "lib/glfw/src/wl_init.c", "lib/glfw/src/wl_monitor.c", "lib/glfw/src/wl_window.c", "lib/glfw/src/posix_time.c", "lib/glfw/src/posix_thread.c", "lib/glfw/src/xkb_unicode.c", "lib/glfw/src/egl_context.c", "lib/glfw/src/osmesa_context.c", "lib/glfw/src/context.c", "lib/glfw/src/init.c", "lib/glfw/src/input.c", "lib/glfw/src/monitor.c", "lib/glfw/src/vulkan.c", "lib/glfw/src/window.c"
// }, &[_][]const u8{"-g",}); // }, &[_][]const u8{"-g",});
//} else { //} else {
exe.addCSourceFiles(&[_][]const u8 { c_lib.addCSourceFiles(&[_][]const u8 {
"lib/glfw/src/linux_joystick.c", "lib/glfw/src/x11_init.c", "lib/glfw/src/x11_monitor.c", "lib/glfw/src/x11_window.c", "lib/glfw/src/xkb_unicode.c", "lib/glfw/src/posix_time.c", "lib/glfw/src/posix_thread.c", "lib/glfw/src/glx_context.c", "lib/glfw/src/egl_context.c", "lib/glfw/src/osmesa_context.c", "lib/glfw/src/context.c", "lib/glfw/src/init.c", "lib/glfw/src/input.c", "lib/glfw/src/monitor.c", "lib/glfw/src/vulkan.c", "lib/glfw/src/window.c" "lib/glfw/src/linux_joystick.c", "lib/glfw/src/x11_init.c", "lib/glfw/src/x11_monitor.c", "lib/glfw/src/x11_window.c", "lib/glfw/src/xkb_unicode.c", "lib/glfw/src/posix_time.c", "lib/glfw/src/posix_thread.c", "lib/glfw/src/glx_context.c", "lib/glfw/src/egl_context.c", "lib/glfw/src/osmesa_context.c", "lib/glfw/src/context.c", "lib/glfw/src/init.c", "lib/glfw/src/input.c", "lib/glfw/src/monitor.c", "lib/glfw/src/vulkan.c", "lib/glfw/src/window.c"
}, &[_][]const u8{"-g", "-std=c99", "-D_GLFW_X11"}); }, &[_][]const u8{"-g", "-std=c99", "-D_GLFW_X11"});
exe.linkSystemLibrary("x11"); c_lib.linkSystemLibrary("x11");
//} //}
exe.linkSystemLibrary("GL"); c_lib.linkSystemLibrary("GL");
} else { } else {
std.log.err("Unsupported target: {}\n", .{ target.getOsTag() }); std.log.err("Unsupported target: {}\n", .{ target.getOsTag() });
} }
@ -53,9 +59,10 @@ pub fn build(b: *std.build.Builder) !void {
.target = target, .target = target,
.optimize = optimize, .optimize = optimize,
}); });
c_lib.addIncludePath(portaudio.path("include"));
exe.addIncludePath(portaudio.path("include")); exe.addIncludePath(portaudio.path("include"));
exe.addIncludePath(portaudio.path("src/common")); c_lib.addIncludePath(portaudio.path("src/common"));
addPackageCSourceFiles(exe, portaudio, &[_][]const u8 { addPackageCSourceFiles(c_lib, portaudio, &[_][]const u8 {
"src/common/pa_allocation.c", "src/common/pa_allocation.c",
"src/common/pa_converters.c", "src/common/pa_converters.c",
"src/common/pa_cpuload.c", "src/common/pa_cpuload.c",
@ -69,25 +76,25 @@ pub fn build(b: *std.build.Builder) !void {
}, &[_][]const u8{"-g", "-O3"}); }, &[_][]const u8{"-g", "-O3"});
if(target.getOsTag() == .windows) { if(target.getOsTag() == .windows) {
// windows: // windows:
addPackageCSourceFiles(exe, portaudio, &[_][]const u8 {"src/os/win/pa_win_coinitialize.c", "src/os/win/pa_win_hostapis.c", "src/os/win/pa_win_util.c", "src/os/win/pa_win_waveformat.c", "src/os/win/pa_win_wdmks_utils.c", "src/os/win/pa_x86_plain_converters.c", }, &[_][]const u8{"-g", "-O3", "-DPA_USE_WASAPI"}); addPackageCSourceFiles(c_lib, portaudio, &[_][]const u8 {"src/os/win/pa_win_coinitialize.c", "src/os/win/pa_win_hostapis.c", "src/os/win/pa_win_util.c", "src/os/win/pa_win_waveformat.c", "src/os/win/pa_win_wdmks_utils.c", "src/os/win/pa_x86_plain_converters.c", }, &[_][]const u8{"-g", "-O3", "-DPA_USE_WASAPI"});
exe.addIncludePath(portaudio.path("src/os/win")); c_lib.addIncludePath(portaudio.path("src/os/win"));
exe.linkSystemLibrary("ole32"); c_lib.linkSystemLibrary("ole32");
exe.linkSystemLibrary("winmm"); c_lib.linkSystemLibrary("winmm");
exe.linkSystemLibrary("uuid"); c_lib.linkSystemLibrary("uuid");
// WASAPI: // WASAPI:
addPackageCSourceFiles(exe, portaudio, &[_][]const u8 {"src/hostapi/wasapi/pa_win_wasapi.c"}, &[_][]const u8{"-g", "-O3"}); addPackageCSourceFiles(c_lib, portaudio, &[_][]const u8 {"src/hostapi/wasapi/pa_win_wasapi.c"}, &[_][]const u8{"-g", "-O3"});
} else if(target.getOsTag() == .linux) { } else if(target.getOsTag() == .linux) {
// unix: // unix:
addPackageCSourceFiles(exe, portaudio, &[_][]const u8 {"src/os/unix/pa_unix_hostapis.c", "src/os/unix/pa_unix_util.c"}, &[_][]const u8{"-g", "-O3", "-DPA_USE_ALSA"}); addPackageCSourceFiles(c_lib, portaudio, &[_][]const u8 {"src/os/unix/pa_unix_hostapis.c", "src/os/unix/pa_unix_util.c"}, &[_][]const u8{"-g", "-O3", "-DPA_USE_ALSA"});
exe.addIncludePath(portaudio.path("src/os/unix")); c_lib.addIncludePath(portaudio.path("src/os/unix"));
// ALSA: // ALSA:
addPackageCSourceFiles(exe, portaudio, &[_][]const u8 {"src/hostapi/alsa/pa_linux_alsa.c"}, &[_][]const u8{"-g", "-O3"}); addPackageCSourceFiles(c_lib, portaudio, &[_][]const u8 {"src/hostapi/alsa/pa_linux_alsa.c"}, &[_][]const u8{"-g", "-O3"});
exe.linkSystemLibrary("asound"); c_lib.linkSystemLibrary("asound");
} else { } else {
std.log.err("Unsupported target: {}\n", .{ target.getOsTag() }); std.log.err("Unsupported target: {}\n", .{ target.getOsTag() });
} }
} }
exe.addCSourceFiles(&[_][]const u8{"lib/glad.c", "lib/stb_image.c", "lib/stb_image_write.c", "lib/stb_vorbis.c"}, &[_][]const u8{"-g", "-O3"}); c_lib.addCSourceFiles(&[_][]const u8{"lib/glad.c", "lib/stb_image.c", "lib/stb_image_write.c", "lib/stb_vorbis.c"}, &[_][]const u8{"-g", "-O3"});
exe.addAnonymousModule("gui", .{.source_file = .{.path = "src/gui/gui.zig"}}); exe.addAnonymousModule("gui", .{.source_file = .{.path = "src/gui/gui.zig"}});
exe.addAnonymousModule("server", .{.source_file = .{.path = "src/server/server.zig"}}); exe.addAnonymousModule("server", .{.source_file = .{.path = "src/server/server.zig"}});
@ -103,6 +110,7 @@ pub fn build(b: *std.build.Builder) !void {
//exe.strip = true; // Improves compile-time //exe.strip = true; // Improves compile-time
//exe.sanitize_thread = true; //exe.sanitize_thread = true;
exe.disable_stack_probing = true; // Improves tracing of stack overflow errors. exe.disable_stack_probing = true; // Improves tracing of stack overflow errors.
exe.linkLibrary(c_lib);
b.installArtifact(exe); b.installArtifact(exe);
const run_cmd = b.addRunArtifact(exe); const run_cmd = b.addRunArtifact(exe);