From 5856dbec779cbb79db87b91d5df2e0a163af5cd2 Mon Sep 17 00:00:00 2001 From: Bartosz Polaczyk Date: Sat, 8 Apr 2023 03:55:57 -0700 Subject: [PATCH] Add skippedSDKs --- README.md | 1 + .../BuildSettingsIntegrateAppender.swift | 38 +++++++++++++------ .../Prepare/Integrate/XCIntegrate.swift | 6 ++- Sources/xcprepare/XCPrepareMain.swift | 6 +++ ...jBuildSettingsIntegrateAppenderTests.swift | 26 +++++++++++-- 5 files changed, 61 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 0f4ece4..39e6266 100755 --- a/README.md +++ b/README.md @@ -152,6 +152,7 @@ xcremotecache/xcprepare integrate --input --mode consume | `--lldb-init` | LLDBInit mode. Appends to .lldbinit a command required for debugging. Supported values: 'none' (do not append to .lldbinit), 'user' (append to ~/.lldbinit) | `user` | ⬜️ | | `--fake-src-root` | An arbitrary source location shared between producers and consumers. Should be unique for a project. | `/xxxxxxxxxx` | ⬜️ | | `--output` | Save the project with integrated XCRemoteCache to a separate location. | N/A | ⬜️ | +| `--sdks-exclude` | comma separated list of sdks to not integrate XCRemoteCache (e.g. "watchos*, watchsimulator*"). | `""` | ⬜️ | diff --git a/Sources/XCRemoteCache/Commands/Prepare/Integrate/BuildSettingsIntegrateAppender.swift b/Sources/XCRemoteCache/Commands/Prepare/Integrate/BuildSettingsIntegrateAppender.swift index 3925ca1..0462e83 100644 --- a/Sources/XCRemoteCache/Commands/Prepare/Integrate/BuildSettingsIntegrateAppender.swift +++ b/Sources/XCRemoteCache/Commands/Prepare/Integrate/BuildSettingsIntegrateAppender.swift @@ -34,24 +34,26 @@ class XcodeProjBuildSettingsIntegrateAppender: BuildSettingsIntegrateAppender { private let mode: Mode private let repoRoot: URL private let fakeSrcRoot: URL + private let sdksExclude: [String] - init(mode: Mode, repoRoot: URL, fakeSrcRoot: URL) { + init(mode: Mode, repoRoot: URL, fakeSrcRoot: URL, sdksExclude: [String]) { self.mode = mode self.repoRoot = repoRoot self.fakeSrcRoot = fakeSrcRoot + self.sdksExclude = sdksExclude } func appendToBuildSettings(buildSettings: BuildSettings, wrappers: XCRCBinariesPaths) -> BuildSettings { var result = buildSettings - result["SWIFT_EXEC"] = wrappers.swiftc.path - result["SWIFT_USE_INTEGRATED_DRIVER"] = "NO" + setBuildSetting(buildSettings: &result, key: "SWIFT_EXEC", value: wrappers.swiftc.path ) + setBuildSetting(buildSettings: &result, key: "SWIFT_USE_INTEGRATED_DRIVER", value: "NO" ) // When generating artifacts, no need to shell-out all compilation commands to our wrappers if case .consumer = mode { - result["CC"] = wrappers.cc.path - result["LD"] = wrappers.ld.path - result["LIBTOOL"] = wrappers.libtool.path - result["LIPO"] = wrappers.lipo.path - result["LDPLUSPLUS"] = wrappers.ldplusplus.path + setBuildSetting(buildSettings: &result, key: "CC", value: wrappers.cc.path ) + setBuildSetting(buildSettings: &result, key: "LD", value: wrappers.ld.path ) + setBuildSetting(buildSettings: &result, key: "LIBTOOL", value: wrappers.libtool.path ) + setBuildSetting(buildSettings: &result, key: "LIPO", value: wrappers.lipo.path ) + setBuildSetting(buildSettings: &result, key: "LDPLUSPLUS", value: wrappers.ldplusplus.path ) } let existingSwiftFlags = result["OTHER_SWIFT_FLAGS"] as? String @@ -63,14 +65,26 @@ class XcodeProjBuildSettingsIntegrateAppender: BuildSettingsIntegrateAppender { swiftFlags.assignFlag(key: "debug-prefix-map", value: "\(repoRoot.path)=$(XCRC_FAKE_SRCROOT)") clangFlags.assignFlag(key: "debug-prefix-map", value: "\(repoRoot.path)=$(XCRC_FAKE_SRCROOT)") - result["OTHER_SWIFT_FLAGS"] = swiftFlags.settingValue - result["OTHER_CFLAGS"] = clangFlags.settingValue + setBuildSetting(buildSettings: &result, key: "OTHER_SWIFT_FLAGS", value: swiftFlags.settingValue ) + setBuildSetting(buildSettings: &result, key: "OTHER_CFLAGS", value: clangFlags.settingValue ) - result["XCRC_FAKE_SRCROOT"] = "\(fakeSrcRoot.path)" - result["XCRC_PLATFORM_PREFERRED_ARCH"] = + setBuildSetting(buildSettings: &result, key: "XCRC_FAKE_SRCROOT", value: "\(fakeSrcRoot.path)" ) + setBuildSetting(buildSettings: &result, key: "XCRC_PLATFORM_PREFERRED_ARCH", value: """ $(LINK_FILE_LIST_$(CURRENT_VARIANT)_$(PLATFORM_PREFERRED_ARCH):dir:standardizepath:file:default=arm64) """ + ) return result } + + private func setBuildSetting(buildSettings: inout BuildSettings, key: String, value: String?) { + buildSettings[key] = value + guard value != nil else { + // no need to exclude as the value will + return + } + for skippedSDK in sdksExclude { + buildSettings["\(key)[sdk=\(skippedSDK)]"] = "" + } + } } diff --git a/Sources/XCRemoteCache/Commands/Prepare/Integrate/XCIntegrate.swift b/Sources/XCRemoteCache/Commands/Prepare/Integrate/XCIntegrate.swift index 3788e07..acb52aa 100644 --- a/Sources/XCRemoteCache/Commands/Prepare/Integrate/XCIntegrate.swift +++ b/Sources/XCRemoteCache/Commands/Prepare/Integrate/XCIntegrate.swift @@ -34,6 +34,7 @@ public class XCIntegrate { private let consumerEligiblePlatforms: String private let lldbMode: LLDBInitMode private let fakeSrcRoot: String + private let sdksExclude: String private let output: String? public init( @@ -48,6 +49,7 @@ public class XCIntegrate { consumerEligiblePlatforms: String, lldbMode: LLDBInitMode, fakeSrcRoot: String, + sdksExclude: String, output: String? ) { projectPath = input @@ -61,6 +63,7 @@ public class XCIntegrate { self.consumerEligiblePlatforms = consumerEligiblePlatforms self.lldbMode = lldbMode self.fakeSrcRoot = fakeSrcRoot + self.sdksExclude = sdksExclude self.output = output } @@ -98,7 +101,8 @@ public class XCIntegrate { let buildSettingsAppender = XcodeProjBuildSettingsIntegrateAppender( mode: context.mode, repoRoot: context.repoRoot, - fakeSrcRoot: context.fakeSrcRoot + fakeSrcRoot: context.fakeSrcRoot, + sdksExclude: sdksExclude.integrateArrayArguments ) let lldbPatcher: LLDBInitPatcher switch lldbMode { diff --git a/Sources/xcprepare/XCPrepareMain.swift b/Sources/xcprepare/XCPrepareMain.swift index 6d6d037..420edc8 100644 --- a/Sources/xcprepare/XCPrepareMain.swift +++ b/Sources/xcprepare/XCPrepareMain.swift @@ -228,6 +228,11 @@ struct XCPrepareMain: ParsableCommand { transform: nonEmptyString ) var fakeSrcRoot: String + + @Option(name: .customLong("sdks-exclude"), default: "", help: """ + comma separated list of sdks to not integrate XCRemoteCache (e.g. "watchos*, watchsimulator*") + """, transform: nonEmptyString) + var sdksExclude: String func run() throws { @@ -243,6 +248,7 @@ struct XCPrepareMain: ParsableCommand { consumerEligiblePlatforms: consumerEligiblePlatforms, lldbMode: lldbInit, fakeSrcRoot: fakeSrcRoot, + sdksExclude: sdksExclude, output: output ).main() } diff --git a/Tests/XCRemoteCacheTests/Commands/Prepare/Integrate/XcodeProjBuildSettingsIntegrateAppenderTests.swift b/Tests/XCRemoteCacheTests/Commands/Prepare/Integrate/XcodeProjBuildSettingsIntegrateAppenderTests.swift index 34b6b00..8fbd355 100644 --- a/Tests/XCRemoteCacheTests/Commands/Prepare/Integrate/XcodeProjBuildSettingsIntegrateAppenderTests.swift +++ b/Tests/XCRemoteCacheTests/Commands/Prepare/Integrate/XcodeProjBuildSettingsIntegrateAppenderTests.swift @@ -45,7 +45,7 @@ class XcodeProjBuildSettingsIntegrateAppenderTests: XCTestCase { func testProducerSettingFakeSrcRoot() throws { let mode: Mode = .producer let fakeRootURL: URL = "/xxxxxxxxxxP" - let appender = XcodeProjBuildSettingsIntegrateAppender(mode: mode, repoRoot: rootURL, fakeSrcRoot: fakeRootURL) + let appender = XcodeProjBuildSettingsIntegrateAppender(mode: mode, repoRoot: rootURL, fakeSrcRoot: fakeRootURL, sdksExclude: []) let result = appender.appendToBuildSettings(buildSettings: buildSettings, wrappers: binaries) let resultURL = try XCTUnwrap(result["XCRC_FAKE_SRCROOT"] as? String) @@ -55,7 +55,7 @@ class XcodeProjBuildSettingsIntegrateAppenderTests: XCTestCase { func testConsumerSettingFakeSrcRoot() throws { let mode: Mode = .consumer let fakeRootURL: URL = "/xxxxxxxxxxC" - let appender = XcodeProjBuildSettingsIntegrateAppender(mode: mode, repoRoot: rootURL, fakeSrcRoot: fakeRootURL) + let appender = XcodeProjBuildSettingsIntegrateAppender(mode: mode, repoRoot: rootURL, fakeSrcRoot: fakeRootURL, sdksExclude: []) let result = appender.appendToBuildSettings(buildSettings: buildSettings, wrappers: binaries) let resultURL: String = try XCTUnwrap(result["XCRC_FAKE_SRCROOT"] as? String) @@ -65,10 +65,30 @@ class XcodeProjBuildSettingsIntegrateAppenderTests: XCTestCase { func testConsumerSettingLdPlusPlus() throws { let mode: Mode = .consumer let fakeRootURL: URL = "/xxxxxxxxxxC" - let appender = XcodeProjBuildSettingsIntegrateAppender(mode: mode, repoRoot: rootURL, fakeSrcRoot: fakeRootURL) + let appender = XcodeProjBuildSettingsIntegrateAppender(mode: mode, repoRoot: rootURL, fakeSrcRoot: fakeRootURL, sdksExclude: []) let result = appender.appendToBuildSettings(buildSettings: buildSettings, wrappers: binaries) let ldPlusPlus: String = try XCTUnwrap(result["LDPLUSPLUS"] as? String) XCTAssertEqual(ldPlusPlus, binaries.ldplusplus.path) } + + func testSinglesdksExcludeIsAppended() throws { + let mode: Mode = .consumer + let appender = XcodeProjBuildSettingsIntegrateAppender(mode: mode, repoRoot: rootURL, fakeSrcRoot: "/", sdksExclude: ["watchOS*"]) + let result = appender.appendToBuildSettings(buildSettings: buildSettings, wrappers: binaries) + let ldPlusPlusWatchOS: String = try XCTUnwrap(result["LDPLUSPLUS[sdk=watchOS*]"] as? String) + + XCTAssertEqual(ldPlusPlusWatchOS, "") + } + + func testMultiplesdksExcludeAreAppended() throws { + let mode: Mode = .consumer + let appender = XcodeProjBuildSettingsIntegrateAppender(mode: mode, repoRoot: rootURL, fakeSrcRoot: "/", sdksExclude: ["watchOS*", "watchsimulator*"]) + let result = appender.appendToBuildSettings(buildSettings: buildSettings, wrappers: binaries) + let ldPlusPlusWatchOS: String = try XCTUnwrap(result["LDPLUSPLUS[sdk=watchOS*]"] as? String) + let ldPlusPlusWatchSimulator: String = try XCTUnwrap(result["LDPLUSPLUS[sdk=watchsimulator*]"] as? String) + + XCTAssertEqual(ldPlusPlusWatchOS, "") + XCTAssertEqual(ldPlusPlusWatchSimulator, "") + } }