zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 2b8a05b8d9125b7465f0d3bd44e90d82a06dd5fa (tree)
parent 89f86e46d278a35a613bbc662cdd3f65ffc76ed7
Author: Matthew Lugg <mlugg@mlugg.co.uk>
Date:   Thu, 30 Apr 2026 09:57:20 +0100

tests: restore standalone/ios, add Zig code to it

This was deleted in beef9fdf42726d8cfe3017ff3017767fb615ef08 because it
was setting `b.sysroot`. However, I frankly have no idea why it was
doing that---the test works just fine without touching `b.sysroot`!

Even before it was removed, this test was never actually running,
because the executable was not added as a dependency of `test_step`. I
made it run, and updated it to work (it was previously failing due to a
missing framework path).

I also added some Zig source code, the goal being to test that the panic
handler compiles okay on iOS. I confirmed that the updated test passes
as-is, but fails if the fix in the previous commit is reverted.

Because this test requires the iOS SDK to be installed, it is only run
if `-Denable-ios-sdk` is passed to `zig build`, which is currently not
the case in CI. For now, I am not changing this, because the
aarch64-macos CI runner currently does not have the iOS SDK installed.
It would be good to enable this coverage on CI at some point, though.

Diffstat:
Mtest/standalone/build.zig.zon | 3+++
Atest/standalone/ios/build.zig | 41+++++++++++++++++++++++++++++++++++++++++
Atest/standalone/ios/main.m | 38++++++++++++++++++++++++++++++++++++++
Atest/standalone/ios/panic.zig | 4++++
4 files changed, 86 insertions(+), 0 deletions(-)

diff --git a/test/standalone/build.zig.zon b/test/standalone/build.zig.zon @@ -153,6 +153,9 @@ .compiler_rt_panic = .{ .path = "compiler_rt_panic", }, + .ios = .{ + .path = "ios", + }, .depend_on_main_mod = .{ .path = "depend_on_main_mod", }, diff --git a/test/standalone/ios/build.zig b/test/standalone/ios/build.zig @@ -0,0 +1,41 @@ +const std = @import("std"); + +pub const requires_symlinks = true; +pub const requires_ios_sdk = true; + +pub fn build(b: *std.Build) void { + const test_step = b.step("test", "Test it"); + b.default_step = test_step; + + const target = b.resolveTargetQuery(.{ + .cpu_arch = .aarch64, + .os_tag = .ios, + }); + + const exe = b.addExecutable(.{ + .name = "main", + .root_module = b.createModule(.{ + .root_source_file = b.path("panic.zig"), + .optimize = .Debug, + .target = target, + .link_libc = true, + }), + }); + + const io = b.graph.io; + + if (std.zig.system.darwin.getSdk(b.allocator, io, &target.result)) |sdk| { + exe.root_module.addSystemIncludePath(.{ .cwd_relative = b.pathJoin(&.{ sdk, "/usr/include" }) }); + exe.root_module.addSystemFrameworkPath(.{ .cwd_relative = b.pathJoin(&.{ sdk, "/System/Library/Frameworks" }) }); + exe.root_module.addSystemFrameworkPath(.{ .cwd_relative = b.pathJoin(&.{ sdk, "/System/Library/SubFrameworks" }) }); + exe.root_module.addLibraryPath(.{ .cwd_relative = b.pathJoin(&.{ sdk, "/usr/lib" }) }); + } else { + exe.step.dependOn(&b.addFail("no iOS SDK found").step); + } + + exe.root_module.addCSourceFile(.{ .file = b.path("main.m"), .flags = &.{} }); + exe.root_module.linkFramework("Foundation", .{}); + exe.root_module.linkFramework("UIKit", .{}); + + test_step.dependOn(&b.addInstallArtifact(exe, .{}).step); +} diff --git a/test/standalone/ios/main.m b/test/standalone/ios/main.m @@ -0,0 +1,38 @@ +#import <UIKit/UIKit.h> + +@interface AppDelegate : UIResponder <UIApplicationDelegate> +@property (strong, nonatomic) UIWindow *window; +@end + +extern void zig_panic(); + +int main() { + @autoreleasepool { + return UIApplicationMain(0, nil, nil, NSStringFromClass([AppDelegate class])); + } +} + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(id)options { + CGRect mainScreenBounds = [[UIScreen mainScreen] bounds]; + self.window = [[UIWindow alloc] initWithFrame:mainScreenBounds]; + UIViewController *viewController = [[UIViewController alloc] init]; + viewController.view.frame = mainScreenBounds; + + NSString* msg = @"Hello world"; + + UILabel *label = [[UILabel alloc] initWithFrame:mainScreenBounds]; + [label setText:msg]; + [viewController.view addSubview: label]; + + self.window.rootViewController = viewController; + + [self.window makeKeyAndVisible]; + + zig_panic(); + + return YES; +} + +@end diff --git a/test/standalone/ios/panic.zig b/test/standalone/ios/panic.zig @@ -0,0 +1,4 @@ +export fn zig_panic() void { + @panic("called zig_panic"); +} +pub const _start = {}; // entry point is in main.m