131 lines
5.0 KiB
Zig
131 lines
5.0 KiB
Zig
const std = @import("std");
|
|
const Builder = std.Build;
|
|
const LibExeObjStep = std.Build.Step;
|
|
const Module = std.Build.Module;
|
|
const vma_config = @import("vma_config.zig");
|
|
const version: std.SemanticVersion = @import("builtin").zig_version;
|
|
|
|
// @src() is only allowed inside of a function, so we need this wrapper
|
|
fn srcFile() []const u8 {
|
|
return @src().file;
|
|
}
|
|
const sep = std.fs.path.sep_str;
|
|
|
|
const zig_vma_path = std.fs.path.dirname(srcFile()).?;
|
|
const zig_vma_file = zig_vma_path ++ sep ++ "vma.zig";
|
|
|
|
pub fn pkg(b: *Builder, vk_root_file: []const u8) *Module {
|
|
const allocator = b.allocator;
|
|
_ = allocator;
|
|
return b.createModule(.{
|
|
.source_file = .{ .path = zig_vma_file },
|
|
.dependencies = &[_]std.Build.ModuleDependency{
|
|
.{
|
|
.name = "vk",
|
|
.module = b.createModule(
|
|
.{ .source_file = .{ .path = vk_root_file } },
|
|
),
|
|
},
|
|
},
|
|
});
|
|
}
|
|
|
|
pub fn pkg2(b: *std.Build, vk_package: anytype) *Module {
|
|
const allocator = b.allocator;
|
|
_ = allocator;
|
|
return b.createModule(.{
|
|
.root_source_file = .{ .path = zig_vma_file },
|
|
.imports = &[_]std.Build.Module.Import{
|
|
.{
|
|
.name = "vk",
|
|
.module = vk_package,
|
|
},
|
|
},
|
|
});
|
|
}
|
|
|
|
fn getConfigArgs(comptime config: vma_config.Config) []const []const u8 {
|
|
comptime {
|
|
@setEvalBranchQuota(100000);
|
|
var args: []const []const u8 = &[_][]const u8{
|
|
std.fmt.comptimePrint("-DVMA_VULKAN_VERSION={}", .{config.vulkanVersion}),
|
|
std.fmt.comptimePrint("-DVMA_DEDICATED_ALLOCATION={}", .{@intFromBool(config.dedicatedAllocation)}),
|
|
std.fmt.comptimePrint("-DVMA_BIND_MEMORY2={}", .{@intFromBool(config.bindMemory2)}),
|
|
std.fmt.comptimePrint("-DVMA_MEMORY_BUDGET={}", .{@intFromBool(config.memoryBudget)}),
|
|
std.fmt.comptimePrint("-DVMA_STATIC_VULKAN_FUNCTIONS={}", .{@intFromBool(config.staticVulkanFunctions)}),
|
|
std.fmt.comptimePrint("-DVMA_STATS_STRING_ENABLED={}", .{@intFromBool(config.statsStringEnabled)}),
|
|
};
|
|
if (config.debugInitializeAllocations) |value| {
|
|
args = args ++ &[_][]const u8{std.fmt.comptimePrint(
|
|
"-DVMA_DEBUG_INITIALIZE_ALLOCATIONS={}",
|
|
.{@intFromBool(value)},
|
|
)};
|
|
}
|
|
if (config.debugMargin) |value| {
|
|
args = args ++ &[_][]const u8{std.fmt.comptimePrint(
|
|
"-DVMA_DEBUG_MARGIN={}",
|
|
.{value},
|
|
)};
|
|
}
|
|
if (config.debugDetectCorruption) |value| {
|
|
args = args ++ &[_][]const u8{std.fmt.comptimePrint(
|
|
"-DVMA_DEBUG_DETECT_CORRUPTION={}",
|
|
.{@intFromBool(value)},
|
|
)};
|
|
}
|
|
if (config.recordingEnabled) |value| {
|
|
args = args ++ &[_][]const u8{std.fmt.comptimePrint(
|
|
"-DVMA_RECORDING_ENABLED={}",
|
|
.{@intFromBool(value)},
|
|
)};
|
|
}
|
|
if (config.debugMinBufferImageGranularity) |value| {
|
|
args = args ++ &[_][]const u8{std.fmt.comptimePrint(
|
|
"-DVMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY={}",
|
|
.{value},
|
|
)};
|
|
}
|
|
if (config.debugGlobalMutex) |value| {
|
|
args = args ++ &[_][]const u8{std.fmt.comptimePrint(
|
|
"-DVMA_DEBUG_GLOBAL_MUTEX={}",
|
|
.{@intFromBool(value)},
|
|
)};
|
|
}
|
|
if (config.useStlContainers) |value| {
|
|
args = args ++ &[_][]const u8{std.fmt.comptimePrint(
|
|
"-DVMA_USE_STL_CONTAINERS={}",
|
|
.{@intFromBool(value)},
|
|
)};
|
|
}
|
|
if (config.useStlSharedMutex) |value| {
|
|
args = args ++ &[_][]const u8{std.fmt.comptimePrint(
|
|
"-DVMA_USE_STL_SHARED_MUTEX={}",
|
|
.{@intFromBool(value)},
|
|
)};
|
|
}
|
|
|
|
return args;
|
|
}
|
|
}
|
|
|
|
pub fn link(object: *std.Build.Step.Compile, vk_package: anytype, mode: std.builtin.Mode, target: std.Build.ResolvedTarget, builder: *Builder) void {
|
|
const package = pkg2(builder, vk_package);
|
|
linkWithoutModule(object, mode, target);
|
|
object.root_module.addImport("vma", package);
|
|
}
|
|
|
|
pub fn linkWithoutModule(object: *std.Build.Step.Compile, mode: std.builtin.Mode, target: std.Build.ResolvedTarget) void {
|
|
const commonArgs = &[_][]const u8{ "-std=c++14", "-DVMA_IMPLEMENTATION" };
|
|
const releaseArgs = &[_][]const u8{} ++ commonArgs ++ comptime getConfigArgs(vma_config.releaseConfig);
|
|
const debugArgs = &[_][]const u8{} ++ commonArgs ++ comptime getConfigArgs(vma_config.debugConfig);
|
|
const args = if (mode == .Debug) debugArgs else releaseArgs;
|
|
|
|
object.addCSourceFile(.{ .file = .{ .path = zig_vma_path ++ sep ++ "vk_mem_alloc.cpp" }, .flags = args });
|
|
object.linkLibC();
|
|
if (target.result.abi != .msvc) {
|
|
// MSVC can't link libc++, it causes duplicate symbol errors.
|
|
// But it's needed for other targets.
|
|
object.linkLibCpp();
|
|
}
|
|
}
|