authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-23 17:59:30-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-23 17:59:30-04:00
log7fd164f196e5867594498d3600e5da1273ad5b6f
tree77f63acdfe95e72794c447f59e0d6b9b33f0774b
parent2f98676bbe1d9e2794d0809fc532c109429659d8

zig build: add linkFramework API


1 files changed, 61 insertions(+), 25 deletions(-)

std/build.zig+61-25
......@@ -663,13 +663,23 @@ const Target = enum {
663663 }
664664
665665 pub fn exeFileExt(self: &const Target) -> []const u8 {
666 const target_os = switch (*self) {
666 return switch (self.getOs()) {
667 builtin.Os.windows => ".exe",
668 else => "",
669 };
670 }
671
672 pub fn getOs(self: &const Target) -> builtin.Os {
673 return switch (*self) {
667674 Target.Native => builtin.os,
668675 Target.Cross => |t| t.os,
669676 };
670 return switch (target_os) {
671 builtin.Os.windows => ".exe",
672 else => "",
677 }
678
679 pub fn isDarwin(self: &const Target) -> bool {
680 return switch (self.getOs()) {
681 builtin.Os.darwin, builtin.Os.ios, builtin.Os.macosx => true,
682 else => false,
673683 };
674684 }
675685};
......@@ -697,6 +707,7 @@ pub const LibExeObjStep = struct {
697707 cflags: ArrayList([]const u8),
698708 include_dirs: ArrayList([]const u8),
699709 disable_libc: bool,
710 frameworks: BufSet,
700711
701712 // zig only stuff
702713 root_src: ?[]const u8,
......@@ -787,6 +798,7 @@ pub const LibExeObjStep = struct {
787798 .target = Target.Native,
788799 .linker_script = null,
789800 .link_libs = BufSet.init(builder.allocator),
801 .frameworks = BufSet.init(builder.allocator),
790802 .step = Step.init(name, builder.allocator, make),
791803 .output_path = null,
792804 .output_h_path = null,
......@@ -824,6 +836,7 @@ pub const LibExeObjStep = struct {
824836 .object_files = ArrayList([]const u8).init(builder.allocator),
825837 .step = Step.init(name, builder.allocator, make),
826838 .link_libs = BufSet.init(builder.allocator),
839 .frameworks = BufSet.init(builder.allocator),
827840 .full_path_libs = ArrayList([]const u8).init(builder.allocator),
828841 .include_dirs = ArrayList([]const u8).init(builder.allocator),
829842 .output_path = null,
......@@ -861,11 +874,7 @@ pub const LibExeObjStep = struct {
861874 if (self.static) {
862875 self.out_filename = self.builder.fmt("lib{}.a", self.name);
863876 } else {
864 const target_os = switch (self.target) {
865 Target.Native => builtin.os,
866 Target.Cross => |t| t.os,
867 };
868 switch (target_os) {
877 switch (self.target.getOs()) {
869878 builtin.Os.darwin, builtin.Os.ios, builtin.Os.macosx => {
870879 self.out_filename = self.builder.fmt("lib{}.{d}.{d}.{d}.dylib",
871880 self.name, self.version.major, self.version.minor, self.version.patch);
......@@ -905,6 +914,11 @@ pub const LibExeObjStep = struct {
905914 self.linker_script = path;
906915 }
907916
917 pub fn linkFramework(self: &LibExeObjStep, framework_name: []const u8) {
918 assert(self.target.isDarwin());
919 %%self.frameworks.put(framework_name);
920 }
921
908922 pub fn linkLibrary(self: &LibExeObjStep, lib: &LibExeObjStep) {
909923 assert(self.kind != Kind.Obj);
910924 assert(lib.kind == Kind.Lib);
......@@ -916,6 +930,14 @@ pub const LibExeObjStep = struct {
916930 // TODO should be some kind of isolated directory that only has this header in it
917931 %%self.include_dirs.append(self.builder.cache_root);
918932 self.need_flat_namespace_hack = true;
933
934 // inherit the object's frameworks
935 if (self.target.isDarwin() and lib.static) {
936 var it = lib.frameworks.iterator();
937 while (it.next()) |entry| {
938 %%self.frameworks.put(entry.key);
939 }
940 }
919941 }
920942
921943 pub fn linkSystemLibrary(self: &LibExeObjStep, name: []const u8) {
......@@ -1163,6 +1185,14 @@ pub const LibExeObjStep = struct {
11631185 %%zig_args.append(builder.pathFromRoot(full_path_lib));
11641186 }
11651187
1188 if (self.target.isDarwin()) {
1189 var it = self.frameworks.iterator();
1190 while (it.next()) |entry| {
1191 %%zig_args.append("-framework");
1192 %%zig_args.append(entry.key);
1193 }
1194 }
1195
11661196 %return builder.spawnChild(builder.zig_exe, zig_args.toSliceConst());
11671197
11681198 if (self.kind == Kind.Lib and !self.static) {
......@@ -1225,14 +1255,7 @@ pub const LibExeObjStep = struct {
12251255 var cc_args = ArrayList([]const u8).init(builder.allocator);
12261256 defer cc_args.deinit();
12271257
1228 const target_os = switch (self.target) {
1229 Target.Native => builtin.os,
1230 Target.Cross => |t| t.os,
1231 };
1232 const is_darwin = switch (target_os) {
1233 builtin.Os.darwin, builtin.Os.ios, builtin.Os.macosx => true,
1234 else => false,
1235 };
1258 const is_darwin = self.target.isDarwin();
12361259
12371260 switch (self.kind) {
12381261 Kind.Obj => {
......@@ -1339,6 +1362,14 @@ pub const LibExeObjStep = struct {
13391362 %%cc_args.append(builder.pathFromRoot(full_path_lib));
13401363 }
13411364
1365 if (is_darwin and !self.static) {
1366 var it = self.frameworks.iterator();
1367 while (it.next()) |entry| {
1368 %%cc_args.append("-framework");
1369 %%cc_args.append(entry.key);
1370 }
1371 }
1372
13421373 %return builder.spawnChild(cc, cc_args.toSliceConst());
13431374
13441375 %return doAtomicSymLinks(builder.allocator, output_path, self.major_only_filename,
......@@ -1391,20 +1422,25 @@ pub const LibExeObjStep = struct {
13911422
13921423 %%cc_args.append("-rdynamic");
13931424
1394 switch (target_os) {
1395 builtin.Os.darwin, builtin.Os.ios, builtin.Os.macosx => {
1396 if (self.need_flat_namespace_hack) {
1397 %%cc_args.append("-Wl,-flat_namespace");
1398 }
1399 %%cc_args.append("-Wl,-search_paths_first");
1400 },
1401 else => {}
1425 if (is_darwin) {
1426 if (self.need_flat_namespace_hack) {
1427 %%cc_args.append("-Wl,-flat_namespace");
1428 }
1429 %%cc_args.append("-Wl,-search_paths_first");
14021430 }
14031431
14041432 for (self.full_path_libs.toSliceConst()) |full_path_lib| {
14051433 %%cc_args.append(builder.pathFromRoot(full_path_lib));
14061434 }
14071435
1436 if (is_darwin) {
1437 var it = self.frameworks.iterator();
1438 while (it.next()) |entry| {
1439 %%cc_args.append("-framework");
1440 %%cc_args.append(entry.key);
1441 }
1442 }
1443
14081444 %return builder.spawnChild(cc, cc_args.toSliceConst());
14091445 },
14101446 }