oxwm

https://git.tonybtw.com/oxwm.git git://git.tonybtw.com/oxwm.git
5,714 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.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
}