authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-06-28 09:14:35+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-06-28 09:22:04+02:00
log075f5bc5ffdbe0a458a733d596a1fc4a74b8e1ab
tree03202c54ac0b5c5d3e12ebfc4a5a433ab4a57ca9
parent20bd722464699bd11a05fe8e250f9f8086853cf2

link-tests: test -weak-lx and -weak_framework x


13 files changed, 129 insertions(+), 40 deletions(-)

lib/std/build/CheckObjectStep.zig+2
...@@ -408,6 +408,8 @@ const MachODumper = struct {...@@ -408,6 +408,8 @@ const MachODumper = struct {
408408
409 .ID_DYLIB,409 .ID_DYLIB,
410 .LOAD_DYLIB,410 .LOAD_DYLIB,
411 .LOAD_WEAK_DYLIB,
412 .REEXPORT_DYLIB,
411 => {413 => {
412 const dylib = lc.dylib.inner.dylib;414 const dylib = lc.dylib.inner.dylib;
413 try writer.writeByte('\n');415 try writer.writeByte('\n');
test/link.zig+10-1
...@@ -45,7 +45,11 @@ pub fn addCases(cases: *tests.StandaloneContext) void {...@@ -45,7 +45,11 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
45 .requires_macos_sdk = true,45 .requires_macos_sdk = true,
46 });46 });
4747
48 cases.addBuildFile("test/link/macho/needed_l/build.zig", .{48 cases.addBuildFile("test/link/macho/needed_library/build.zig", .{
49 .build_modes = true,
50 });
51
52 cases.addBuildFile("test/link/macho/weak_library/build.zig", .{
49 .build_modes = true,53 .build_modes = true,
50 });54 });
5155
...@@ -54,6 +58,11 @@ pub fn addCases(cases: *tests.StandaloneContext) void {...@@ -54,6 +58,11 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
54 .requires_macos_sdk = true,58 .requires_macos_sdk = true,
55 });59 });
5660
61 cases.addBuildFile("test/link/macho/weak_framework/build.zig", .{
62 .build_modes = true,
63 .requires_macos_sdk = true,
64 });
65
57 // Try to build and run an Objective-C executable.66 // Try to build and run an Objective-C executable.
58 cases.addBuildFile("test/link/macho/objc/build.zig", .{67 cases.addBuildFile("test/link/macho/objc/build.zig", .{
59 .build_modes = true,68 .build_modes = true,
test/link/macho/needed_l/a.c deleted-1
...@@ -1 +0,0 @@
1int a = 42;
test/link/macho/needed_l/build.zig deleted-35
...@@ -1,35 +0,0 @@
1const std = @import("std");
2const Builder = std.build.Builder;
3const LibExeObjectStep = std.build.LibExeObjStep;
4
5pub fn build(b: *Builder) void {
6 const mode = b.standardReleaseOptions();
7
8 const test_step = b.step("test", "Test the program");
9 test_step.dependOn(b.getInstallStep());
10
11 const dylib = b.addSharedLibrary("a", null, b.version(1, 0, 0));
12 dylib.setBuildMode(mode);
13 dylib.addCSourceFile("a.c", &.{});
14 dylib.linkLibC();
15 dylib.install();
16
17 // -dead_strip_dylibs
18 // -needed-la
19 const exe = b.addExecutable("test", null);
20 exe.addCSourceFile("main.c", &[0][]const u8{});
21 exe.setBuildMode(mode);
22 exe.linkLibC();
23 exe.linkSystemLibraryNeeded("a");
24 exe.addLibraryPath(b.pathFromRoot("zig-out/lib"));
25 exe.addRPath(b.pathFromRoot("zig-out/lib"));
26 exe.dead_strip_dylibs = true;
27
28 const check = exe.checkObject(.macho);
29 check.checkStart("cmd LOAD_DYLIB");
30 check.checkNext("name @rpath/liba.dylib");
31 test_step.dependOn(&check.step);
32
33 const run_cmd = exe.run();
34 test_step.dependOn(&run_cmd.step);
35}
test/link/macho/needed_l/main.c deleted-3
...@@ -1,3 +0,0 @@
1int main(int argc, char* argv[]) {
2 return 0;
3}
test/link/macho/needed_library/a.c created+1
...@@ -0,0 +1 @@
1int a = 42;
test/link/macho/needed_library/build.zig created+35
...@@ -0,0 +1,35 @@
1const std = @import("std");
2const Builder = std.build.Builder;
3const LibExeObjectStep = std.build.LibExeObjStep;
4
5pub fn build(b: *Builder) void {
6 const mode = b.standardReleaseOptions();
7
8 const test_step = b.step("test", "Test the program");
9 test_step.dependOn(b.getInstallStep());
10
11 const dylib = b.addSharedLibrary("a", null, b.version(1, 0, 0));
12 dylib.setBuildMode(mode);
13 dylib.addCSourceFile("a.c", &.{});
14 dylib.linkLibC();
15 dylib.install();
16
17 // -dead_strip_dylibs
18 // -needed-la
19 const exe = b.addExecutable("test", null);
20 exe.addCSourceFile("main.c", &[0][]const u8{});
21 exe.setBuildMode(mode);
22 exe.linkLibC();
23 exe.linkSystemLibraryNeeded("a");
24 exe.addLibraryPath(b.pathFromRoot("zig-out/lib"));
25 exe.addRPath(b.pathFromRoot("zig-out/lib"));
26 exe.dead_strip_dylibs = true;
27
28 const check = exe.checkObject(.macho);
29 check.checkStart("cmd LOAD_DYLIB");
30 check.checkNext("name @rpath/liba.dylib");
31 test_step.dependOn(&check.step);
32
33 const run_cmd = exe.run();
34 test_step.dependOn(&run_cmd.step);
35}
test/link/macho/needed_library/main.c created+3
...@@ -0,0 +1,3 @@
1int main(int argc, char* argv[]) {
2 return 0;
3}
test/link/macho/weak_framework/build.zig created+24
...@@ -0,0 +1,24 @@
1const std = @import("std");
2const Builder = std.build.Builder;
3const LibExeObjectStep = std.build.LibExeObjStep;
4
5pub fn build(b: *Builder) void {
6 const mode = b.standardReleaseOptions();
7
8 const test_step = b.step("test", "Test the program");
9 test_step.dependOn(b.getInstallStep());
10
11 const exe = b.addExecutable("test", null);
12 exe.addCSourceFile("main.c", &[0][]const u8{});
13 exe.setBuildMode(mode);
14 exe.linkLibC();
15 exe.linkFrameworkWeak("Cocoa");
16
17 const check = exe.checkObject(.macho);
18 check.checkStart("cmd LOAD_WEAK_DYLIB");
19 check.checkNext("name {*}Cocoa");
20 test_step.dependOn(&check.step);
21
22 const run_cmd = exe.run();
23 test_step.dependOn(&run_cmd.step);
24}
test/link/macho/weak_framework/main.c created+3
...@@ -0,0 +1,3 @@
1int main(int argc, char* argv[]) {
2 return 0;
3}
test/link/macho/weak_library/a.c created+9
...@@ -0,0 +1,9 @@
1#include <stdio.h>
2
3int a = 42;
4
5const char* asStr() {
6 static char str[3];
7 sprintf(str, "%d", 42);
8 return str;
9}
test/link/macho/weak_library/build.zig created+33
...@@ -0,0 +1,33 @@
1const std = @import("std");
2const Builder = std.build.Builder;
3const LibExeObjectStep = std.build.LibExeObjStep;
4
5pub fn build(b: *Builder) void {
6 const mode = b.standardReleaseOptions();
7
8 const test_step = b.step("test", "Test the program");
9 test_step.dependOn(b.getInstallStep());
10
11 const dylib = b.addSharedLibrary("a", null, b.version(1, 0, 0));
12 dylib.setBuildMode(mode);
13 dylib.addCSourceFile("a.c", &.{});
14 dylib.linkLibC();
15 dylib.install();
16
17 const exe = b.addExecutable("test", null);
18 exe.addCSourceFile("main.c", &[0][]const u8{});
19 exe.setBuildMode(mode);
20 exe.linkLibC();
21 exe.linkSystemLibraryWeak("a");
22 exe.addLibraryPath(b.pathFromRoot("zig-out/lib"));
23 exe.addRPath(b.pathFromRoot("zig-out/lib"));
24
25 const check = exe.checkObject(.macho);
26 check.checkStart("cmd LOAD_WEAK_DYLIB");
27 check.checkNext("name @rpath/liba.dylib");
28 test_step.dependOn(&check.step);
29
30 const run_cmd = exe.run();
31 run_cmd.expectStdOutEqual("42 42");
32 test_step.dependOn(&run_cmd.step);
33}
test/link/macho/weak_library/main.c created+9
...@@ -0,0 +1,9 @@
1#include <stdio.h>
2
3extern int a;
4extern const char* asStr();
5
6int main(int argc, char* argv[]) {
7 printf("%d %s", a, asStr());
8 return 0;
9}