So, a while back I wanted to see how easy it was to directly integrate Lua into Zig, but not just as a shared and/or static library, but my own modified version of Lua. This would work well with any kind of C without having to constantly modify build.zig every time you added a new C source file. This is for Zig 16, earlier versions are a little bit different, as is the ever changing ways.
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const exe = b.addExecutable(.{
.name = "c_project",
.root_module = b.createModule(.{
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
.imports = &.{},
.link_libc = true,
}),
});
exe.use_llvm = true;
exe.use_lld = true;
// sqlite3
// const sqlite3_flags = &[_][]const u8{};
exe.root_module.addIncludePath(b.path("src/sqlite3"));
exe.root_module.addCSourceFile(.{
.file = b.path("src/sqlite3/sqlite3.c"),
//.flags = sqlite3_flags,
});
// lua
const lua_sources = [_][]const u8{
"src/lualib/lapi.c",
"src/lualib/lauxlib.c",
"src/lualib/lbaselib.c",
"src/lualib/lcode.c",
"src/lualib/lcorolib.c",
"src/lualib/lctype.c",
"src/lualib/ldblib.c",
"src/lualib/ldebug.c",
"src/lualib/ldo.c",
"src/lualib/ldump.c",
"src/lualib/lfunc.c",
"src/lualib/lgc.c",
"src/lualib/linit.c",
"src/lualib/liolib.c",
"src/lualib/llex.c",
"src/lualib/lmathlib.c",
"src/lualib/lmem.c",
"src/lualib/loadlib.c",
"src/lualib/lobject.c",
"src/lualib/lopcodes.c",
"src/lualib/loslib.c",
"src/lualib/lparser.c",
"src/lualib/lstate.c",
"src/lualib/lstring.c",
"src/lualib/lstrlib.c",
"src/lualib/ltable.c",
"src/lualib/ltablib.c",
"src/lualib/ltm.c",
"src/lualib/lundump.c",
"src/lualib/lutf8lib.c",
"src/lualib/lvm.c",
"src/lualib/lzio.c",
};
exe.root_module.addIncludePath(b.path("src/lualib"));
const lua_flags = &[_][]const u8{
"-std=c99",
"-Wall",
"-Wextra",
switch (target.result.os.tag) {
.linux => "-DLUA_USE_LINUX",
.macos => "-DLUA_USE_MACOSX",
.windows => "-DLUA_USE_POSIX",
else => "-DLUA_USE_POSIX",
},
};
for (lua_sources) |c_file| {
exe.root_module.addCSourceFile(.{
.file = b.path(c_file),
.flags = lua_flags,
});
}
b.installArtifact(exe);
const run_step = b.step("run", "Run the app");
const run_cmd = b.addRunArtifact(exe);
run_step.dependOn(&run_cmd.step);
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const exe_tests = b.addTest(.{
.root_module = exe.root_module,
});
const run_exe_tests = b.addRunArtifact(exe_tests);
const test_step = b.step("test", "Run tests");
test_step.dependOn(&run_exe_tests.step);
}