d3152247
Andrew Kelley
const std = @import("std");
d3152247
Andrew Kelley
d3152247
Andrew Kelley
pub fn build(b: *std.Build) void {
d3152247
Andrew Kelley
const target = b.standardTargetOptions(.{});
d3152247
Andrew Kelley
const optimize = b.standardOptimizeOption(.{});
5add7a07
Andrew Kelley
const dep_optimize = b.option(std.builtin.OptimizeMode, "dep-optimize", "optimization mode of most dependencies") orelse .ReleaseFast;
0ea76022
Andrew Kelley
const wasm_target = b.resolveTargetQuery(.{
0ea76022
Andrew Kelley
.cpu_arch = .wasm32,
0ea76022
Andrew Kelley
.os_tag = .freestanding,
0ea76022
Andrew Kelley
.cpu_features_add = std.Target.wasm.featureSet(&.{
0ea76022
Andrew Kelley
.atomics,
0ea76022
Andrew Kelley
.bulk_memory,
0ea76022
Andrew Kelley
// .extended_const, not supported by Safari
0ea76022
Andrew Kelley
.multivalue,
0ea76022
Andrew Kelley
.mutable_globals,
0ea76022
Andrew Kelley
.nontrapping_fptoint,
0ea76022
Andrew Kelley
.reference_types,
0ea76022
Andrew Kelley
//.relaxed_simd, not supported by Firefox or Safari
0ea76022
Andrew Kelley
.sign_ext,
0ea76022
Andrew Kelley
// observed to cause Error occured during wast conversion :
0ea76022
Andrew Kelley
// Unknown operator: 0xfd058 in Firefox 117
0ea76022
Andrew Kelley
//.simd128,
0ea76022
Andrew Kelley
// .tail_call, not supported by Safari
0ea76022
Andrew Kelley
}),
0ea76022
Andrew Kelley
});
0ea76022
Andrew Kelley
const wasm_optimize = switch (optimize) {
0ea76022
Andrew Kelley
.Debug => optimize,
0ea76022
Andrew Kelley
else => .ReleaseSmall,
0ea76022
Andrew Kelley
};
d3152247
Andrew Kelley
d3152247
Andrew Kelley
const ffmpeg_dep = b.dependency("ffmpeg", .{
d3152247
Andrew Kelley
.target = target,
5add7a07
Andrew Kelley
.optimize = dep_optimize,
d3152247
Andrew Kelley
});
3894cd54
Andrew Kelley
const python_dep = b.dependency("cpython", .{
3894cd54
Andrew Kelley
.target = target,
5add7a07
Andrew Kelley
.optimize = dep_optimize,
3894cd54
Andrew Kelley
});
d3152247
Andrew Kelley
const soundio_dep = b.dependency("soundio", .{
d3152247
Andrew Kelley
.target = target,
10f2e0f0
Andrew Kelley
// I encountered undefined behavior in the pulseaudio C library code.
5add7a07
Andrew Kelley
// If this is Debug or ReleaseSafe it gets triggered.
5add7a07
Andrew Kelley
.optimize = dep_optimize,
d3152247
Andrew Kelley
});
d3152247
Andrew Kelley
const libsoundio = soundio_dep.artifact("soundio");
d3152247
Andrew Kelley
af9a47ba
Andrew Kelley
const twi_mod = b.addModule("Twi", .{
af9a47ba
Andrew Kelley
.root_source_file = b.path("Twi/Twi.zig"),
af9a47ba
Andrew Kelley
.target = target,
af9a47ba
Andrew Kelley
.optimize = optimize,
af9a47ba
Andrew Kelley
});
af9a47ba
Andrew Kelley
d3152247
Andrew Kelley
const player = b.addModule("player", .{
0ea76022
Andrew Kelley
.root_source_file = b.path("player/root.zig"),
0ea76022
Andrew Kelley
.target = target,
0ea76022
Andrew Kelley
.optimize = optimize,
af9a47ba
Andrew Kelley
.imports = &.{
af9a47ba
Andrew Kelley
.{ .name = "Twi", .module = twi_mod },
af9a47ba
Andrew Kelley
},
0ea76022
Andrew Kelley
});
0ea76022
Andrew Kelley
0ea76022
Andrew Kelley
const shared_server = b.addModule("shared", .{
0ea76022
Andrew Kelley
.root_source_file = b.path("shared/root.zig"),
d3152247
Andrew Kelley
.target = target,
d3152247
Andrew Kelley
.optimize = optimize,
af9a47ba
Andrew Kelley
.imports = &.{
af9a47ba
Andrew Kelley
.{ .name = "Twi", .module = twi_mod },
af9a47ba
Andrew Kelley
},
d3152247
Andrew Kelley
});
d3152247
Andrew Kelley
0ea76022
Andrew Kelley
const shared_wasm = b.addModule("shared", .{
0ea76022
Andrew Kelley
.root_source_file = b.path("shared/root.zig"),
0ea76022
Andrew Kelley
.target = wasm_target,
0ea76022
Andrew Kelley
.optimize = wasm_optimize,
af9a47ba
Andrew Kelley
.imports = &.{
af9a47ba
Andrew Kelley
.{ .name = "Twi", .module = twi_mod },
af9a47ba
Andrew Kelley
},
0ea76022
Andrew Kelley
});
0ea76022
Andrew Kelley
c44961c2
Andrew Kelley
player.addImport("av", ffmpeg_dep.module("av"));
98715d16
Andrew Kelley
player.addImport("SoundIo", soundio_dep.module("SoundIo"));
d3152247
Andrew Kelley
player.linkLibrary(libsoundio);
d3152247
Andrew Kelley
d3152247
Andrew Kelley
const playlist = b.addExecutable(.{
d3152247
Andrew Kelley
.name = "playlist",
6d17e579
Andrew Kelley
.root_source_file = b.path("example/playlist.zig"),
d3152247
Andrew Kelley
.target = target,
d3152247
Andrew Kelley
.optimize = optimize,
d3152247
Andrew Kelley
});
d3152247
Andrew Kelley
playlist.root_module.addImport("player", player);
979edc80
Andrew Kelley
installBin(b, playlist);
f898e55b
Andrew Kelley
7f18aa00
Andrew Kelley
const analyze = b.addExecutable(.{
7f18aa00
Andrew Kelley
.name = "analyze",
6d17e579
Andrew Kelley
.root_source_file = b.path("example/analyze.zig"),
f898e55b
Andrew Kelley
.target = target,
f898e55b
Andrew Kelley
.optimize = optimize,
f898e55b
Andrew Kelley
});
7f18aa00
Andrew Kelley
analyze.root_module.addImport("player", player);
979edc80
Andrew Kelley
installBin(b, analyze);
222c97c7
Andrew Kelley
222c97c7
Andrew Kelley
const fingerprint = b.addExecutable(.{
222c97c7
Andrew Kelley
.name = "fingerprint",
6d17e579
Andrew Kelley
.root_source_file = b.path("example/fingerprint.zig"),
222c97c7
Andrew Kelley
.target = target,
222c97c7
Andrew Kelley
.optimize = optimize,
222c97c7
Andrew Kelley
});
222c97c7
Andrew Kelley
fingerprint.root_module.addImport("player", player);
979edc80
Andrew Kelley
installBin(b, fingerprint);
bb36552c
Andrew Kelley
bb36552c
Andrew Kelley
const groovebasin = b.addExecutable(.{
bb36552c
Andrew Kelley
.name = "groovebasin",
bb36552c
Andrew Kelley
.root_source_file = b.path("server/main.zig"),
bb36552c
Andrew Kelley
.target = target,
bb36552c
Andrew Kelley
.optimize = optimize,
bb36552c
Andrew Kelley
});
bb36552c
Andrew Kelley
groovebasin.root_module.addImport("player", player);
0ea76022
Andrew Kelley
groovebasin.root_module.addImport("shared", shared_server);
74c070ec
Andrew Kelley
groovebasin.root_module.addImport("StaticHttpFileServer", b.dependency("StaticHttpFileServer", .{
74c070ec
Andrew Kelley
.optimize = optimize,
74c070ec
Andrew Kelley
.target = target,
74c070ec
Andrew Kelley
}).module("StaticHttpFileServer"));
979edc80
Andrew Kelley
installBin(b, groovebasin);
3894cd54
Andrew Kelley
3894cd54
Andrew Kelley
b.getInstallStep().dependOn(&b.addInstallArtifact(python_dep.artifact("cpython"), .{
3894cd54
Andrew Kelley
.dest_dir = .{ .override = .{ .custom = "python" } },
3894cd54
Andrew Kelley
}).step);
3894cd54
Andrew Kelley
3894cd54
Andrew Kelley
b.installDirectory(.{
3894cd54
Andrew Kelley
.source_dir = python_dep.path("Lib"),
3894cd54
Andrew Kelley
.install_dir = .prefix,
3894cd54
Andrew Kelley
.install_subdir = "python/Lib",
3894cd54
Andrew Kelley
});
74c070ec
Andrew Kelley
74c070ec
Andrew Kelley
b.installDirectory(.{
74c070ec
Andrew Kelley
.source_dir = b.path("www"),
74c070ec
Andrew Kelley
.install_dir = .prefix,
74c070ec
Andrew Kelley
.install_subdir = "www",
74c070ec
Andrew Kelley
});
e432dfc3
Andrew Kelley
e432dfc3
Andrew Kelley
const wasm = b.addExecutable(.{
e432dfc3
Andrew Kelley
.name = "main",
e432dfc3
Andrew Kelley
.root_source_file = .{ .path = "client/main.zig" },
0ea76022
Andrew Kelley
.target = wasm_target,
0ea76022
Andrew Kelley
.optimize = wasm_optimize,
e432dfc3
Andrew Kelley
});
0ea76022
Andrew Kelley
wasm.root_module.addImport("shared", shared_wasm);
e432dfc3
Andrew Kelley
wasm.rdynamic = true; // expose exported functions to wasm
e432dfc3
Andrew Kelley
wasm.entry = .disabled;
e432dfc3
Andrew Kelley
b.getInstallStep().dependOn(&b.addInstallFile(wasm.getEmittedBin(), "www/main.wasm").step);
65ce41ed
Andrew Kelley
65ce41ed
Andrew Kelley
const unit_tests = b.addTest(.{
65ce41ed
Andrew Kelley
.root_source_file = b.path("server/main.zig"),
65ce41ed
Andrew Kelley
.target = target,
65ce41ed
Andrew Kelley
.optimize = optimize,
65ce41ed
Andrew Kelley
});
65ce41ed
Andrew Kelley
const run_unit_tests = b.addRunArtifact(unit_tests);
65ce41ed
Andrew Kelley
const test_step = b.step("test", "Run unit tests");
65ce41ed
Andrew Kelley
test_step.dependOn(&run_unit_tests.step);
979edc80
Andrew Kelley
}
979edc80
Andrew Kelley
979edc80
Andrew Kelley
fn installBin(b: *std.Build, bin: *std.Build.Step.Compile) void {
979edc80
Andrew Kelley
b.getInstallStep().dependOn(&b.addInstallArtifact(bin, .{
979edc80
Andrew Kelley
.dest_dir = .{ .override = .prefix },
979edc80
Andrew Kelley
}).step);
d3152247
Andrew Kelley
}