zgui/build.zig

224 lines
6.8 KiB
Zig
Raw Normal View History

2022-12-31 06:40:03 +00:00
const std = @import("std");
const zglfw = @import("zglfw");
const zgpu = @import("zgpu");
2022-12-31 06:40:03 +00:00
pub const Backend = enum {
no_backend,
glfw_wgpu,
glfw_opengl3,
2022-12-31 06:40:03 +00:00
win32_dx12,
};
const default_options = struct {
const shared = false;
const with_imgui = true;
const with_implot = true;
};
2023-02-07 23:23:40 +00:00
pub const Options = struct {
2022-12-31 06:40:03 +00:00
backend: Backend,
shared: bool = default_options.shared,
/// use bundled imgui source
with_imgui: bool = default_options.with_imgui,
/// use bundled implot source
with_implot: bool = default_options.with_implot,
2022-12-31 06:40:03 +00:00
};
2023-02-07 23:23:40 +00:00
pub const Package = struct {
options: Options,
2023-03-27 00:24:04 +00:00
zgui: *std.Build.Module,
zgui_options: *std.Build.Module,
zgui_c_cpp: *std.Build.CompileStep,
pub fn link(pkg: Package, exe: *std.Build.CompileStep) void {
exe.linkLibrary(pkg.zgui_c_cpp);
exe.addModule("zgui", pkg.zgui);
exe.addModule("zgui_options", pkg.zgui_options);
2023-03-27 00:24:04 +00:00
}
2022-12-31 06:40:03 +00:00
};
2023-02-07 23:23:40 +00:00
pub fn package(
b: *std.Build,
2023-03-27 00:24:04 +00:00
target: std.zig.CrossTarget,
optimize: std.builtin.Mode,
2023-02-07 23:23:40 +00:00
args: struct {
options: Options,
},
) Package {
const step = b.addOptions();
step.addOption(Backend, "backend", args.options.backend);
2023-03-27 00:24:04 +00:00
step.addOption(bool, "shared", args.options.shared);
2023-02-07 23:23:40 +00:00
2023-03-27 00:24:04 +00:00
const zgui_options = step.createModule();
2023-02-07 23:23:40 +00:00
const zgui = b.addModule("zgui", .{
2023-06-19 15:44:38 +00:00
.source_file = .{ .path = thisDir() ++ "/src/gui.zig" },
2023-02-07 23:23:40 +00:00
.dependencies = &.{
2023-03-27 00:24:04 +00:00
.{ .name = "zgui_options", .module = zgui_options },
2023-02-07 23:23:40 +00:00
},
});
2023-03-27 00:24:04 +00:00
const zgui_c_cpp = if (args.options.shared) blk: {
const lib = b.addSharedLibrary(.{
.name = "zgui",
.target = target,
.optimize = optimize,
});
2023-04-14 02:53:57 +00:00
b.installArtifact(lib);
2023-03-27 00:24:04 +00:00
if (target.isWindows()) {
lib.defineCMacro("IMGUI_API", "__declspec(dllexport)");
lib.defineCMacro("IMPLOT_API", "__declspec(dllexport)");
lib.defineCMacro("ZGUI_API", "__declspec(dllexport)");
}
if (target.isDarwin()) {
lib.linker_allow_shlib_undefined = true;
}
2023-03-27 00:24:04 +00:00
break :blk lib;
} else b.addStaticLibrary(.{
.name = "zgui",
.target = target,
.optimize = optimize,
});
2022-12-31 06:40:03 +00:00
zgui_c_cpp.addIncludePath(.{ .path = thisDir() ++ "/libs" });
zgui_c_cpp.addIncludePath(.{ .path = thisDir() ++ "/libs/imgui" });
2022-12-31 06:40:03 +00:00
const abi = (std.zig.system.NativeTargetInfo.detect(target) catch unreachable).target.abi;
2023-03-27 00:24:04 +00:00
zgui_c_cpp.linkLibC();
if (abi != .msvc)
zgui_c_cpp.linkLibCpp();
2022-12-31 06:40:03 +00:00
const cflags = &.{"-fno-sanitize=undefined"};
zgui_c_cpp.addCSourceFile(.{
.file = .{ .path = thisDir() ++ "/src/zgui.cpp" },
.flags = cflags,
});
2022-12-31 06:40:03 +00:00
if (args.options.with_imgui) {
zgui_c_cpp.addCSourceFiles(.{
.files = &.{
thisDir() ++ "/libs/imgui/imgui.cpp",
thisDir() ++ "/libs/imgui/imgui_widgets.cpp",
thisDir() ++ "/libs/imgui/imgui_tables.cpp",
thisDir() ++ "/libs/imgui/imgui_draw.cpp",
thisDir() ++ "/libs/imgui/imgui_demo.cpp",
},
.flags = cflags,
});
}
2022-12-31 06:40:03 +00:00
if (args.options.with_implot) {
zgui_c_cpp.defineCMacro("ZGUI_IMPLOT", "1");
zgui_c_cpp.addCSourceFiles(.{
.files = &.{
thisDir() ++ "/libs/imgui/implot_demo.cpp",
thisDir() ++ "/libs/imgui/implot.cpp",
thisDir() ++ "/libs/imgui/implot_items.cpp",
},
.flags = cflags,
});
} else {
zgui_c_cpp.defineCMacro("ZGUI_IMPLOT", "0");
}
2022-12-31 06:40:03 +00:00
2023-03-27 00:24:04 +00:00
switch (args.options.backend) {
2022-12-31 06:40:03 +00:00
.glfw_wgpu => {
zgui_c_cpp.addIncludePath(.{ .path = zglfw.path ++ "/libs/glfw/include" });
zgui_c_cpp.addIncludePath(.{ .path = zgpu.path ++ "/libs/dawn/include" });
zgui_c_cpp.addCSourceFiles(.{
.files = &.{
thisDir() ++ "/libs/imgui/backends/imgui_impl_glfw.cpp",
thisDir() ++ "/libs/imgui/backends/imgui_impl_wgpu.cpp",
},
.flags = cflags,
});
},
.glfw_opengl3 => {
zgui_c_cpp.addIncludePath(.{ .path = zglfw.path ++ "/libs/glfw/include" });
zgui_c_cpp.addIncludePath(.{ .path = zgpu.path ++ "/libs/dawn/include" });
zgui_c_cpp.addCSourceFiles(.{
.files = &.{
thisDir() ++ "/libs/imgui/backends/imgui_impl_glfw.cpp",
thisDir() ++ "/libs/imgui/backends/imgui_impl_opengl3.cpp",
},
.flags = &(cflags.* ++ .{"-DIMGUI_IMPL_OPENGL_LOADER_CUSTOM"}),
});
2022-12-31 06:40:03 +00:00
},
.win32_dx12 => {
zgui_c_cpp.addCSourceFiles(.{
.files = &.{
thisDir() ++ "/libs/imgui/backends/imgui_impl_win32.cpp",
thisDir() ++ "/libs/imgui/backends/imgui_impl_dx12.cpp",
},
.flags = cflags,
});
2023-03-27 00:24:04 +00:00
zgui_c_cpp.linkSystemLibraryName("d3dcompiler_47");
zgui_c_cpp.linkSystemLibraryName("dwmapi");
2022-12-31 06:40:03 +00:00
},
.no_backend => {},
}
2023-03-27 00:24:04 +00:00
return .{
.options = args.options,
.zgui = zgui,
.zgui_options = zgui_options,
.zgui_c_cpp = zgui_c_cpp,
};
2022-12-31 06:40:03 +00:00
}
pub fn build(b: *std.Build) void {
const optimize = b.standardOptimizeOption(.{});
const target = b.standardTargetOptions(.{});
_ = package(b, target, optimize, .{
.options = .{
.backend = b.option(Backend, "backend", "Select backend") orelse .no_backend,
.shared = b.option(
bool,
"shared",
"Bulid as a shared library",
) orelse default_options.shared,
.with_imgui = b.option(
bool,
"with_imgui",
"Build with bundled imgui source",
) orelse default_options.with_imgui,
.with_implot = b.option(
bool,
"with_implot",
"Build with bundled implot source",
) orelse default_options.with_implot,
},
});
const test_step = b.step("test", "Run zgui tests");
test_step.dependOn(runTests(b, optimize, target));
}
pub fn runTests(
b: *std.Build,
optimize: std.builtin.OptimizeMode,
target: std.zig.CrossTarget,
) *std.Build.Step {
const gui_tests = b.addTest(.{
.name = "gui-tests",
.root_source_file = .{ .path = thisDir() ++ "/src/gui.zig" },
.target = target,
.optimize = optimize,
});
const pkg = package(b, target, optimize, .{
.options = .{ .backend = .no_backend },
});
pkg.link(gui_tests);
return &b.addRunArtifact(gui_tests).step;
}
2023-03-27 00:24:04 +00:00
2022-12-31 06:40:03 +00:00
inline fn thisDir() []const u8 {
return comptime std.fs.path.dirname(@src().file) orelse ".";
}