diff --git a/build.zig b/build.zig index 2261248d..2da9f53e 100644 --- a/build.zig +++ b/build.zig @@ -6,7 +6,7 @@ const glfw = @import("libs/glfw/build.zig").Sdk(.{ // error: TarUnsupportedFileType .xcode_frameworks = @import("libs/gpu-dawn/libs/xcode-frameworks/build.zig"), }); -const sysaudio = @import("mach_sysaudio").Sdk(); +const sysaudio = @import("mach_sysaudio"); pub const gpu_dawn = @import("libs/gpu-dawn/build.zig").Sdk(.{ // TODO(build-system): This cannot be imported with the Zig package manager // error: TarUnsupportedFileType diff --git a/build.zig.zon b/build.zig.zon index 02b196f3..6a14c1f7 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -26,6 +26,10 @@ .url = "https://github.com/hexops/mach-basisu/archive/831de64fe2d7933d6418440f8558444ca32eeca5.tar.gz", .hash = "1220ead8a15f606d6f0f853fe401460dfe18811e3d5d1aa7e808be825e44f17f0dc3", }, + .mach_sysaudio = .{ + .url = "https://github.com/hexops/mach-sysaudio/archive/bc03624694ddf3a7d348efdeccf82404eb019236.tar.gz", + .hash = "12203830507ce345848f27ffd27369e726c35ce115edb66f9ba9ee524d8a46c0a87a", + }, .direct3d_headers = .{ .url = "https://github.com/hexops/direct3d-headers/archive/773dce3f079eecdccc7c71d1318a0741649d568b.tar.gz", .hash = "12200d2155216c5eb5f111282cd355b5433cad6a68fd040294e695149cba329f7c12", diff --git a/libs/sysaudio/build.zig b/libs/sysaudio/build.zig index 5617d9bc..758ff2b3 100644 --- a/libs/sysaudio/build.zig +++ b/libs/sysaudio/build.zig @@ -3,10 +3,9 @@ const std = @import("std"); pub fn build(b: *std.Build) void { const optimize = b.standardOptimizeOption(.{}); const target = b.standardTargetOptions(.{}); - const sysaudio = Sdk(); const test_step = b.step("test", "Run library tests"); - test_step.dependOn(&sysaudio.testStep(b, optimize, target).step); + test_step.dependOn(&testStep(b, optimize, target).step); inline for ([_][]const u8{ "sine-wave", @@ -17,8 +16,8 @@ pub fn build(b: *std.Build) void { .target = target, .optimize = optimize, }); - example_exe.addModule("sysaudio", sysaudio.module(b, optimize, target)); - sysaudio.link(b, example_exe, .{}); + example_exe.addModule("sysaudio", module(b, optimize, target)); + link(b, example_exe, .{}); b.installArtifact(example_exe); const example_compile_step = b.step("example-" ++ example, "Compile '" ++ example ++ "' example"); @@ -35,98 +34,94 @@ pub fn build(b: *std.Build) void { } } -pub fn Sdk() type { - return struct { - pub const Options = struct { - install_libs: bool = false, - }; +pub const Options = struct { + install_libs: bool = false, +}; - var _module: ?*std.build.Module = null; +var _module: ?*std.build.Module = null; - pub fn module(b: *std.Build, optimize: std.builtin.OptimizeMode, target: std.zig.CrossTarget) *std.build.Module { - if (_module) |m| return m; +pub fn module(b: *std.Build, optimize: std.builtin.OptimizeMode, target: std.zig.CrossTarget) *std.build.Module { + if (_module) |m| return m; - if (target.getCpuArch() == .wasm32) { - const sysjs_dep = b.dependency("mach_sysjs", .{ - .target = target, - .optimize = optimize, - }); - _module = b.createModule(.{ - .source_file = .{ .path = sdkPath("/src/main.zig") }, - .dependencies = &.{ - .{ .name = "sysjs", .module = sysjs_dep.module("mach-sysjs") }, - }, - }); - } else { - _module = b.createModule(.{ - .source_file = .{ .path = sdkPath("/src/main.zig") }, - }); - } - return _module.?; + if (target.getCpuArch() == .wasm32) { + const sysjs_dep = b.dependency("mach_sysjs", .{ + .target = target, + .optimize = optimize, + }); + _module = b.createModule(.{ + .source_file = .{ .path = sdkPath("/src/main.zig") }, + .dependencies = &.{ + .{ .name = "sysjs", .module = sysjs_dep.module("mach-sysjs") }, + }, + }); + } else { + _module = b.createModule(.{ + .source_file = .{ .path = sdkPath("/src/main.zig") }, + }); + } + return _module.?; +} + +pub fn testStep(b: *std.Build, optimize: std.builtin.OptimizeMode, target: std.zig.CrossTarget) *std.build.RunStep { + const main_tests = b.addTest(.{ + .name = "sysaudio-tests", + .root_source_file = .{ .path = sdkPath("/src/main.zig") }, + .target = target, + .optimize = optimize, + }); + link(b, main_tests, .{}); + b.installArtifact(main_tests); + return b.addRunArtifact(main_tests); +} + +pub fn link(b: *std.Build, step: *std.build.CompileStep, options: Options) void { + if (step.target.toTarget().cpu.arch != .wasm32) { + if (step.target.toTarget().isDarwin()) { + // TODO(build-system): This cannot be imported with the Zig package manager + // error: TarUnsupportedFileType + // + // step.linkLibrary(b.dependency("xcode_frameworks", .{ + // .target = step.target, + // .optimize = step.optimize, + // }).artifact("xcode-frameworks")); + // @import("xcode_frameworks").addPaths(step); + xcode_frameworks.addPaths(b, step); + + step.linkFramework("AudioToolbox"); + step.linkFramework("CoreFoundation"); + step.linkFramework("CoreAudio"); + } else if (step.target.toTarget().os.tag == .linux) { + step.linkLibrary(b.dependency("linux_audio_headers", .{ + .target = step.target, + .optimize = step.optimize, + }).artifact("linux-audio-headers")); + step.addCSourceFile(sdkPath("/src/pipewire/sysaudio.c"), &.{"-std=gnu99"}); + step.linkLibC(); } + } + if (options.install_libs) { + b.installArtifact(step); + } +} - pub fn testStep(b: *std.Build, optimize: std.builtin.OptimizeMode, target: std.zig.CrossTarget) *std.build.RunStep { - const main_tests = b.addTest(.{ - .name = "sysaudio-tests", - .root_source_file = .{ .path = sdkPath("/src/main.zig") }, - .target = target, - .optimize = optimize, - }); - link(b, main_tests, .{}); - b.installArtifact(main_tests); - return b.addRunArtifact(main_tests); - } +fn ensureDependencySubmodule(allocator: std.mem.Allocator, path: []const u8) !void { + if (std.process.getEnvVarOwned(allocator, "NO_ENSURE_SUBMODULES")) |no_ensure_submodules| { + defer allocator.free(no_ensure_submodules); + if (std.mem.eql(u8, no_ensure_submodules, "true")) return; + } else |_| {} + var child = std.ChildProcess.init(&.{ "git", "submodule", "update", "--init", path }, allocator); + child.cwd = sdkPath("/"); + child.stderr = std.io.getStdErr(); + child.stdout = std.io.getStdOut(); - pub fn link(b: *std.Build, step: *std.build.CompileStep, options: Options) void { - if (step.target.toTarget().cpu.arch != .wasm32) { - if (step.target.toTarget().isDarwin()) { - // TODO(build-system): This cannot be imported with the Zig package manager - // error: TarUnsupportedFileType - // - // step.linkLibrary(b.dependency("xcode_frameworks", .{ - // .target = step.target, - // .optimize = step.optimize, - // }).artifact("xcode-frameworks")); - // @import("xcode_frameworks").addPaths(step); - xcode_frameworks.addPaths(b, step); + _ = try child.spawnAndWait(); +} - step.linkFramework("AudioToolbox"); - step.linkFramework("CoreFoundation"); - step.linkFramework("CoreAudio"); - } else if (step.target.toTarget().os.tag == .linux) { - step.linkLibrary(b.dependency("linux_audio_headers", .{ - .target = step.target, - .optimize = step.optimize, - }).artifact("linux-audio-headers")); - step.addCSourceFile(sdkPath("/src/pipewire/sysaudio.c"), &.{"-std=gnu99"}); - step.linkLibC(); - } - } - if (options.install_libs) { - b.installArtifact(step); - } - } - - fn ensureDependencySubmodule(allocator: std.mem.Allocator, path: []const u8) !void { - if (std.process.getEnvVarOwned(allocator, "NO_ENSURE_SUBMODULES")) |no_ensure_submodules| { - defer allocator.free(no_ensure_submodules); - if (std.mem.eql(u8, no_ensure_submodules, "true")) return; - } else |_| {} - var child = std.ChildProcess.init(&.{ "git", "submodule", "update", "--init", path }, allocator); - child.cwd = sdkPath("/"); - child.stderr = std.io.getStdErr(); - child.stdout = std.io.getStdOut(); - - _ = try child.spawnAndWait(); - } - - fn sdkPath(comptime suffix: []const u8) []const u8 { - if (suffix[0] != '/') @compileError("suffix must be an absolute path"); - return comptime blk: { - const root_dir = std.fs.path.dirname(@src().file) orelse "."; - break :blk root_dir ++ suffix; - }; - } +fn sdkPath(comptime suffix: []const u8) []const u8 { + if (suffix[0] != '/') @compileError("suffix must be an absolute path"); + return comptime blk: { + const root_dir = std.fs.path.dirname(@src().file) orelse "."; + break :blk root_dir ++ suffix; }; }