dear_imgui/build.zig

231 lines
9.9 KiB
Zig

const std = @import("std");
pub const flags: []const []const u8 = &.{
"-fno-exceptions",
"-fno-rtti",
"-fno-threadsafe-statics",
"-DIMGUI_USER_CONFIG=\"imconfig_zig.h\"",
};
pub fn build(b: *std.Build) void {
// Standard options
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const test_filters = b.option(
[]const []const u8,
"test-filter",
"Skip tests that do not match the specified filters.",
) orelse &.{};
const optimize_external = switch (optimize) {
.Debug => .ReleaseSafe,
else => optimize,
};
// Get the upstream code
const upstream = b.dependency("dear-imgui", .{});
// Compile Dear ImGui as a static library
const dear_imgui_lib = b.addLibrary(.{
.name = "dear_imgui",
.root_module = b.createModule(.{
.target = target,
.optimize = optimize_external,
}),
});
dear_imgui_lib.root_module.addIncludePath(upstream.path(""));
dear_imgui_lib.root_module.addIncludePath(b.path("src/include"));
dear_imgui_lib.installHeadersDirectory(b.path("src/include"), "", .{});
dear_imgui_lib.installHeadersDirectory(upstream.path("."), "", .{});
dear_imgui_lib.root_module.link_libc = true;
dear_imgui_lib.root_module.addCSourceFiles(.{
.root = upstream.path(""),
.files = &.{
"imgui.cpp",
"imgui_demo.cpp",
"imgui_draw.cpp",
"imgui_tables.cpp",
"imgui_widgets.cpp",
},
.flags = flags,
});
dear_imgui_lib.root_module.addCSourceFiles(.{
.root = b.path("src/cached"),
.files = &.{
"dcimgui.cpp",
"dcimgui_internal.cpp",
},
.flags = flags,
});
b.installArtifact(dear_imgui_lib);
// Compile the Vulkan backend as a static library
const dear_imgui_vulkan_lib = b.addLibrary(.{
.name = "dear_imgui_vulkan",
.root_module = b.createModule(.{
.target = target,
.optimize = optimize_external,
}),
});
dear_imgui_vulkan_lib.root_module.linkLibrary(dear_imgui_lib);
dear_imgui_vulkan_lib.root_module.addCSourceFile(.{ .file = upstream.path("backends/imgui_impl_vulkan.cpp"), .flags = flags });
dear_imgui_vulkan_lib.root_module.addCSourceFile(.{ .file = b.path("src/cached/dcimgui_impl_vulkan.cpp"), .flags = flags });
dear_imgui_vulkan_lib.root_module.addIncludePath(b.path("src/include"));
dear_imgui_vulkan_lib.root_module.addIncludePath(upstream.path(""));
dear_imgui_vulkan_lib.root_module.addIncludePath(upstream.path("backends"));
const vulkan_headers = b.dependency("Vulkan-Headers", .{});
dear_imgui_vulkan_lib.root_module.addIncludePath(vulkan_headers.path("include"));
dear_imgui_vulkan_lib.root_module.addCMacro("IMGUI_IMPL_VULKAN_NO_PROTOTYPES", "1"); // Assumed in generator
dear_imgui_vulkan_lib.installHeadersDirectory(upstream.path("backends"), "", .{});
dear_imgui_vulkan_lib.installHeadersDirectory(vulkan_headers.path("include"), "", .{});
b.installArtifact(dear_imgui_vulkan_lib);
// Compile the SDL3 backend as a static library
const dear_imgui_sdl3_lib = b.addLibrary(.{
.name = "dear_imgui_vulkan",
.root_module = b.createModule(.{
.target = target,
.optimize = optimize_external,
}),
});
dear_imgui_sdl3_lib.root_module.linkLibrary(dear_imgui_lib);
dear_imgui_sdl3_lib.root_module.addCSourceFile(.{ .file = upstream.path("backends/imgui_impl_sdl3.cpp"), .flags = flags });
dear_imgui_sdl3_lib.root_module.addCSourceFile(.{ .file = b.path("src/cached/dcimgui_impl_sdl3.cpp"), .flags = flags });
dear_imgui_sdl3_lib.root_module.addIncludePath(b.path("src/include"));
dear_imgui_sdl3_lib.root_module.addIncludePath(upstream.path(""));
dear_imgui_sdl3_lib.root_module.addIncludePath(upstream.path("backends"));
const sdl = b.dependency("sdl", .{});
dear_imgui_sdl3_lib.root_module.addIncludePath(sdl.path("include"));
dear_imgui_sdl3_lib.installHeadersDirectory(upstream.path("backends"), "", .{});
b.installArtifact(dear_imgui_sdl3_lib);
// Compile the generator
const generate_exe = b.addExecutable(.{
.name = "generate",
.root_module = b.createModule(.{
.root_source_file = b.path("src/generate.zig"),
.target = b.graph.host,
.optimize = optimize,
}),
});
const generate_cmd = b.addRunArtifact(generate_exe);
generate_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
generate_cmd.addArgs(args);
}
const generate_step = b.step("generate", "Generate Zig bindings for Dear ImGui. This is done automatically as part of the build process, but is exposed as an option for debugging purposes.");
generate_step.dependOn(&generate_cmd.step);
// Generate Zig bindings for Dear ImGui
const generate_dear_imgui = b.addRunArtifact(generate_exe);
generate_dear_imgui.addFileArg(b.path("src/cached/dcimgui.json"));
const dear_imgui_zig = generate_dear_imgui.addOutputFileArg("dear_imgui.zig");
generate_dear_imgui.addFileArg(b.path("src/templates/cimgui_prefix.zig.template"));
generate_dear_imgui.addFileArg(b.path("src/templates/cimgui_postfix.zig.template"));
generate_dear_imgui.addFileArg(b.path("src/cached/dcimgui_internal.json"));
const dear_imgui_zig_module = b.addModule("dear_imgui", .{
.root_source_file = dear_imgui_zig,
.target = target,
.optimize = optimize,
});
dear_imgui_zig_module.linkLibrary(dear_imgui_lib);
// Generate Zig bindings for the Vulkan backend
const generate_vulkan = b.addRunArtifact(generate_exe);
generate_vulkan.addFileArg(b.path("src/cached/dcimgui_impl_vulkan.json"));
const dear_imgui_vulkan_zig = generate_vulkan.addOutputFileArg("dear_imgui_impl_vulkan.zig");
generate_vulkan.addFileArg(b.path("src/templates/impl_vulkan_prefix.zig.template"));
generate_vulkan.addFileArg(b.path("src/templates/impl_vulkan_postfix.zig.template"));
const dear_imgui_vulkan_zig_module = b.addModule("dear_imgui_vulkan", .{
.root_source_file = dear_imgui_vulkan_zig,
.target = target,
.optimize = optimize,
});
dear_imgui_vulkan_zig_module.linkLibrary(dear_imgui_vulkan_lib);
dear_imgui_vulkan_zig_module.addImport("dear_imgui", dear_imgui_zig_module);
// Generate Zig bindings for the SDL3 backend
const generate_sdl3 = b.addRunArtifact(generate_exe);
generate_sdl3.addFileArg(b.path("src/cached/dcimgui_impl_sdl3.json"));
const dear_imgui_sdl3_zig = generate_sdl3.addOutputFileArg("dear_imgui_impl_sdl3.zig");
generate_sdl3.addFileArg(b.path("src/templates/impl_sdl3_prefix.zig.template"));
generate_sdl3.addFileArg(b.path("src/templates/impl_sdl3_postfix.zig.template"));
const dear_imgui_sdl3_zig_module = b.addModule("dear_imgui_sdl3", .{
.root_source_file = dear_imgui_sdl3_zig,
.target = target,
.optimize = optimize,
});
dear_imgui_sdl3_zig_module.linkLibrary(dear_imgui_sdl3_lib);
const tests = b.addTest(.{
.root_module = dear_imgui_zig_module,
.filters = test_filters,
});
const run_lib_unit_tests = b.addRunArtifact(tests);
const test_step = b.step("test", "Run unit tests");
test_step.dependOn(&run_lib_unit_tests.step);
const docs = tests.getEmittedDocs();
const install_docs = b.addInstallDirectory(.{
.source_dir = docs,
.install_dir = .prefix,
.install_subdir = "docs",
});
const docs_step = b.step("docs", "Build the docs");
docs_step.dependOn(&install_docs.step);
const dear_bindings = b.step("dear_bindings", "Update the cached bindings in this project's source tree to a new version of Dear ImGUI");
dear_bindings: {
const dear_bindings_path = b.graph.environ_map.get("DEAR_BINDINGS") orelse {
dear_bindings.dependOn(&b.addFail("$DEAR_BINDINGS not set").step);
break :dear_bindings;
};
{
const run = b.addSystemCommand(&.{ "python3", dear_bindings_path });
run.addArg("--imconfig-path");
run.addFileArg(b.path("src/include/imconfig_zig.h"));
run.addArg("-o");
run.addArg("src/cached/dcimgui");
run.addFileArg(upstream.path("imgui.h"));
dear_bindings.dependOn(&run.step);
run.has_side_effects = true;
}
{
const run = b.addSystemCommand(&.{ "python3", dear_bindings_path });
run.addArg("--imconfig-path");
run.addFileArg(b.path("src/include/imconfig_zig.h"));
run.addArg("-o");
run.addArg("src/cached/dcimgui_internal");
run.addFileArg(upstream.path("imgui_internal.h"));
run.addArg("--include");
run.addFileArg(upstream.path("imgui.h"));
dear_bindings.dependOn(&run.step);
run.has_side_effects = true;
}
{
const run = b.addSystemCommand(&.{ "python3", dear_bindings_path });
run.addArg("--backend");
run.addArg("--imconfig-path");
run.addFileArg(b.path("src/include/imconfig_zig.h"));
run.addArg("-o");
run.addArg("src/cached/dcimgui_impl_vulkan");
run.addFileArg(upstream.path("backends/imgui_impl_vulkan.h"));
dear_bindings.dependOn(&run.step);
run.has_side_effects = true;
}
{
const run = b.addSystemCommand(&.{ "python3", dear_bindings_path });
run.addArg("--backend");
run.addArg("--imconfig-path");
run.addFileArg(b.path("src/include/imconfig_zig.h"));
run.addArg("-o");
run.addArg("src/cached/dcimgui_impl_sdl3");
run.addFileArg(upstream.path("backends/imgui_impl_sdl3.h"));
dear_bindings.dependOn(&run.step);
run.has_side_effects = true;
}
}
}