const std = @import("std"); const Builder = std.Build; const SemanticVersion = std.SemanticVersion; const share_prefix = "share/arkta/es/"; const version = "0.3.0"; const semver = SemanticVersion.parse(version) catch unreachable; const config = struct { template: []const u8 = @embedFile("es.ini.in"), default: struct { hard_tabs: bool = false, line_limit: usize = 100, page_overlap: usize = 2, tab_stop: usize = 4, } = .{}, }{}; fn installGeneratedFile(b: *Builder, comptime name: []const u8, data: []const u8) void { const write_files = b.addWriteFiles(); const write_file = write_files.add(name, data); const write_file_install = b.addInstallFile(write_file, share_prefix ++ name); write_file_install.step.dependOn(&write_files.step); b.getInstallStep().dependOn(&write_file_install.step); } pub fn build(b: *Builder) void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); const options = b.addOptions(); options.addOption(SemanticVersion, "es_version", semver); options.addOption(bool, "default_hard_tabs", config.default.hard_tabs); options.addOption(usize, "default_line_limit", config.default.line_limit); options.addOption(usize, "default_page_overlap", config.default.page_overlap); options.addOption(usize, "default_tab_stop", config.default.tab_stop); const exe = b.addExecutable(.{ .name = "es", .version = semver, .root_source_file = .{ .path = "src/main.zig" }, .target = target, .optimize = optimize, }); exe.root_module.addOptions("es-config", options); b.installArtifact(exe); installGeneratedFile( b, "es.ini", comptime std.fmt.comptimePrint(config.template, config.default), ); const run_cmd = b.addRunArtifact(exe); 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); }