375 lines
9.9 KiB
Zig
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",
|
|
};
|