const std = @import("std"); pub fn build(b: *std.build.Builder) void { // Standard target options allows the person running `zig build` to choose // what target to build for. Here we do not override the defaults, which // means any target is allowed, and the default is native. Other options // for restricting supported target set are available. const target = b.standardTargetOptions(.{}); // Standard release options allow the person running `zig build` to select // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. const mode = b.standardReleaseOptions(); const exe = switch (target.getOs().tag) { .linux => b.addExecutable("clipboard", "src/main-linux.zig"), .windows => b.addExecutable("clipboard", "src/main-windows.zig"), else => std.os.exit(1), }; exe.setTarget(target); exe.setBuildMode(mode); if (target.getOs().tag == .linux) { exe.linkLibC(); // LibX11 1.7.2: https://gitlab.freedesktop.org/xorg/lib/libx11/-/archive/libX11-1.7.2/libx11-libX11-1.7.2.tar.gz // LibXfixes 5.0.3: https://gitlab.freedesktop.org/xorg/lib/libxfixes/-/archive/libXfixes-5.0.3/libxfixes-libXfixes-5.0.3.tar.gz // XOrg Proto: https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/archive/xorgproto-2021.5/xorgproto-xorgproto-2021.5.tar.gz // We can download the above by taking each url and processing in a // command e.g.: // curl | tar xz --wildcards '*.h' exe.addIncludeDir("libx11-libX11-1.7.2/include"); exe.addIncludeDir("libxfixes-libXfixes-5.0.3/include"); exe.addIncludeDir("xorgproto-xorgproto-2021.5/include"); // More than a little messy. We're grabbing libX11 and libXfixes from // the host, while using downloaded headers. This assumes debian // bullseye host, and also means you can't cross-compile from Windows. // TODO: Make this better const dependent_objects = .{ "/usr/lib/x86_64-linux-gnu/libX11.so.6", "/usr/lib/x86_64-linux-gnu/libXfixes.so.3", }; inline for (dependent_objects) |obj| exe.addObjectFile(obj); } if (target.getOs().tag == .windows) { // woah...we don't actually need libc! exe.linkSystemLibrary("user32"); } exe.install(); const run_cmd = exe.run(); run_cmd.step.dependOn(b.getInstallStep()); if (b.args) |args| { run_cmd.addArgs(args); } const run_step = b.step("run", "Run the app"); run_step.dependOn(&run_cmd.step); }