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:
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