diff --git a/build.zig b/build.zig index 7c62ca75..c092c2b4 100644 --- a/build.zig +++ b/build.zig @@ -6,7 +6,7 @@ const glfw = @import("libs/glfw/sdk.zig").Sdk(.{ // error: TarUnsupportedFileType .xcode_frameworks = @import("libs/gpu-dawn/libs/xcode-frameworks/build.zig"), }); -const sysaudio = @import("libs/sysaudio/sdk.zig").Sdk(.{ +const sysaudio = @import("libs/sysaudio/build.zig").Sdk(.{ // TODO(build-system): This cannot be imported with the Zig package manager // error: TarUnsupportedFileType .xcode_frameworks = @import("libs/gpu-dawn/libs/xcode-frameworks/build.zig"), diff --git a/libs/sysaudio/build.zig b/libs/sysaudio/build.zig index de5a1515..62dbb444 100644 --- a/libs/sysaudio/build.zig +++ b/libs/sysaudio/build.zig @@ -1,10 +1,9 @@ const std = @import("std"); -const sysaudio_sdk = @import("sdk.zig"); pub fn build(b: *std.Build) void { const optimize = b.standardOptimizeOption(.{}); const target = b.standardTargetOptions(.{}); - const sysaudio = sysaudio_sdk.Sdk(.{ + const sysaudio = Sdk(.{ // TODO(build-system): This cannot be imported with the Zig package manager // error: TarUnsupportedFileType .xcode_frameworks = @import("libs/xcode-frameworks/build.zig"), @@ -39,3 +38,98 @@ pub fn build(b: *std.Build) void { example_run_step.dependOn(&example_run_cmd.step); } } + +pub fn Sdk(comptime deps: anytype) type { + return struct { + pub const Options = struct { + install_libs: bool = false, + }; + + 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; + + 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); + deps.xcode_frameworks.addPaths(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); + } + } + + 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; + }; + } + }; +} diff --git a/libs/sysaudio/sdk.zig b/libs/sysaudio/sdk.zig deleted file mode 100644 index 534b5b98..00000000 --- a/libs/sysaudio/sdk.zig +++ /dev/null @@ -1,96 +0,0 @@ -const std = @import("std"); - -pub fn Sdk(comptime deps: anytype) type { - return struct { - pub const Options = struct { - install_libs: bool = false, - }; - - 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; - - 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); - deps.xcode_frameworks.addPaths(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); - } - } - - 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; - }; - } - }; -}