[Zig] Rewrite build for Zig 0.11 (#2514)

* zig build fixes

* Disable LTO on Windows.
This commit is contained in:
Henri Vasserman 2023-08-07 08:35:53 +03:00 committed by GitHub
parent 86c3219895
commit 7297128db8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

125
build.zig
View file

@ -1,68 +1,87 @@
// Compatible with Zig Version 0.11.0
const std = @import("std"); const std = @import("std");
const commit_hash = @embedFile(".git/refs/heads/master"); const Compile = std.Build.Step.Compile;
const ConfigHeader = std.Build.Step.ConfigHeader;
const Mode = std.builtin.Mode;
const CrossTarget = std.zig.CrossTarget;
// Zig Version: 0.11.0-dev.3986+e05c242cd const Maker = struct {
pub fn build(b: *std.build.Builder) void { builder: *std.build.Builder,
const target = b.standardTargetOptions(.{}); target: CrossTarget,
const optimize = b.standardOptimizeOption(.{}); optimize: Mode,
config_header: *ConfigHeader,
const config_header = b.addConfigHeader( const cflags = .{"-std=c11"};
const cxxflags = .{"-std=c++11"};
fn init(builder: *std.build.Builder) Maker {
const commit_hash = @embedFile(".git/refs/heads/master");
const config_header = builder.addConfigHeader(
.{ .style = .blank, .include_path = "build-info.h" }, .{ .style = .blank, .include_path = "build-info.h" },
.{ .{
.BUILD_NUMBER = 0, .BUILD_NUMBER = 0,
.BUILD_COMMIT = commit_hash[0 .. commit_hash.len - 1], // omit newline .BUILD_COMMIT = commit_hash[0 .. commit_hash.len - 1], // omit newline
}, },
); );
return Maker{
const lib = b.addStaticLibrary(.{ .builder = builder,
.name = "llama", .target = builder.standardTargetOptions(.{}),
.target = target, .optimize = builder.standardOptimizeOption(.{}),
.optimize = optimize, .config_header = config_header,
});
lib.linkLibC();
lib.linkLibCpp();
lib.addIncludePath(".");
lib.addIncludePath("./examples");
lib.addConfigHeader(config_header);
lib.addCSourceFiles(&.{"ggml.c"}, &.{"-std=c11"});
lib.addCSourceFiles(&.{"llama.cpp"}, &.{"-std=c++11"});
b.installArtifact(lib);
const examples = .{
"main",
"baby-llama",
"embedding",
"metal",
"perplexity",
"quantize",
"quantize-stats",
"save-load-state",
"server",
"simple",
"train-text-from-scratch",
}; };
}
inline for (examples) |example_name| { fn obj(m: *const Maker, name: []const u8, src: []const u8) *Compile {
const exe = b.addExecutable(.{ const o = m.builder.addObject(.{ .name = name, .target = m.target, .optimize = m.optimize });
.name = example_name, if (std.mem.endsWith(u8, src, ".c")) {
.target = target, o.addCSourceFiles(&.{src}, &cflags);
.optimize = optimize, o.linkLibC();
}); } else {
exe.addIncludePath("."); o.addCSourceFiles(&.{src}, &cxxflags);
exe.addIncludePath("./examples"); o.linkLibCpp();
exe.addConfigHeader(config_header); }
exe.addCSourceFiles(&.{ o.addIncludePath(.{ .path = "." });
std.fmt.comptimePrint("examples/{s}/{s}.cpp", .{ example_name, example_name }), o.addIncludePath(.{ .path = "./examples" });
"examples/common.cpp", return o;
}, &.{"-std=c++11"}); }
exe.linkLibrary(lib);
b.installArtifact(exe);
const run_cmd = b.addRunArtifact(exe); fn exe(m: *const Maker, name: []const u8, src: []const u8, deps: []const *Compile) *Compile {
run_cmd.step.dependOn(b.getInstallStep()); const e = m.builder.addExecutable(.{ .name = name, .target = m.target, .optimize = m.optimize });
if (b.args) |args| run_cmd.addArgs(args); e.addIncludePath(.{ .path = "." });
e.addIncludePath(.{ .path = "./examples" });
e.addCSourceFiles(&.{src}, &cxxflags);
for (deps) |d| e.addObject(d);
e.linkLibC();
e.linkLibCpp();
e.addConfigHeader(m.config_header);
m.builder.installArtifact(e);
const run_step = b.step("run-" ++ example_name, "Run the app"); // Currently a bug is preventing correct linking for optimized builds for Windows:
run_step.dependOn(&run_cmd.step); // https://github.com/ziglang/zig/issues/15958
if (e.target.isWindows()) {
e.want_lto = false;
}
return e;
}
};
pub fn build(b: *std.build.Builder) void {
const make = Maker.init(b);
const ggml = make.obj("ggml", "ggml.c");
const ggml_alloc = make.obj("ggml-alloc", "ggml-alloc.c");
const llama = make.obj("llama", "llama.cpp");
const common = make.obj("common", "examples/common.cpp");
const grammar_parser = make.obj("grammar-parser", "examples/grammar-parser.cpp");
_ = make.exe("main", "examples/main/main.cpp", &.{ ggml, ggml_alloc, llama, common, grammar_parser });
_ = make.exe("quantize", "examples/quantize/quantize.cpp", &.{ ggml, ggml_alloc, llama });
_ = make.exe("perplexity", "examples/perplexity/perplexity.cpp", &.{ ggml, ggml_alloc, llama, common });
_ = make.exe("embedding", "examples/embedding/embedding.cpp", &.{ ggml, ggml_alloc, llama, common });
_ = make.exe("train-text-from-scratch", "examples/train-text-from-scratch/train-text-from-scratch.cpp", &.{ ggml, ggml_alloc, llama });
const server = make.exe("server", "examples/server/server.cpp", &.{ ggml, ggml_alloc, llama, common, grammar_parser });
if (server.target.isWindows()) {
server.linkSystemLibrary("ws2_32");
} }
} }