地圖 (Jido) is a lightweight Unix TUI file explorer designed for speed and simplicity.
1const std = @import("std");
2const builtin = @import("builtin");
3
4///Must match the `version` in `build.zig.zon`.
5const version = std.SemanticVersion{ .major = 1, .minor = 4, .patch = 0 };
6
7const targets: []const std.Target.Query = &.{
8 .{ .cpu_arch = .aarch64, .os_tag = .macos },
9 .{ .cpu_arch = .aarch64, .os_tag = .linux },
10 .{ .cpu_arch = .x86_64, .os_tag = .linux },
11 .{ .cpu_arch = .x86_64, .os_tag = .macos },
12};
13
14fn createExe(
15 b: *std.Build,
16 exe_name: []const u8,
17 target: std.Build.ResolvedTarget,
18 optimize: std.builtin.OptimizeMode,
19 build_options: *std.Build.Module,
20) !*std.Build.Step.Compile {
21 const libvaxis = b.dependency("vaxis", .{ .target = target, .optimize = optimize }).module("vaxis");
22 const fuzzig = b.dependency("fuzzig", .{ .target = target, .optimize = optimize }).module("fuzzig");
23 const zeit = b.dependency("zeit", .{ .target = target, .optimize = optimize }).module("zeit");
24 const zuid = b.dependency("zuid", .{ .target = target, .optimize = optimize }).module("zuid");
25
26 const exe = b.addExecutable(.{
27 .name = exe_name,
28 .root_module = b.createModule(.{
29 .root_source_file = b.path("src/main.zig"),
30 .target = target,
31 .optimize = optimize,
32 }),
33 });
34
35 exe.root_module.addImport("options", build_options);
36 exe.root_module.addImport("vaxis", libvaxis);
37 exe.root_module.addImport("fuzzig", fuzzig);
38 exe.root_module.addImport("zeit", zeit);
39 exe.root_module.addImport("zuid", zuid);
40
41 return exe;
42}
43
44pub fn build(b: *std.Build) !void {
45 const target = b.standardTargetOptions(.{});
46 const optimize = b.standardOptimizeOption(.{});
47
48 const build_options = b.addOptions();
49 build_options.step.name = "build options";
50 build_options.addOption(std.SemanticVersion, "version", version);
51 const build_options_module = build_options.createModule();
52
53 const build_all = b.option(bool, "all-targets", "Build all targets in ReleaseSafe mode.") orelse false;
54 if (build_all) {
55 try buildTargets(b, build_options_module);
56 return;
57 }
58
59 const exe = try createExe(b, "jido", target, optimize, build_options_module);
60 b.installArtifact(exe);
61
62 const run_cmd = b.addRunArtifact(exe);
63 run_cmd.step.dependOn(b.getInstallStep());
64 if (b.args) |args| {
65 run_cmd.addArgs(args);
66 }
67 const run_step = b.step("run", "Run the app");
68 run_step.dependOn(&run_cmd.step);
69
70 const libvaxis = b.dependency("vaxis", .{ .target = target, .optimize = optimize }).module("vaxis");
71 const fuzzig = b.dependency("fuzzig", .{ .target = target, .optimize = optimize }).module("fuzzig");
72 const zuid = b.dependency("zuid", .{ .target = target, .optimize = optimize }).module("zuid");
73 const zeit = b.dependency("zeit", .{ .target = target, .optimize = optimize }).module("zeit");
74 const test_step = b.step("test", "Run unit tests");
75 const unit_tests = b.addTest(.{
76 .root_module = b.createModule(.{
77 .root_source_file = b.path("src/main.zig"),
78 .target = target,
79 .optimize = optimize,
80 }),
81 });
82 unit_tests.root_module.addImport("options", build_options_module);
83 unit_tests.root_module.addImport("vaxis", libvaxis);
84 unit_tests.root_module.addImport("fuzzig", fuzzig);
85 unit_tests.root_module.addImport("zeit", zeit);
86 unit_tests.root_module.addImport("zuid", zuid);
87
88 const run_unit_tests = b.addRunArtifact(unit_tests);
89 test_step.dependOn(&run_unit_tests.step);
90
91 const integration_tests = &[_][]const u8{
92 "src/test_navigation.zig",
93 "src/test_file_operations.zig",
94 };
95
96 for (integration_tests) |test_file| {
97 const test_exe = b.addTest(.{
98 .root_module = b.createModule(.{
99 .root_source_file = b.path(test_file),
100 .target = target,
101 .optimize = optimize,
102 }),
103 });
104 test_exe.root_module.addImport("vaxis", libvaxis);
105 test_exe.root_module.addImport("fuzzig", fuzzig);
106 test_exe.root_module.addImport("zuid", zuid);
107 test_exe.root_module.addImport("zeit", zeit);
108 test_exe.root_module.addImport("options", build_options_module);
109
110 const run_test = b.addRunArtifact(test_exe);
111 test_step.dependOn(&run_test.step);
112 }
113}
114
115fn buildTargets(b: *std.Build, build_options: *std.Build.Module) !void {
116 for (targets) |t| {
117 const target = b.resolveTargetQuery(t);
118
119 const exe = try createExe(b, "jido", target, .ReleaseSafe, build_options);
120 b.installArtifact(exe);
121
122 const target_output = b.addInstallArtifact(exe, .{
123 .dest_dir = .{
124 .override = .{
125 .custom = try t.zigTriple(b.allocator),
126 },
127 },
128 });
129
130 b.getInstallStep().dependOn(&target_output.step);
131 }
132}