From 26e2dbb3533d2f6b1c513a4ca98dcda1b5d70bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Wei=C3=9F?= Date: Mon, 20 Jan 2025 20:32:43 +0100 Subject: [PATCH 1/2] fix: Fix BuildSettingsProvider for visionOS --- .../Utils/BuildSettingsProvider.swift | 10 +- .../Utils/BuildSettingsProviderTests.swift | 98 +++++++++++++++++++ 2 files changed, 107 insertions(+), 1 deletion(-) diff --git a/Sources/XcodeProj/Utils/BuildSettingsProvider.swift b/Sources/XcodeProj/Utils/BuildSettingsProvider.swift index cdfd052e..29d4ebbb 100644 --- a/Sources/XcodeProj/Utils/BuildSettingsProvider.swift +++ b/Sources/XcodeProj/Utils/BuildSettingsProvider.swift @@ -247,6 +247,10 @@ public class BuildSettingsProvider { "SKIP_INSTALL": "YES", "LD_RUNPATH_SEARCH_PATHS": ["$(inherited)", "@executable_path/Frameworks"], ] + case (.visionOS, .application): + [ + "LD_RUNPATH_SEARCH_PATHS": ["$(inherited)", "@executable_path/Frameworks"], + ] case (.iOS, .framework): [ "LD_RUNPATH_SEARCH_PATHS": ["$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks"], @@ -266,6 +270,10 @@ public class BuildSettingsProvider { "APPLICATION_EXTENSION_API_ONLY": "YES", "LD_RUNPATH_SEARCH_PATHS": ["$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks"], ] + case (.visionOS, .framework): + [ + "LD_RUNPATH_SEARCH_PATHS": ["$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks"], + ] case ([.iOS, .tvOS, .watchOS], .staticLibrary): [ "OTHER_LDFLAGS": "-ObjC", @@ -317,7 +325,7 @@ public class BuildSettingsProvider { "@executable_path/../../../../Frameworks", ], ] - case ([.iOS, .tvOS], [.unitTests, .uiTests]): + case ([.iOS, .tvOS, .visionOS], [.unitTests, .uiTests]): [ "LD_RUNPATH_SEARCH_PATHS": ["$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks"], ] diff --git a/Tests/XcodeProjTests/Utils/BuildSettingsProviderTests.swift b/Tests/XcodeProjTests/Utils/BuildSettingsProviderTests.swift index c03339fc..f600a46a 100644 --- a/Tests/XcodeProjTests/Utils/BuildSettingsProviderTests.swift +++ b/Tests/XcodeProjTests/Utils/BuildSettingsProviderTests.swift @@ -146,6 +146,60 @@ class BuildSettingProviderTests: XCTestCase { ]) } + func test_targetSettings_visionOSAplication() { + // Given / When + let results = BuildSettingsProvider.targetDefault(variant: .release, + platform: .visionOS, + product: .application, + swift: true) + + // Then + assertEqualSettings(results, [ + "ASSETCATALOG_COMPILER_APPICON_NAME": "AppIcon", + "ENABLE_PREVIEWS": "YES", + "LD_RUNPATH_SEARCH_PATHS": [ + "$(inherited)", + "@executable_path/Frameworks", + ], + "SDKROOT": "xros", + "SWIFT_COMPILATION_MODE": "wholemodule", + "SWIFT_OPTIMIZATION_LEVEL": "-Owholemodule", + "TARGETED_DEVICE_FAMILY": "1,2,7", + ]) + } + + func test_targetSettings_visionOSFramework() { + // Given / When + let results = BuildSettingsProvider.targetDefault(variant: .release, + platform: .visionOS, + product: .framework, + swift: true) + + // Then + assertEqualSettings(results, [ + "CODE_SIGN_IDENTITY": "", + "CURRENT_PROJECT_VERSION": "1", + "DEFINES_MODULE": "YES", + "DYLIB_COMPATIBILITY_VERSION": "1", + "DYLIB_CURRENT_VERSION": "1", + "DYLIB_INSTALL_NAME_BASE": "@rpath", + "INSTALL_PATH": "$(LOCAL_LIBRARY_DIR)/Frameworks", + "LD_RUNPATH_SEARCH_PATHS": [ + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ], + "PRODUCT_NAME": "$(TARGET_NAME:c99extidentifier)", + "SDKROOT": "xros", + "SKIP_INSTALL": "YES", + "SWIFT_COMPILATION_MODE": "wholemodule", + "SWIFT_OPTIMIZATION_LEVEL": "-Owholemodule", + "TARGETED_DEVICE_FAMILY": "1,2,7", + "VERSIONING_SYSTEM": "apple-generic", + "VERSION_INFO_PREFIX": "", + ]) + } + func test_targetSettings_iOSUnitTests() { // Given / When let results = BuildSettingsProvider.targetDefault(variant: .debug, @@ -236,6 +290,50 @@ class BuildSettingProviderTests: XCTestCase { ]) } + func test_targetSettings_visionOSUnitTests() { + // Given / When + let results = BuildSettingsProvider.targetDefault(variant: .debug, + platform: .visionOS, + product: .unitTests, + swift: true) + + // Then + assertEqualSettings(results, [ + "SDKROOT": "xros", + "LD_RUNPATH_SEARCH_PATHS": [ + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ], + "SWIFT_ACTIVE_COMPILATION_CONDITIONS": ["$(inherited)", "DEBUG"], + "SWIFT_COMPILATION_MODE": "singlefile", + "SWIFT_OPTIMIZATION_LEVEL": "-Onone", + "TARGETED_DEVICE_FAMILY": "1,2,7", + ]) + } + + func test_targetSettings_visionOSUITests() { + // Given / When + let results = BuildSettingsProvider.targetDefault(variant: .debug, + platform: .visionOS, + product: .uiTests, + swift: true) + + // Then + assertEqualSettings(results, [ + "SDKROOT": "xros", + "LD_RUNPATH_SEARCH_PATHS": [ + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ], + "SWIFT_ACTIVE_COMPILATION_CONDITIONS": ["$(inherited)", "DEBUG"], + "SWIFT_COMPILATION_MODE": "singlefile", + "SWIFT_OPTIMIZATION_LEVEL": "-Onone", + "TARGETED_DEVICE_FAMILY": "1,2,7", + ]) + } + // MARK: - Helpers func assertEqualSettings(_ lhs: BuildSettings, _ rhs: BuildSettings, file: StaticString = #file, line: UInt = #line) { From bdeca84124e03d6eed1624c19d9e9361000e5c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Wei=C3=9F?= Date: Wed, 22 Jan 2025 18:20:14 +0100 Subject: [PATCH 2/2] feat: Add visionOS mapping to additional cases Add new test cases for additional visionOS mappings Add tests for missing watchOS cases --- .../Utils/BuildSettingsProvider.swift | 5 +- .../Utils/BuildSettingsProviderTests.swift | 80 +++++++++++++++++++ 2 files changed, 83 insertions(+), 2 deletions(-) diff --git a/Sources/XcodeProj/Utils/BuildSettingsProvider.swift b/Sources/XcodeProj/Utils/BuildSettingsProvider.swift index 29d4ebbb..f348d2ad 100644 --- a/Sources/XcodeProj/Utils/BuildSettingsProvider.swift +++ b/Sources/XcodeProj/Utils/BuildSettingsProvider.swift @@ -188,6 +188,7 @@ public class BuildSettingsProvider { case .visionOS: [ "SDKROOT": "xros", + "CODE_SIGN_IDENTITY": "iPhone Developer", "TARGETED_DEVICE_FAMILY": "1,2,7", ] } @@ -274,7 +275,7 @@ public class BuildSettingsProvider { [ "LD_RUNPATH_SEARCH_PATHS": ["$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks"], ] - case ([.iOS, .tvOS, .watchOS], .staticLibrary): + case ([.iOS, .tvOS, .watchOS, .visionOS], .staticLibrary): [ "OTHER_LDFLAGS": "-ObjC", "SKIP_INSTALL": "YES", @@ -296,7 +297,7 @@ public class BuildSettingsProvider { "COMBINE_HIDPI_IMAGES": "YES", "INSTALL_PATH": "$(LOCAL_LIBRARY_DIR)/Bundles", ] - case ([.iOS, .tvOS], .appExtension): + case ([.iOS, .tvOS, .visionOS], .appExtension): [ "LD_RUNPATH_SEARCH_PATHS": ["$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks"], ] diff --git a/Tests/XcodeProjTests/Utils/BuildSettingsProviderTests.swift b/Tests/XcodeProjTests/Utils/BuildSettingsProviderTests.swift index f600a46a..7630c5f1 100644 --- a/Tests/XcodeProjTests/Utils/BuildSettingsProviderTests.swift +++ b/Tests/XcodeProjTests/Utils/BuildSettingsProviderTests.swift @@ -146,6 +146,61 @@ class BuildSettingProviderTests: XCTestCase { ]) } + func test_targetSettings_watchOSFramework() { + // Given / When + let results = BuildSettingsProvider.targetDefault(variant: .release, + platform: .watchOS, + product: .framework, + swift: true) + + // Then + assertEqualSettings(results, [ + "APPLICATION_EXTENSION_API_ONLY": "YES", + "CODE_SIGN_IDENTITY": "", + "CURRENT_PROJECT_VERSION": "1", + "DEFINES_MODULE": "YES", + "DYLIB_COMPATIBILITY_VERSION": "1", + "DYLIB_CURRENT_VERSION": "1", + "DYLIB_INSTALL_NAME_BASE": "@rpath", + "INSTALL_PATH": "$(LOCAL_LIBRARY_DIR)/Frameworks", + "LD_RUNPATH_SEARCH_PATHS": [ + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ], + "PRODUCT_NAME": "$(TARGET_NAME:c99extidentifier)", + "SDKROOT": "watchos", + "SKIP_INSTALL": "YES", + "SWIFT_COMPILATION_MODE": "wholemodule", + "SWIFT_OPTIMIZATION_LEVEL": "-Owholemodule", + "TARGETED_DEVICE_FAMILY": "4", + "VERSIONING_SYSTEM": "apple-generic", + "VERSION_INFO_PREFIX": "", + ]) + } + + func test_targetSettings_watchOSExtension() { + // Given / When + let results = BuildSettingsProvider.targetDefault(variant: .release, + platform: .watchOS, + product: .appExtension, + swift: true) + + // Then + assertEqualSettings(results, [ + "LD_RUNPATH_SEARCH_PATHS": [ + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + "@executable_path/../../../../Frameworks", + ], + "SDKROOT": "watchos", + "SWIFT_COMPILATION_MODE": "wholemodule", + "SWIFT_OPTIMIZATION_LEVEL": "-Owholemodule", + "TARGETED_DEVICE_FAMILY": "4", + ]) + } + func test_targetSettings_visionOSAplication() { // Given / When let results = BuildSettingsProvider.targetDefault(variant: .release, @@ -155,6 +210,7 @@ class BuildSettingProviderTests: XCTestCase { // Then assertEqualSettings(results, [ + "CODE_SIGN_IDENTITY": "iPhone Developer", "ASSETCATALOG_COMPILER_APPICON_NAME": "AppIcon", "ENABLE_PREVIEWS": "YES", "LD_RUNPATH_SEARCH_PATHS": [ @@ -200,6 +256,28 @@ class BuildSettingProviderTests: XCTestCase { ]) } + func test_targetSettings_visionOSExtension() { + // Given / When + let results = BuildSettingsProvider.targetDefault(variant: .release, + platform: .visionOS, + product: .appExtension, + swift: true) + + // Then + assertEqualSettings(results, [ + "CODE_SIGN_IDENTITY": "iPhone Developer", + "LD_RUNPATH_SEARCH_PATHS": [ + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ], + "SDKROOT": "xros", + "SWIFT_COMPILATION_MODE": "wholemodule", + "SWIFT_OPTIMIZATION_LEVEL": "-Owholemodule", + "TARGETED_DEVICE_FAMILY": "1,2,7", + ]) + } + func test_targetSettings_iOSUnitTests() { // Given / When let results = BuildSettingsProvider.targetDefault(variant: .debug, @@ -299,6 +377,7 @@ class BuildSettingProviderTests: XCTestCase { // Then assertEqualSettings(results, [ + "CODE_SIGN_IDENTITY": "iPhone Developer", "SDKROOT": "xros", "LD_RUNPATH_SEARCH_PATHS": [ "$(inherited)", @@ -321,6 +400,7 @@ class BuildSettingProviderTests: XCTestCase { // Then assertEqualSettings(results, [ + "CODE_SIGN_IDENTITY": "iPhone Developer", "SDKROOT": "xros", "LD_RUNPATH_SEARCH_PATHS": [ "$(inherited)",