const std = @import("std"); const Builder = std.build.Builder; const SemanticVersion = std.SemanticVersion; const share_prefix = "share/arkta/es/"; const version = "0.3.0"; 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_file = b.addWriteFile(name, data); const write_file_install = b.addInstallFile( write_file.getFileSource(name).?, share_prefix ++ name, ); write_file_install.step.dependOn(&write_file.step); b.getInstallStep().dependOn(&write_file_install.step); } pub fn build(b: *Builder) void { const target = b.standardTargetOptions(.{}); const mode = b.standardReleaseOptions(); const options = b.addOptions(); options.addOption( SemanticVersion, "es_version", SemanticVersion.parse(version) catch unreachable, ); 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("es", "src/main.zig"); exe.setTarget(target); exe.setBuildMode(mode); exe.addOptions("es-config", options); exe.install(); installGeneratedFile( b, "es.ini", comptime std.fmt.comptimePrint(config.template, config.default), ); const run_cmd = exe.run(); 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); }