| 1 |
const std = @import("std");
|
| 2 |
|
| 3 |
pub fn build(b: *std.Build) void {
|
| 4 |
const target = b.standardTargetOptions(.{});
|
| 5 |
const optimize = b.standardOptimizeOption(.{});
|
| 6 |
|
| 7 |
const exe = b.addExecutable(.{
|
| 8 |
.name = "oxwm",
|
| 9 |
.root_module = b.createModule(.{
|
| 10 |
.root_source_file = b.path("src/main.zig"),
|
| 11 |
.target = target,
|
| 12 |
.optimize = optimize,
|
| 13 |
}),
|
| 14 |
});
|
| 15 |
|
| 16 |
exe.root_module.addAnonymousImport("templates/config.lua", .{
|
| 17 |
.root_source_file = b.path("templates/config.lua"),
|
| 18 |
});
|
| 19 |
|
| 20 |
exe.use_lld = false;
|
| 21 |
|
| 22 |
exe.linkSystemLibrary("lua5.4");
|
| 23 |
exe.linkSystemLibrary("X11");
|
| 24 |
exe.linkSystemLibrary("Xinerama");
|
| 25 |
exe.linkSystemLibrary("Xft");
|
| 26 |
exe.linkSystemLibrary("fontconfig");
|
| 27 |
exe.linkLibC();
|
| 28 |
|
| 29 |
b.installArtifact(exe);
|
| 30 |
|
| 31 |
const run_step = b.step("run", "Run oxwm");
|
| 32 |
const run_cmd = b.addRunArtifact(exe);
|
| 33 |
run_step.dependOn(&run_cmd.step);
|
| 34 |
run_cmd.step.dependOn(b.getInstallStep());
|
| 35 |
if (b.args) |args| {
|
| 36 |
run_cmd.addArgs(args);
|
| 37 |
}
|
| 38 |
|
| 39 |
const test_step = b.step("test", "Run unit tests");
|
| 40 |
const unit_tests = b.addTest(.{
|
| 41 |
.root_module = b.createModule(.{
|
| 42 |
.root_source_file = b.path("tests/main_tests.zig"),
|
| 43 |
.target = target,
|
| 44 |
.optimize = optimize,
|
| 45 |
}),
|
| 46 |
});
|
| 47 |
test_step.dependOn(&b.addRunArtifact(unit_tests).step);
|
| 48 |
|
| 49 |
const src_main_unit_tests = b.addTest(.{
|
| 50 |
.root_module = b.createModule(.{
|
| 51 |
.root_source_file = b.path("src/main.zig"),
|
| 52 |
.target = target,
|
| 53 |
.optimize = optimize,
|
| 54 |
}),
|
| 55 |
});
|
| 56 |
src_main_unit_tests.linkSystemLibrary("lua5.4");
|
| 57 |
src_main_unit_tests.linkSystemLibrary("X11");
|
| 58 |
src_main_unit_tests.linkSystemLibrary("Xinerama");
|
| 59 |
src_main_unit_tests.linkSystemLibrary("Xft");
|
| 60 |
src_main_unit_tests.linkSystemLibrary("fontconfig");
|
| 61 |
src_main_unit_tests.linkLibC();
|
| 62 |
test_step.dependOn(&b.addRunArtifact(src_main_unit_tests).step);
|
| 63 |
|
| 64 |
const lua_config_tests = b.addTest(.{
|
| 65 |
.root_module = b.createModule(.{
|
| 66 |
.root_source_file = b.path("tests/lua_config_tests.zig"),
|
| 67 |
.target = target,
|
| 68 |
.optimize = optimize,
|
| 69 |
}),
|
| 70 |
});
|
| 71 |
lua_config_tests.root_module.addImport("lua", b.createModule(.{
|
| 72 |
.root_source_file = b.path("src/config/lua.zig"),
|
| 73 |
.target = target,
|
| 74 |
.optimize = optimize,
|
| 75 |
}));
|
| 76 |
lua_config_tests.linkSystemLibrary("lua5.4");
|
| 77 |
lua_config_tests.linkLibC();
|
| 78 |
test_step.dependOn(&b.addRunArtifact(lua_config_tests).step);
|
| 79 |
|
| 80 |
const xephyr_step = b.step("xephyr", "Run in Xephyr (1280x800 on :2)");
|
| 81 |
xephyr_step.dependOn(&add_xephyr_run(b, exe, false).step);
|
| 82 |
|
| 83 |
const xephyr_multi_step = b.step("xephyr-multi", "Run in Xephyr multi-monitor on :2");
|
| 84 |
xephyr_multi_step.dependOn(&add_xephyr_run(b, exe, true).step);
|
| 85 |
|
| 86 |
const multimon_step = b.step("multimon", "Alias for xephyr-multi");
|
| 87 |
multimon_step.dependOn(&add_xephyr_run(b, exe, true).step);
|
| 88 |
|
| 89 |
const xwayland_step = b.step("xwayland", "Run in Xwayland on :2");
|
| 90 |
xwayland_step.dependOn(&add_xwayland_run(b, exe).step);
|
| 91 |
|
| 92 |
const kill_step = b.step("kill", "Kill Xephyr and oxwm");
|
| 93 |
kill_step.dependOn(&b.addSystemCommand(&.{ "sh", "-c", "pkill -9 Xephyr || true; pkill -9 oxwm || true" }).step);
|
| 94 |
|
| 95 |
const fmt_step = b.step("fmt", "Format source files");
|
| 96 |
fmt_step.dependOn(&b.addFmt(.{ .paths = &.{"src/"} }).step);
|
| 97 |
|
| 98 |
const clean_step = b.step("clean", "Remove build artifacts");
|
| 99 |
clean_step.dependOn(&b.addSystemCommand(&.{ "rm", "-rf", "zig-out", ".zig-cache" }).step);
|
| 100 |
|
| 101 |
const install_step = b.step("install-system", "Install oxwm system-wide (requires sudo)");
|
| 102 |
install_step.dependOn(b.getInstallStep());
|
| 103 |
install_step.dependOn(&b.addSystemCommand(&.{
|
| 104 |
"sudo", "sh", "-c",
|
| 105 |
"cp zig-out/bin/oxwm /usr/bin/oxwm && " ++
|
| 106 |
"chmod +x /usr/bin/oxwm && " ++
|
| 107 |
"mkdir -p /usr/share/xsessions && " ++
|
| 108 |
"cp resources/oxwm.desktop /usr/share/xsessions/oxwm.desktop && " ++
|
| 109 |
"mkdir -p /usr/share/man/man1 && " ++
|
| 110 |
"cp resources/oxwm.1 /usr/share/man/man1/oxwm.1 && " ++
|
| 111 |
"mkdir -p /usr/share/oxwm && " ++
|
| 112 |
"cp templates/oxwm.lua /usr/share/oxwm/oxwm.lua && " ++
|
| 113 |
"echo 'oxwm installed to /usr/bin/oxwm'",
|
| 114 |
}).step);
|
| 115 |
|
| 116 |
const uninstall_step = b.step("uninstall-system", "Uninstall oxwm from system");
|
| 117 |
uninstall_step.dependOn(&b.addSystemCommand(&.{
|
| 118 |
"sudo", "sh", "-c",
|
| 119 |
"rm -f /usr/bin/oxwm /usr/share/xsessions/oxwm.desktop /usr/share/man/man1/oxwm.1 && " ++
|
| 120 |
"rm -rf /usr/share/oxwm && " ++
|
| 121 |
"echo 'oxwm uninstalled (config at ~/.config/oxwm preserved)'",
|
| 122 |
}).step);
|
| 123 |
}
|
| 124 |
|
| 125 |
fn add_xephyr_run(b: *std.Build, exe: *std.Build.Step.Compile, multimon: bool) *std.Build.Step.Run {
|
| 126 |
const kill_cmd = if (multimon)
|
| 127 |
"pkill -9 Xephyr || true; Xephyr +xinerama -glamor -screen 640x480 -screen 640x480 :2 & sleep 1"
|
| 128 |
else
|
| 129 |
"pkill -9 Xephyr || true; Xephyr -screen 1280x800 :2 & sleep 1";
|
| 130 |
|
| 131 |
const setup = b.addSystemCommand(&.{ "sh", "-c", kill_cmd });
|
| 132 |
|
| 133 |
const run_wm = b.addRunArtifact(exe);
|
| 134 |
run_wm.step.dependOn(&setup.step);
|
| 135 |
run_wm.setEnvironmentVariable("DISPLAY", ":2");
|
| 136 |
run_wm.addArgs(&.{ "-c", "resources/test-config.lua" });
|
| 137 |
|
| 138 |
return run_wm;
|
| 139 |
}
|
| 140 |
|
| 141 |
fn add_xwayland_run(b: *std.Build, exe: *std.Build.Step.Compile) *std.Build.Step.Run {
|
| 142 |
const cmd = "Xwayland -retro -noreset :2 & sleep 1";
|
| 143 |
|
| 144 |
const setup = b.addSystemCommand(&.{ "sh", "-c", cmd });
|
| 145 |
|
| 146 |
const run_wm = b.addRunArtifact(exe);
|
| 147 |
run_wm.step.dependOn(&setup.step);
|
| 148 |
run_wm.setEnvironmentVariable("DISPLAY", ":2");
|
| 149 |
|
| 150 |
return run_wm;
|
| 151 |
}
|