oxwm

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