diff --git a/lib/std/build/CheckMachOStep.zig b/lib/std/build/CheckMachOStep.zig index b58cfa6e46b82efda60692dd6b16ac7735434bb3..06e79081f54bdc47afca2779c538e4e7fdadc294 100644 --- a/lib/std/build/CheckMachOStep.zig +++ b/lib/std/build/CheckMachOStep.zig @@ -156,6 +156,14 @@ fn dumpLoadCommand(lc: macho.LoadCommand, index: u16, writer: anytype) !void { }); }, + .MAIN => { + try writer.writeByte('\n'); + try writer.print( + \\entryoff {x} + \\stacksize {x} + , .{ lc.main.entryoff, lc.main.stacksize }); + }, + .RPATH => { try writer.writeByte('\n'); try writer.print( diff --git a/src/link/MachO.zig b/src/link/MachO.zig index aea44d93571e7260a7f02f099f4489512e84bdc0..af84ce8846742456d9e65f488ae3c3b0bd77d213 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -934,6 +934,11 @@ pub fn flushModule(self: *MachO, comp: *Compilation, prog_node: *std.Progress.No try argv.append(try std.fmt.allocPrint(arena, "0x{x}", .{pagezero_size})); } + if (self.base.options.entry) |entry| { + try argv.append("-e"); + try argv.append(entry); + } + try argv.appendSlice(positionals.items); try argv.append("-o"); @@ -3371,13 +3376,12 @@ fn addCodeSignatureLC(self: *MachO) !void { fn setEntryPoint(self: *MachO) !void { if (self.base.options.output_mode != .Exe) return; - // TODO we should respect the -entry flag passed in by the user to set a custom - // entrypoint. For now, assume default of `_main`. const seg = self.load_commands.items[self.text_segment_cmd_index.?].segment; - const n_strx = self.strtab_dir.getKeyAdapted(@as([]const u8, "_main"), StringIndexAdapter{ + const entry_name = self.base.options.entry orelse "_main"; + const n_strx = self.strtab_dir.getKeyAdapted(entry_name, StringIndexAdapter{ .bytes = &self.strtab, }) orelse { - log.err("'_main' export not found", .{}); + log.err("entrypoint '{s}' not found", .{entry_name}); return error.MissingMainEntrypoint; }; const resolv = self.symbol_resolver.get(n_strx) orelse unreachable; diff --git a/test/link.zig b/test/link.zig index bc69003e68fd1c22ce85e8c8873129f27f23fa9e..e3dcfa1ec603b2e86827cd1573a53968a17fed83 100644 --- a/test/link.zig +++ b/test/link.zig @@ -28,29 +28,37 @@ pub fn addCases(cases: *tests.StandaloneContext) void { }); if (builtin.os.tag == .macos) { - cases.addBuildFile("test/link/pagezero/build.zig", .{ + cases.addBuildFile("test/link/entry/build.zig", .{ + .build_modes = true, + }); + + cases.addBuildFile("test/link/macho/pagezero/build.zig", .{ .build_modes = false, }); - cases.addBuildFile("test/link/dylib/build.zig", .{ + cases.addBuildFile("test/link/macho/dylib/build.zig", .{ .build_modes = true, }); - cases.addBuildFile("test/link/frameworks/build.zig", .{ + cases.addBuildFile("test/link/macho/frameworks/build.zig", .{ .build_modes = true, .requires_macos_sdk = true, }); // Try to build and run an Objective-C executable. - cases.addBuildFile("test/link/objc/build.zig", .{ + cases.addBuildFile("test/link/macho/objc/build.zig", .{ .build_modes = true, .requires_macos_sdk = true, }); // Try to build and run an Objective-C++ executable. - cases.addBuildFile("test/link/objcpp/build.zig", .{ + cases.addBuildFile("test/link/macho/objcpp/build.zig", .{ .build_modes = true, .requires_macos_sdk = true, }); + + cases.addBuildFile("test/link/macho/stack_size/build.zig", .{ + .build_modes = true, + }); } } diff --git a/test/link/dylib/a.c b/test/link/dylib/a.c deleted file mode 100644 index 199b31e1a0a213affd535ef60e80b52ce040a32a..0000000000000000000000000000000000000000 --- a/test/link/dylib/a.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -char world[] = "world"; - -char* hello() { - return "Hello"; -} diff --git a/test/link/dylib/build.zig b/test/link/dylib/build.zig deleted file mode 100644 index 4f41e204ecc64d072f1ff96bd5986e2afe40c2b8..0000000000000000000000000000000000000000 --- a/test/link/dylib/build.zig +++ /dev/null @@ -1,49 +0,0 @@ -const std = @import("std"); -const Builder = std.build.Builder; - -pub fn build(b: *Builder) void { - const mode = b.standardReleaseOptions(); - - const test_step = b.step("test", "Test"); - test_step.dependOn(b.getInstallStep()); - - const dylib = b.addSharedLibrary("a", null, b.version(1, 0, 0)); - dylib.setBuildMode(mode); - dylib.addCSourceFile("a.c", &.{}); - dylib.linkLibC(); - dylib.install(); - - const check_dylib = dylib.checkMachO(); - check_dylib.check("cmd ID_DYLIB"); - check_dylib.checkNext("path @rpath/liba.dylib"); - check_dylib.checkNext("timestamp 2"); - check_dylib.checkNext("current version 10000"); - check_dylib.checkNext("compatibility version 10000"); - - test_step.dependOn(&check_dylib.step); - - const exe = b.addExecutable("main", null); - exe.setBuildMode(mode); - exe.addCSourceFile("main.c", &.{}); - exe.linkSystemLibrary("a"); - exe.linkLibC(); - exe.addLibraryPath(b.pathFromRoot("zig-out/lib/")); - exe.addRPath(b.pathFromRoot("zig-out/lib")); - - const check_exe = exe.checkMachO(); - check_exe.check("cmd LOAD_DYLIB"); - check_exe.checkNext("path @rpath/liba.dylib"); - check_exe.checkNext("timestamp 2"); - check_exe.checkNext("current version 10000"); - check_exe.checkNext("compatibility version 10000"); - - check_exe.check("cmd RPATH"); - check_exe.checkNext(std.fmt.allocPrint(b.allocator, "path {s}", .{b.pathFromRoot("zig-out/lib")}) catch unreachable); - - test_step.dependOn(&check_exe.step); - - const run = exe.run(); - run.cwd = b.pathFromRoot("."); - run.expectStdOutEqual("Hello world"); - test_step.dependOn(&run.step); -} diff --git a/test/link/dylib/main.c b/test/link/dylib/main.c deleted file mode 100644 index be1647ddad887303b79225be54523615fcc251e4..0000000000000000000000000000000000000000 --- a/test/link/dylib/main.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -char* hello(); -extern char world[]; - -int main() { - printf("%s %s", hello(), world); - return 0; -} diff --git a/test/link/frameworks/build.zig b/test/link/frameworks/build.zig deleted file mode 100644 index 5700422a41c71a39199b37c1de15df644f44ee11..0000000000000000000000000000000000000000 --- a/test/link/frameworks/build.zig +++ /dev/null @@ -1,20 +0,0 @@ -const std = @import("std"); -const Builder = std.build.Builder; - -pub fn build(b: *Builder) void { - const mode = b.standardReleaseOptions(); - - const test_step = b.step("test", "Test the program"); - - const exe = b.addExecutable("test", null); - b.default_step.dependOn(&exe.step); - exe.addCSourceFile("main.c", &[0][]const u8{}); - exe.setBuildMode(mode); - exe.linkLibC(); - // TODO when we figure out how to ship framework stubs for cross-compilation, - // populate paths to the sysroot here. - exe.linkFramework("Cocoa"); - - const run_cmd = exe.run(); - test_step.dependOn(&run_cmd.step); -} diff --git a/test/link/frameworks/main.c b/test/link/frameworks/main.c deleted file mode 100644 index b9dab990b2ffb70ec0616bf41a05c49b32f83ec5..0000000000000000000000000000000000000000 --- a/test/link/frameworks/main.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -int main() { - assert(objc_getClass("NSObject") > 0); - assert(objc_getClass("NSApplication") > 0); -} diff --git a/test/link/macho/dylib/a.c b/test/link/macho/dylib/a.c new file mode 100644 index 0000000000000000000000000000000000000000..199b31e1a0a213affd535ef60e80b52ce040a32a --- /dev/null +++ b/test/link/macho/dylib/a.c @@ -0,0 +1,7 @@ +#include + +char world[] = "world"; + +char* hello() { + return "Hello"; +} diff --git a/test/link/macho/dylib/build.zig b/test/link/macho/dylib/build.zig new file mode 100644 index 0000000000000000000000000000000000000000..4f41e204ecc64d072f1ff96bd5986e2afe40c2b8 --- /dev/null +++ b/test/link/macho/dylib/build.zig @@ -0,0 +1,49 @@ +const std = @import("std"); +const Builder = std.build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + + const test_step = b.step("test", "Test"); + test_step.dependOn(b.getInstallStep()); + + const dylib = b.addSharedLibrary("a", null, b.version(1, 0, 0)); + dylib.setBuildMode(mode); + dylib.addCSourceFile("a.c", &.{}); + dylib.linkLibC(); + dylib.install(); + + const check_dylib = dylib.checkMachO(); + check_dylib.check("cmd ID_DYLIB"); + check_dylib.checkNext("path @rpath/liba.dylib"); + check_dylib.checkNext("timestamp 2"); + check_dylib.checkNext("current version 10000"); + check_dylib.checkNext("compatibility version 10000"); + + test_step.dependOn(&check_dylib.step); + + const exe = b.addExecutable("main", null); + exe.setBuildMode(mode); + exe.addCSourceFile("main.c", &.{}); + exe.linkSystemLibrary("a"); + exe.linkLibC(); + exe.addLibraryPath(b.pathFromRoot("zig-out/lib/")); + exe.addRPath(b.pathFromRoot("zig-out/lib")); + + const check_exe = exe.checkMachO(); + check_exe.check("cmd LOAD_DYLIB"); + check_exe.checkNext("path @rpath/liba.dylib"); + check_exe.checkNext("timestamp 2"); + check_exe.checkNext("current version 10000"); + check_exe.checkNext("compatibility version 10000"); + + check_exe.check("cmd RPATH"); + check_exe.checkNext(std.fmt.allocPrint(b.allocator, "path {s}", .{b.pathFromRoot("zig-out/lib")}) catch unreachable); + + test_step.dependOn(&check_exe.step); + + const run = exe.run(); + run.cwd = b.pathFromRoot("."); + run.expectStdOutEqual("Hello world"); + test_step.dependOn(&run.step); +} diff --git a/test/link/macho/dylib/main.c b/test/link/macho/dylib/main.c new file mode 100644 index 0000000000000000000000000000000000000000..be1647ddad887303b79225be54523615fcc251e4 --- /dev/null +++ b/test/link/macho/dylib/main.c @@ -0,0 +1,9 @@ +#include + +char* hello(); +extern char world[]; + +int main() { + printf("%s %s", hello(), world); + return 0; +} diff --git a/test/link/macho/entry/build.zig b/test/link/macho/entry/build.zig new file mode 100644 index 0000000000000000000000000000000000000000..24037ba8ebff29d2132e95e30618763ba2f782c7 --- /dev/null +++ b/test/link/macho/entry/build.zig @@ -0,0 +1,25 @@ +const std = @import("std"); +const Builder = std.build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + + const test_step = b.step("test", "Test"); + test_step.dependOn(b.getInstallStep()); + + const exe = b.addExecutable("main", null); + exe.setBuildMode(mode); + exe.addCSourceFile("main.c", &.{}); + exe.linkLibC(); + exe.entry_symbol_name = "_non_main"; + + const check_exe = exe.checkMachO(); + check_exe.check("cmd MAIN"); + check_exe.checkNext("entryoff {x}"); + + test_step.dependOn(&check_exe.step); + + const run = exe.run(); + run.expectStdOutEqual("42"); + test_step.dependOn(&run.step); +} diff --git a/test/link/macho/entry/main.c b/test/link/macho/entry/main.c new file mode 100644 index 0000000000000000000000000000000000000000..5fc58fc4659591c264eded51bd29ccf7c3e1ada3 --- /dev/null +++ b/test/link/macho/entry/main.c @@ -0,0 +1,6 @@ +#include + +int non_main() { + printf("%d", 42); + return 0; +} diff --git a/test/link/macho/frameworks/build.zig b/test/link/macho/frameworks/build.zig new file mode 100644 index 0000000000000000000000000000000000000000..5700422a41c71a39199b37c1de15df644f44ee11 --- /dev/null +++ b/test/link/macho/frameworks/build.zig @@ -0,0 +1,20 @@ +const std = @import("std"); +const Builder = std.build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + + const test_step = b.step("test", "Test the program"); + + const exe = b.addExecutable("test", null); + b.default_step.dependOn(&exe.step); + exe.addCSourceFile("main.c", &[0][]const u8{}); + exe.setBuildMode(mode); + exe.linkLibC(); + // TODO when we figure out how to ship framework stubs for cross-compilation, + // populate paths to the sysroot here. + exe.linkFramework("Cocoa"); + + const run_cmd = exe.run(); + test_step.dependOn(&run_cmd.step); +} diff --git a/test/link/macho/frameworks/main.c b/test/link/macho/frameworks/main.c new file mode 100644 index 0000000000000000000000000000000000000000..b9dab990b2ffb70ec0616bf41a05c49b32f83ec5 --- /dev/null +++ b/test/link/macho/frameworks/main.c @@ -0,0 +1,7 @@ +#include +#include + +int main() { + assert(objc_getClass("NSObject") > 0); + assert(objc_getClass("NSApplication") > 0); +} diff --git a/test/link/macho/objc/Foo.h b/test/link/macho/objc/Foo.h new file mode 100644 index 0000000000000000000000000000000000000000..05cb7df39b9dc2cdb4b93a144dd5e9104f873772 --- /dev/null +++ b/test/link/macho/objc/Foo.h @@ -0,0 +1,7 @@ +#import + +@interface Foo : NSObject + +- (NSString *)name; + +@end diff --git a/test/link/macho/objc/Foo.m b/test/link/macho/objc/Foo.m new file mode 100644 index 0000000000000000000000000000000000000000..6fc9b1edf0a9b0911062ae04ad4e17a11e9fa263 --- /dev/null +++ b/test/link/macho/objc/Foo.m @@ -0,0 +1,11 @@ +#import "Foo.h" + +@implementation Foo + +- (NSString *)name +{ + NSString *str = [[NSString alloc] initWithFormat:@"Zig"]; + return str; +} + +@end diff --git a/test/link/macho/objc/build.zig b/test/link/macho/objc/build.zig new file mode 100644 index 0000000000000000000000000000000000000000..e41fd48e7164bae47d27534b7201140c8262b857 --- /dev/null +++ b/test/link/macho/objc/build.zig @@ -0,0 +1,22 @@ +const std = @import("std"); +const Builder = std.build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + + const test_step = b.step("test", "Test the program"); + + const exe = b.addExecutable("test", null); + b.default_step.dependOn(&exe.step); + exe.addIncludePath("."); + exe.addCSourceFile("Foo.m", &[0][]const u8{}); + exe.addCSourceFile("test.m", &[0][]const u8{}); + exe.setBuildMode(mode); + exe.linkLibC(); + // TODO when we figure out how to ship framework stubs for cross-compilation, + // populate paths to the sysroot here. + exe.linkFramework("Foundation"); + + const run_cmd = exe.run(); + test_step.dependOn(&run_cmd.step); +} diff --git a/test/link/macho/objc/test.m b/test/link/macho/objc/test.m new file mode 100644 index 0000000000000000000000000000000000000000..3c81316788d075a4eb3328b90e21a270c06257c8 --- /dev/null +++ b/test/link/macho/objc/test.m @@ -0,0 +1,12 @@ +#import "Foo.h" +#import + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + Foo *foo = [[Foo alloc] init]; + NSString *result = [foo name]; + assert([result isEqualToString:@"Zig"]); + return 0; + } +} diff --git a/test/link/macho/objcpp/Foo.h b/test/link/macho/objcpp/Foo.h new file mode 100644 index 0000000000000000000000000000000000000000..05cb7df39b9dc2cdb4b93a144dd5e9104f873772 --- /dev/null +++ b/test/link/macho/objcpp/Foo.h @@ -0,0 +1,7 @@ +#import + +@interface Foo : NSObject + +- (NSString *)name; + +@end diff --git a/test/link/macho/objcpp/Foo.mm b/test/link/macho/objcpp/Foo.mm new file mode 100644 index 0000000000000000000000000000000000000000..6fc9b1edf0a9b0911062ae04ad4e17a11e9fa263 --- /dev/null +++ b/test/link/macho/objcpp/Foo.mm @@ -0,0 +1,11 @@ +#import "Foo.h" + +@implementation Foo + +- (NSString *)name +{ + NSString *str = [[NSString alloc] initWithFormat:@"Zig"]; + return str; +} + +@end diff --git a/test/link/macho/objcpp/build.zig b/test/link/macho/objcpp/build.zig new file mode 100644 index 0000000000000000000000000000000000000000..767578e225adce2a787cb7c7bf07567ef2b2d6dc --- /dev/null +++ b/test/link/macho/objcpp/build.zig @@ -0,0 +1,24 @@ +const std = @import("std"); +const Builder = std.build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + + const test_step = b.step("test", "Test the program"); + + const exe = b.addExecutable("test", null); + b.default_step.dependOn(&exe.step); + exe.addIncludePath("."); + exe.addCSourceFile("Foo.mm", &[0][]const u8{}); + exe.addCSourceFile("test.mm", &[0][]const u8{}); + exe.setBuildMode(mode); + exe.linkLibCpp(); + // TODO when we figure out how to ship framework stubs for cross-compilation, + // populate paths to the sysroot here. + exe.linkFramework("Foundation"); + + const run_cmd = exe.run(); + run_cmd.expectStdOutEqual("Hello from C++ and Zig"); + + test_step.dependOn(&run_cmd.step); +} diff --git a/test/link/macho/objcpp/test.mm b/test/link/macho/objcpp/test.mm new file mode 100644 index 0000000000000000000000000000000000000000..d27c543cdf351ad38903624991b3b6d9a4f5f07a --- /dev/null +++ b/test/link/macho/objcpp/test.mm @@ -0,0 +1,14 @@ +#import "Foo.h" +#import +#include + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + Foo *foo = [[Foo alloc] init]; + NSString *result = [foo name]; + std::cout << "Hello from C++ and " << [result UTF8String]; + assert([result isEqualToString:@"Zig"]); + return 0; + } +} diff --git a/test/link/macho/pagezero/build.zig b/test/link/macho/pagezero/build.zig new file mode 100644 index 0000000000000000000000000000000000000000..05bc4052fe0a9e87732f97f0fd137fb18a920d1c --- /dev/null +++ b/test/link/macho/pagezero/build.zig @@ -0,0 +1,43 @@ +const std = @import("std"); +const Builder = std.build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + + const test_step = b.step("test", "Test"); + test_step.dependOn(b.getInstallStep()); + + { + const exe = b.addExecutable("pagezero", null); + exe.setBuildMode(mode); + exe.addCSourceFile("main.c", &.{}); + exe.linkLibC(); + exe.pagezero_size = 0x4000; + + const check = exe.checkMachO(); + check.check("LC 0"); + check.checkNext("segname __PAGEZERO"); + check.checkNext("vmaddr 0"); + check.checkNext("vmsize 4000"); + + check.check("segname __TEXT"); + check.checkNext("vmaddr 4000"); + + test_step.dependOn(&check.step); + } + + { + const exe = b.addExecutable("no_pagezero", null); + exe.setBuildMode(mode); + exe.addCSourceFile("main.c", &.{}); + exe.linkLibC(); + exe.pagezero_size = 0; + + const check = exe.checkMachO(); + check.check("LC 0"); + check.checkNext("segname __TEXT"); + check.checkNext("vmaddr 0"); + + test_step.dependOn(&check.step); + } +} diff --git a/test/link/macho/pagezero/main.c b/test/link/macho/pagezero/main.c new file mode 100644 index 0000000000000000000000000000000000000000..ca68d24cc70460626b8cb3168417e66ddc4404ea --- /dev/null +++ b/test/link/macho/pagezero/main.c @@ -0,0 +1,3 @@ +int main(int argc, char* argv[]) { + return 0; +} diff --git a/test/link/macho/stack_size/build.zig b/test/link/macho/stack_size/build.zig new file mode 100644 index 0000000000000000000000000000000000000000..10b5a3f83d181aaa4cfa366dc34739a24602330c --- /dev/null +++ b/test/link/macho/stack_size/build.zig @@ -0,0 +1,24 @@ +const std = @import("std"); +const Builder = std.build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + + const test_step = b.step("test", "Test"); + test_step.dependOn(b.getInstallStep()); + + const exe = b.addExecutable("main", null); + exe.setBuildMode(mode); + exe.addCSourceFile("main.c", &.{}); + exe.linkLibC(); + exe.stack_size = 0x100000000; + + const check_exe = exe.checkMachO(); + check_exe.check("cmd MAIN"); + check_exe.checkNext("stacksize 100000000"); + + test_step.dependOn(&check_exe.step); + + const run = exe.run(); + test_step.dependOn(&run.step); +} diff --git a/test/link/macho/stack_size/main.c b/test/link/macho/stack_size/main.c new file mode 100644 index 0000000000000000000000000000000000000000..ca68d24cc70460626b8cb3168417e66ddc4404ea --- /dev/null +++ b/test/link/macho/stack_size/main.c @@ -0,0 +1,3 @@ +int main(int argc, char* argv[]) { + return 0; +} diff --git a/test/link/objc/Foo.h b/test/link/objc/Foo.h deleted file mode 100644 index 05cb7df39b9dc2cdb4b93a144dd5e9104f873772..0000000000000000000000000000000000000000 --- a/test/link/objc/Foo.h +++ /dev/null @@ -1,7 +0,0 @@ -#import - -@interface Foo : NSObject - -- (NSString *)name; - -@end diff --git a/test/link/objc/Foo.m b/test/link/objc/Foo.m deleted file mode 100644 index 6fc9b1edf0a9b0911062ae04ad4e17a11e9fa263..0000000000000000000000000000000000000000 --- a/test/link/objc/Foo.m +++ /dev/null @@ -1,11 +0,0 @@ -#import "Foo.h" - -@implementation Foo - -- (NSString *)name -{ - NSString *str = [[NSString alloc] initWithFormat:@"Zig"]; - return str; -} - -@end diff --git a/test/link/objc/build.zig b/test/link/objc/build.zig deleted file mode 100644 index e41fd48e7164bae47d27534b7201140c8262b857..0000000000000000000000000000000000000000 --- a/test/link/objc/build.zig +++ /dev/null @@ -1,22 +0,0 @@ -const std = @import("std"); -const Builder = std.build.Builder; - -pub fn build(b: *Builder) void { - const mode = b.standardReleaseOptions(); - - const test_step = b.step("test", "Test the program"); - - const exe = b.addExecutable("test", null); - b.default_step.dependOn(&exe.step); - exe.addIncludePath("."); - exe.addCSourceFile("Foo.m", &[0][]const u8{}); - exe.addCSourceFile("test.m", &[0][]const u8{}); - exe.setBuildMode(mode); - exe.linkLibC(); - // TODO when we figure out how to ship framework stubs for cross-compilation, - // populate paths to the sysroot here. - exe.linkFramework("Foundation"); - - const run_cmd = exe.run(); - test_step.dependOn(&run_cmd.step); -} diff --git a/test/link/objc/test.m b/test/link/objc/test.m deleted file mode 100644 index 3c81316788d075a4eb3328b90e21a270c06257c8..0000000000000000000000000000000000000000 --- a/test/link/objc/test.m +++ /dev/null @@ -1,12 +0,0 @@ -#import "Foo.h" -#import - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - Foo *foo = [[Foo alloc] init]; - NSString *result = [foo name]; - assert([result isEqualToString:@"Zig"]); - return 0; - } -} diff --git a/test/link/objcpp/Foo.h b/test/link/objcpp/Foo.h deleted file mode 100644 index 05cb7df39b9dc2cdb4b93a144dd5e9104f873772..0000000000000000000000000000000000000000 --- a/test/link/objcpp/Foo.h +++ /dev/null @@ -1,7 +0,0 @@ -#import - -@interface Foo : NSObject - -- (NSString *)name; - -@end diff --git a/test/link/objcpp/Foo.mm b/test/link/objcpp/Foo.mm deleted file mode 100644 index 6fc9b1edf0a9b0911062ae04ad4e17a11e9fa263..0000000000000000000000000000000000000000 --- a/test/link/objcpp/Foo.mm +++ /dev/null @@ -1,11 +0,0 @@ -#import "Foo.h" - -@implementation Foo - -- (NSString *)name -{ - NSString *str = [[NSString alloc] initWithFormat:@"Zig"]; - return str; -} - -@end diff --git a/test/link/objcpp/build.zig b/test/link/objcpp/build.zig deleted file mode 100644 index 767578e225adce2a787cb7c7bf07567ef2b2d6dc..0000000000000000000000000000000000000000 --- a/test/link/objcpp/build.zig +++ /dev/null @@ -1,24 +0,0 @@ -const std = @import("std"); -const Builder = std.build.Builder; - -pub fn build(b: *Builder) void { - const mode = b.standardReleaseOptions(); - - const test_step = b.step("test", "Test the program"); - - const exe = b.addExecutable("test", null); - b.default_step.dependOn(&exe.step); - exe.addIncludePath("."); - exe.addCSourceFile("Foo.mm", &[0][]const u8{}); - exe.addCSourceFile("test.mm", &[0][]const u8{}); - exe.setBuildMode(mode); - exe.linkLibCpp(); - // TODO when we figure out how to ship framework stubs for cross-compilation, - // populate paths to the sysroot here. - exe.linkFramework("Foundation"); - - const run_cmd = exe.run(); - run_cmd.expectStdOutEqual("Hello from C++ and Zig"); - - test_step.dependOn(&run_cmd.step); -} diff --git a/test/link/objcpp/test.mm b/test/link/objcpp/test.mm deleted file mode 100644 index d27c543cdf351ad38903624991b3b6d9a4f5f07a..0000000000000000000000000000000000000000 --- a/test/link/objcpp/test.mm +++ /dev/null @@ -1,14 +0,0 @@ -#import "Foo.h" -#import -#include - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - Foo *foo = [[Foo alloc] init]; - NSString *result = [foo name]; - std::cout << "Hello from C++ and " << [result UTF8String]; - assert([result isEqualToString:@"Zig"]); - return 0; - } -} diff --git a/test/link/pagezero/build.zig b/test/link/pagezero/build.zig deleted file mode 100644 index 05bc4052fe0a9e87732f97f0fd137fb18a920d1c..0000000000000000000000000000000000000000 --- a/test/link/pagezero/build.zig +++ /dev/null @@ -1,43 +0,0 @@ -const std = @import("std"); -const Builder = std.build.Builder; - -pub fn build(b: *Builder) void { - const mode = b.standardReleaseOptions(); - - const test_step = b.step("test", "Test"); - test_step.dependOn(b.getInstallStep()); - - { - const exe = b.addExecutable("pagezero", null); - exe.setBuildMode(mode); - exe.addCSourceFile("main.c", &.{}); - exe.linkLibC(); - exe.pagezero_size = 0x4000; - - const check = exe.checkMachO(); - check.check("LC 0"); - check.checkNext("segname __PAGEZERO"); - check.checkNext("vmaddr 0"); - check.checkNext("vmsize 4000"); - - check.check("segname __TEXT"); - check.checkNext("vmaddr 4000"); - - test_step.dependOn(&check.step); - } - - { - const exe = b.addExecutable("no_pagezero", null); - exe.setBuildMode(mode); - exe.addCSourceFile("main.c", &.{}); - exe.linkLibC(); - exe.pagezero_size = 0; - - const check = exe.checkMachO(); - check.check("LC 0"); - check.checkNext("segname __TEXT"); - check.checkNext("vmaddr 0"); - - test_step.dependOn(&check.step); - } -} diff --git a/test/link/pagezero/main.c b/test/link/pagezero/main.c deleted file mode 100644 index ca68d24cc70460626b8cb3168417e66ddc4404ea..0000000000000000000000000000000000000000 --- a/test/link/pagezero/main.c +++ /dev/null @@ -1,3 +0,0 @@ -int main(int argc, char* argv[]) { - return 0; -}