ziglua/build.zig
2024-01-11 20:04:39 -07:00

375 lines
9.9 KiB
Zig

const std = @import("std");
const Build = std.Build;
const Step = std.Build.Step;
pub const Language = enum {
lua51,
lua52,
lua53,
lua54,
luau,
};
pub fn build(b: *Build) void {
// Remove the default install and uninstall steps
b.top_level_steps = .{};
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const lang = b.option(Language, "lang", "Lua language version to build") orelse .lua54;
const shared = b.option(bool, "shared", "Build shared library instead of static") orelse false;
const upstream = b.dependency(@tagName(lang), .{});
// Zig module
const ziglua = b.addModule("ziglua", .{
.root_source_file = switch (lang) {
.lua51 => .{ .path = "src/lib51.zig" },
.lua52 => .{ .path = "src/lib52.zig" },
.lua53 => .{ .path = "src/lib53.zig" },
.lua54 => .{ .path = "src/lib54.zig" },
.luau => .{ .path = "src/libluau.zig" },
},
});
// Expose build configuration to the ziglua module
const config = b.addOptions();
config.addOption(Language, "lang", lang);
ziglua.addOptions("config", config);
const lib = switch (lang) {
.luau => buildLuau(b, target, optimize, upstream, shared),
else => buildLua(b, target, optimize, upstream, lang, shared),
};
switch (lang) {
.luau => {
ziglua.addIncludePath(upstream.path("Common/include"));
ziglua.addIncludePath(upstream.path("Compiler/include"));
ziglua.addIncludePath(upstream.path("Ast/include"));
ziglua.addIncludePath(upstream.path("VM/include"));
},
else => ziglua.addIncludePath(upstream.path("src")),
}
ziglua.linkLibrary(lib);
// Tests
const tests = b.addTest(.{
.root_source_file = .{ .path = "src/tests.zig" },
.target = target,
.optimize = optimize,
});
tests.root_module.addImport("ziglua", ziglua);
const run_tests = b.addRunArtifact(tests);
const test_step = b.step("test", "Run ziglua tests");
test_step.dependOn(&run_tests.step);
// Examples
const examples = [_]struct { []const u8, []const u8 }{
.{ "interpreter", "examples/interpreter.zig" },
.{ "zig-function", "examples/zig-fn.zig" },
};
for (examples) |example| {
const exe = b.addExecutable(.{
.name = example[0],
.root_source_file = .{ .path = example[1] },
.target = target,
.optimize = optimize,
});
exe.root_module.addImport("ziglua", ziglua);
const artifact = b.addInstallArtifact(exe, .{});
const exe_step = b.step(b.fmt("install-example-{s}", .{example[0]}), b.fmt("Install {s} example", .{example[0]}));
exe_step.dependOn(&artifact.step);
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(b.fmt("run-example-{s}", .{example[0]}), b.fmt("Run {s} example", .{example[0]}));
run_step.dependOn(&run_cmd.step);
}
}
fn buildLua(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, upstream: *Build.Dependency, lang: Language, shared: bool) *Step.Compile {
const lib_opts = .{
.name = "lua",
.target = target,
.optimize = optimize,
.version = switch (lang) {
.lua51 => std.SemanticVersion{ .major = 5, .minor = 1, .patch = 5 },
.lua52 => std.SemanticVersion{ .major = 5, .minor = 2, .patch = 4 },
.lua53 => std.SemanticVersion{ .major = 5, .minor = 3, .patch = 6 },
.lua54 => std.SemanticVersion{ .major = 5, .minor = 4, .patch = 6 },
else => unreachable,
},
};
const lib = if (shared)
b.addSharedLibrary(lib_opts)
else
b.addStaticLibrary(lib_opts);
lib.addIncludePath(upstream.path("src"));
const flags = [_][]const u8{
// Standard version used in Lua Makefile
"-std=gnu99",
// Define target-specific macro
switch (target.result.os.tag) {
.linux => "-DLUA_USE_LINUX",
.macos => "-DLUA_USE_MACOSX",
.windows => "-DLUA_USE_WINDOWS",
else => "-DLUA_USE_POSIX",
},
// Enable api check
if (optimize == .Debug) "-DLUA_USE_APICHECK" else "",
};
const lua_source_files = switch (lang) {
.lua51 => &lua_51_source_files,
.lua52 => &lua_52_source_files,
.lua53 => &lua_53_source_files,
.lua54 => &lua_54_source_files,
else => unreachable,
};
for (lua_source_files) |file| {
lib.addCSourceFile(.{ .file = upstream.path(file), .flags = &flags });
}
lib.linkLibC();
return lib;
}
/// Luau has diverged enough from Lua (C++, project structure, ...) that it is easier to separate the build logic
fn buildLuau(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, upstream: *Build.Dependency, shared: bool) *Step.Compile {
const lib_opts = .{
.name = "luau",
.target = target,
.optimize = optimize,
.version = std.SemanticVersion{ .major = 0, .minor = 607, .patch = 0 },
};
const lib = if (shared)
b.addSharedLibrary(lib_opts)
else
b.addStaticLibrary(lib_opts);
lib.addIncludePath(upstream.path("Common/include"));
lib.addIncludePath(upstream.path("Compiler/include"));
lib.addIncludePath(upstream.path("Ast/include"));
lib.addIncludePath(upstream.path("VM/include"));
const flags = [_][]const u8{
"-DLUA_USE_LONGJMP=1",
"-DLUA_API=extern\"C\"",
"-DLUACODE_API=extern\"C\"",
"-DLUACODEGEN_API=extern\"C\"",
};
for (luau_source_files) |file| {
lib.addCSourceFile(.{ .file = upstream.path(file), .flags = &flags });
}
lib.addCSourceFile(.{ .file = .{ .path = "src/luau.cpp" }, .flags = &flags });
lib.linkLibCpp();
return lib;
}
const lua_51_source_files = [_][]const u8{
"src/lapi.c",
"src/lcode.c",
"src/ldebug.c",
"src/ldo.c",
"src/ldump.c",
"src/lfunc.c",
"src/lgc.c",
"src/llex.c",
"src/lmem.c",
"src/lobject.c",
"src/lopcodes.c",
"src/lparser.c",
"src/lstate.c",
"src/lstring.c",
"src/ltable.c",
"src/ltm.c",
"src/lundump.c",
"src/lvm.c",
"src/lzio.c",
"src/lauxlib.c",
"src/lbaselib.c",
"src/ldblib.c",
"src/liolib.c",
"src/lmathlib.c",
"src/loslib.c",
"src/ltablib.c",
"src/lstrlib.c",
"src/loadlib.c",
"src/linit.c",
};
const lua_52_source_files = [_][]const u8{
"src/lapi.c",
"src/lcode.c",
"src/lctype.c",
"src/ldebug.c",
"src/ldo.c",
"src/ldump.c",
"src/lfunc.c",
"src/lgc.c",
"src/llex.c",
"src/lmem.c",
"src/lobject.c",
"src/lopcodes.c",
"src/lparser.c",
"src/lstate.c",
"src/lstring.c",
"src/ltable.c",
"src/ltm.c",
"src/lundump.c",
"src/lvm.c",
"src/lzio.c",
"src/lauxlib.c",
"src/lbaselib.c",
"src/lbitlib.c",
"src/lcorolib.c",
"src/ldblib.c",
"src/liolib.c",
"src/lmathlib.c",
"src/loslib.c",
"src/lstrlib.c",
"src/ltablib.c",
"src/loadlib.c",
"src/linit.c",
};
const lua_53_source_files = [_][]const u8{
"src/lapi.c",
"src/lcode.c",
"src/lctype.c",
"src/ldebug.c",
"src/ldo.c",
"src/ldump.c",
"src/lfunc.c",
"src/lgc.c",
"src/llex.c",
"src/lmem.c",
"src/lobject.c",
"src/lopcodes.c",
"src/lparser.c",
"src/lstate.c",
"src/lstring.c",
"src/ltable.c",
"src/ltm.c",
"src/lundump.c",
"src/lvm.c",
"src/lzio.c",
"src/lauxlib.c",
"src/lbaselib.c",
"src/lbitlib.c",
"src/lcorolib.c",
"src/ldblib.c",
"src/liolib.c",
"src/lmathlib.c",
"src/loslib.c",
"src/lstrlib.c",
"src/ltablib.c",
"src/lutf8lib.c",
"src/loadlib.c",
"src/linit.c",
};
const lua_54_source_files = [_][]const u8{
"src/lapi.c",
"src/lcode.c",
"src/lctype.c",
"src/ldebug.c",
"src/ldo.c",
"src/ldump.c",
"src/lfunc.c",
"src/lgc.c",
"src/llex.c",
"src/lmem.c",
"src/lobject.c",
"src/lopcodes.c",
"src/lparser.c",
"src/lstate.c",
"src/lstring.c",
"src/ltable.c",
"src/ltm.c",
"src/lundump.c",
"src/lvm.c",
"src/lzio.c",
"src/lauxlib.c",
"src/lbaselib.c",
"src/lcorolib.c",
"src/ldblib.c",
"src/liolib.c",
"src/lmathlib.c",
"src/loadlib.c",
"src/loslib.c",
"src/lstrlib.c",
"src/ltablib.c",
"src/lutf8lib.c",
"src/linit.c",
};
const luau_source_files = [_][]const u8{
"Compiler/src/BuiltinFolding.cpp",
"Compiler/src/Builtins.cpp",
"Compiler/src/BytecodeBuilder.cpp",
"Compiler/src/Compiler.cpp",
"Compiler/src/ConstantFolding.cpp",
"Compiler/src/CostModel.cpp",
"Compiler/src/TableShape.cpp",
"Compiler/src/Types.cpp",
"Compiler/src/ValueTracking.cpp",
"Compiler/src/lcode.cpp",
"VM/src/lapi.cpp",
"VM/src/laux.cpp",
"VM/src/lbaselib.cpp",
"VM/src/lbitlib.cpp",
"VM/src/lbuffer.cpp",
"VM/src/lbuflib.cpp",
"VM/src/lbuiltins.cpp",
"VM/src/lcorolib.cpp",
"VM/src/ldblib.cpp",
"VM/src/ldebug.cpp",
"VM/src/ldo.cpp",
"VM/src/lfunc.cpp",
"VM/src/lgc.cpp",
"VM/src/lgcdebug.cpp",
"VM/src/linit.cpp",
"VM/src/lmathlib.cpp",
"VM/src/lmem.cpp",
"VM/src/lnumprint.cpp",
"VM/src/lobject.cpp",
"VM/src/loslib.cpp",
"VM/src/lperf.cpp",
"VM/src/lstate.cpp",
"VM/src/lstring.cpp",
"VM/src/lstrlib.cpp",
"VM/src/ltable.cpp",
"VM/src/ltablib.cpp",
"VM/src/ltm.cpp",
"VM/src/ludata.cpp",
"VM/src/lutf8lib.cpp",
"VM/src/lvmexecute.cpp",
"VM/src/lvmload.cpp",
"VM/src/lvmutils.cpp",
"Ast/src/Ast.cpp",
"Ast/src/Confusables.cpp",
"Ast/src/Lexer.cpp",
"Ast/src/Location.cpp",
"Ast/src/Parser.cpp",
"Ast/src/StringUtils.cpp",
"Ast/src/TimeTrace.cpp",
};