diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3c74fe6aa36..22d7eea7089 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -340,6 +340,9 @@ jobs: - name: Build XCFramework run: nix develop -c zig build -Demit-lib-vt + - name: Verify XCFramework artifact + run: test -f zig-out/lib/ghostty-vt.xcframework/Info.plist + - name: Build and Run Example run: | cd example/${{ matrix.dir }} diff --git a/build.zig b/build.zig index b89958e5546..952b4621df5 100644 --- a/build.zig +++ b/build.zig @@ -155,7 +155,11 @@ pub fn build(b: *std.Build) !void { // libghostty-vt xcframework (Apple only, universal binary). // Only when building on macOS (not cross-compiling) since // xcodebuild is required. - if (builtin.os.tag.isDarwin() and config.target.result.os.tag.isDarwin()) { + if (config.emit_lib_vt and + config.emit_xcframework and + builtin.os.tag.isDarwin() and + config.target.result.os.tag.isDarwin()) + { const apple_libs = try buildpkg.GhosttyLibVt.initStaticAppleUniversal( b, &config, @@ -200,8 +204,9 @@ pub fn build(b: *std.Build) !void { } // macOS only artifacts. These will error if they're initialized for - // other targets. - if (config.target.result.os.tag.isDarwin() and + // other targets. In lib-vt mode emit_xcframework controls the lib-vt + // xcframework above, not this one. + if (!config.emit_lib_vt and config.target.result.os.tag.isDarwin() and (config.emit_xcframework or config.emit_macos_app)) { // Ghostty xcframework diff --git a/src/build/Config.zig b/src/build/Config.zig index 797a00ddb68..0a99473174e 100644 --- a/src/build/Config.zig +++ b/src/build/Config.zig @@ -444,13 +444,22 @@ pub fn init(b: *std.Build, appVersion: []const u8, libVersion: []const u8) !Conf bool, "emit-xcframework", "Build and install the xcframework for the macOS library.", - ) orelse !config.emit_lib_vt and - builtin.target.os.tag.isDarwin() and - target.result.os.tag == .macos and - config.app_runtime == .none and - (!config.emit_bench and - !config.emit_test_exe and - !config.emit_helpgen); + ) orelse emit_xcfw: { + if (!builtin.target.os.tag.isDarwin() or target.result.os.tag != .macos) + break :emit_xcfw false; + if (config.emit_lib_vt) { + // In lib-vt mode default to whether xcodebuild is available, + // since xcodebuild is required to produce the XCFramework. + const path = expandPath(b.allocator, "xcodebuild") catch + break :emit_xcfw false; + defer if (path) |p| b.allocator.free(p); + break :emit_xcfw path != null; + } + break :emit_xcfw config.app_runtime == .none and + (!config.emit_bench and + !config.emit_test_exe and + !config.emit_helpgen); + }; config.emit_macos_app = b.option( bool,