1
1
// Compatible with Zig Version 0.11.0
2
2
const std = @import ("std" );
3
+ const ArrayList = std .ArrayList ;
3
4
const Compile = std .Build .Step .Compile ;
4
5
const ConfigHeader = std .Build .Step .ConfigHeader ;
5
6
const Mode = std .builtin .Mode ;
@@ -10,11 +11,31 @@ const Maker = struct {
10
11
target : CrossTarget ,
11
12
optimize : Mode ,
12
13
config_header : * ConfigHeader ,
14
+ enable_lto : bool ,
13
15
14
- const cflags = .{"-std=c11" };
15
- const cxxflags = .{"-std=c++11" };
16
+ include_dirs : ArrayList ([]const u8 ),
17
+ cflags : ArrayList ([]const u8 ),
18
+ cxxflags : ArrayList ([]const u8 ),
19
+ objs : ArrayList (* Compile ),
16
20
17
- fn init (builder : * std.build.Builder ) Maker {
21
+ fn addInclude (m : * Maker , dir : []const u8 ) ! void {
22
+ try m .include_dirs .append (dir );
23
+ }
24
+ fn addProjectInclude (m : * Maker , path : []const []const u8 ) ! void {
25
+ try m .addInclude (try m .builder .build_root .join (m .builder .allocator , path ));
26
+ }
27
+ fn addCFlag (m : * Maker , flag : []const u8 ) ! void {
28
+ try m .cflags .append (flag );
29
+ }
30
+ fn addCxxFlag (m : * Maker , flag : []const u8 ) ! void {
31
+ try m .cxxflags .append (flag );
32
+ }
33
+ fn addFlag (m : * Maker , flag : []const u8 ) ! void {
34
+ try m .addCFlag (flag );
35
+ try m .addCxxFlag (flag );
36
+ }
37
+
38
+ fn init (builder : * std.build.Builder ) ! Maker {
18
39
const commit_hash = @embedFile (".git/refs/heads/master" );
19
40
const config_header = builder .addConfigHeader (
20
41
.{ .style = .blank , .include_path = "build-info.h" },
@@ -23,58 +44,71 @@ const Maker = struct {
23
44
.BUILD_COMMIT = commit_hash [0 .. commit_hash .len - 1 ], // omit newline
24
45
},
25
46
);
26
- return Maker {
47
+ var m = Maker {
27
48
.builder = builder ,
28
49
.target = builder .standardTargetOptions (.{}),
29
50
.optimize = builder .standardOptimizeOption (.{}),
30
51
.config_header = config_header ,
52
+ .enable_lto = false ,
53
+ .include_dirs = ArrayList ([]const u8 ).init (builder .allocator ),
54
+ .cflags = ArrayList ([]const u8 ).init (builder .allocator ),
55
+ .cxxflags = ArrayList ([]const u8 ).init (builder .allocator ),
56
+ .objs = ArrayList (* Compile ).init (builder .allocator ),
31
57
};
58
+ try m .addCFlag ("-std=c11" );
59
+ try m .addCxxFlag ("-std=c++11" );
60
+ try m .addProjectInclude (&.{});
61
+ try m .addProjectInclude (&.{"examples" });
62
+ return m ;
32
63
}
33
64
34
65
fn obj (m : * const Maker , name : []const u8 , src : []const u8 ) * Compile {
35
66
const o = m .builder .addObject (.{ .name = name , .target = m .target , .optimize = m .optimize });
36
67
if (std .mem .endsWith (u8 , src , ".c" )) {
37
- o .addCSourceFiles (&.{src }, & cflags );
68
+ o .addCSourceFiles (&.{src }, m . cflags . items );
38
69
o .linkLibC ();
39
70
} else {
40
- o .addCSourceFiles (&.{src }, & cxxflags );
71
+ o .addCSourceFiles (&.{src }, m . cxxflags . items );
41
72
o .linkLibCpp ();
42
73
}
43
- o .addIncludePath (.{ .path = "." });
44
- o .addIncludePath (.{ . path = "./examples" }) ;
74
+ for ( m . include_dirs . items ) | i | o .addIncludePath (.{ .path = i });
75
+ o .want_lto = m . enable_lto ;
45
76
return o ;
46
77
}
47
78
48
79
fn exe (m : * const Maker , name : []const u8 , src : []const u8 , deps : []const * Compile ) * Compile {
49
80
const e = m .builder .addExecutable (.{ .name = name , .target = m .target , .optimize = m .optimize });
50
- e .addIncludePath (.{ .path = "." });
51
- e .addIncludePath (.{ .path = "./examples" });
52
- e .addCSourceFiles (&.{src }, & cxxflags );
81
+ e .addCSourceFiles (&.{src }, m .cxxflags .items );
53
82
for (deps ) | d | e .addObject (d );
83
+ for (m .objs .items ) | o | e .addObject (o );
84
+ for (m .include_dirs .items ) | i | e .addIncludePath (.{ .path = i });
54
85
e .linkLibC ();
55
86
e .linkLibCpp ();
56
87
e .addConfigHeader (m .config_header );
57
88
m .builder .installArtifact (e );
58
-
59
- // Currently a bug is preventing correct linking for optimized builds for Windows:
60
- // https://github.com/ziglang/zig/issues/15958
61
- if (e .target .isWindows ()) {
62
- e .want_lto = false ;
63
- }
89
+ e .want_lto = m .enable_lto ;
64
90
return e ;
65
91
}
66
92
};
67
93
68
- pub fn build (b : * std.build.Builder ) void {
69
- const make = Maker .init (b );
94
+ pub fn build (b : * std.build.Builder ) ! void {
95
+ var make = try Maker .init (b );
96
+ make .enable_lto = b .option (bool , "lto" , "Enable LTO optimization, (default: false)" ) orelse false ;
97
+
98
+ if (b .option (bool , "k-quants" , "Enable K-quants, (default: true)" ) orelse true ) {
99
+ try make .addFlag ("-DGGML_USE_K_QUANTS" );
100
+ const k_quants = make .obj ("k_quants" , "k_quants.c" );
101
+ try make .objs .append (k_quants );
102
+ }
70
103
71
104
const ggml = make .obj ("ggml" , "ggml.c" );
72
105
const ggml_alloc = make .obj ("ggml-alloc" , "ggml-alloc.c" );
73
106
const llama = make .obj ("llama" , "llama.cpp" );
74
107
const common = make .obj ("common" , "examples/common.cpp" );
108
+ const console = make .obj ("common" , "examples/console.cpp" );
75
109
const grammar_parser = make .obj ("grammar-parser" , "examples/grammar-parser.cpp" );
76
110
77
- _ = make .exe ("main" , "examples/main/main.cpp" , &.{ ggml , ggml_alloc , llama , common , grammar_parser });
111
+ _ = make .exe ("main" , "examples/main/main.cpp" , &.{ ggml , ggml_alloc , llama , common , console , grammar_parser });
78
112
_ = make .exe ("quantize" , "examples/quantize/quantize.cpp" , &.{ ggml , ggml_alloc , llama });
79
113
_ = make .exe ("perplexity" , "examples/perplexity/perplexity.cpp" , &.{ ggml , ggml_alloc , llama , common });
80
114
_ = make .exe ("embedding" , "examples/embedding/embedding.cpp" , &.{ ggml , ggml_alloc , llama , common });
0 commit comments