diff --git a/CHANGELOG.md b/CHANGELOG.md index 05073361..dbbf6d76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,11 +7,13 @@ - Added `includes` to `sources` for a Target. This follows the same glob-style as `excludes` but functions as a way to only include files that match a specified pattern. Useful if you only want a certain file type, for example specifying `**/*.swift`. [#637](https://github.com/yonaskolb/XcodeGen/pull/637) @bclymer - Support `dylib` SDK. [#650](https://github.com/yonaskolb/XcodeGen/pull/650) @kateinoigakukun - Added `language` and `region` options for `run` and `test` scheme [#654](https://github.com/yonaskolb/XcodeGen/pull/654) @kateinoigakukun +- Added `debugEnabled` option for `run` and `test` scheme [#657](https://github.com/yonaskolb/XcodeGen/pull/657) @kateinoigakukun - Support External Target Reference. [#655](https://github.com/yonaskolb/XcodeGen/pull/655) @kateinoigakukun #### Fixed - Expand template variable in Array of Any [#651](https://github.com/yonaskolb/XcodeGen/pull/651) @kateinoigakukun +- Significantly improve performance when running with a large number files. [#658](https://github.com/yonaskolb/XcodeGen/pull/658) @kateinoigakukun ## 2.7.0 diff --git a/Docs/ProjectSpec.md b/Docs/ProjectSpec.md index 3f887516..3aa78aaf 100644 --- a/Docs/ProjectSpec.md +++ b/Docs/ProjectSpec.md @@ -691,6 +691,7 @@ The different actions share some properties: - [ ] **disableMainThreadChecker**: **Bool** - `run` and `test` actions can define a boolean that indicates that this scheme should disable the Main Thread Checker. This defaults to false - [ ] **language**: **String** - `run` and `test` actions can define a language that is used for Application Language - [ ] **region**: **String** - `run` and `test` actions can define a language that is used for Application Region +- [ ] **debugEnabled**: **Bool** - `run` and `test` actions can define a whether debugger should be used. This defaults to true. ### Execution Action diff --git a/Sources/ProjectSpec/Scheme.swift b/Sources/ProjectSpec/Scheme.swift index 243bd5da..01558934 100644 --- a/Sources/ProjectSpec/Scheme.swift +++ b/Sources/ProjectSpec/Scheme.swift @@ -69,6 +69,7 @@ public struct Scheme: Equatable { public struct Run: BuildAction { public static let disableMainThreadCheckerDefault = false + public static let debugEnabledDefault = true public var config: String? public var commandLineArguments: [String: Bool] @@ -78,6 +79,7 @@ public struct Scheme: Equatable { public var disableMainThreadChecker: Bool public var language: String? public var region: String? + public var debugEnabled: Bool public init( config: String, @@ -87,7 +89,8 @@ public struct Scheme: Equatable { environmentVariables: [XCScheme.EnvironmentVariable] = [], disableMainThreadChecker: Bool = disableMainThreadCheckerDefault, language: String? = nil, - region: String? = nil + region: String? = nil, + debugEnabled: Bool = debugEnabledDefault ) { self.config = config self.commandLineArguments = commandLineArguments @@ -97,12 +100,14 @@ public struct Scheme: Equatable { self.disableMainThreadChecker = disableMainThreadChecker self.language = language self.region = region + self.debugEnabled = debugEnabled } } public struct Test: BuildAction { public static let gatherCoverageDataDefault = false public static let disableMainThreadCheckerDefault = false + public static let debugEnabledDefault = true public var config: String? public var gatherCoverageData: Bool @@ -114,6 +119,7 @@ public struct Scheme: Equatable { public var environmentVariables: [XCScheme.EnvironmentVariable] public var language: String? public var region: String? + public var debugEnabled: Bool public struct TestTarget: Equatable, ExpressibleByStringLiteral { public static let randomExecutionOrderDefault = false @@ -161,7 +167,8 @@ public struct Scheme: Equatable { postActions: [ExecutionAction] = [], environmentVariables: [XCScheme.EnvironmentVariable] = [], language: String? = nil, - region: String? = nil + region: String? = nil, + debugEnabled: Bool = debugEnabledDefault ) { self.config = config self.gatherCoverageData = gatherCoverageData @@ -173,6 +180,7 @@ public struct Scheme: Equatable { self.environmentVariables = environmentVariables self.language = language self.region = region + self.debugEnabled = debugEnabled } public var shouldUseLaunchSchemeArgsEnv: Bool { @@ -324,6 +332,7 @@ extension Scheme.Run: JSONObjectConvertible { disableMainThreadChecker = jsonDictionary.json(atKeyPath: "disableMainThreadChecker") ?? Scheme.Run.disableMainThreadCheckerDefault language = jsonDictionary.json(atKeyPath: "language") region = jsonDictionary.json(atKeyPath: "region") + debugEnabled = jsonDictionary.json(atKeyPath: "debugEnabled") ?? Scheme.Run.debugEnabledDefault } } @@ -343,6 +352,9 @@ extension Scheme.Run: JSONEncodable { dict["disableMainThreadChecker"] = disableMainThreadChecker } + if debugEnabled != Scheme.Run.debugEnabledDefault { + dict["debugEnabled"] = debugEnabled + } return dict } } @@ -372,6 +384,7 @@ extension Scheme.Test: JSONObjectConvertible { environmentVariables = try XCScheme.EnvironmentVariable.parseAll(jsonDictionary: jsonDictionary) language = jsonDictionary.json(atKeyPath: "language") region = jsonDictionary.json(atKeyPath: "region") + debugEnabled = jsonDictionary.json(atKeyPath: "debugEnabled") ?? Scheme.Test.debugEnabledDefault } } @@ -396,6 +409,10 @@ extension Scheme.Test: JSONEncodable { dict["disableMainThreadChecker"] = disableMainThreadChecker } + if debugEnabled != Scheme.Run.debugEnabledDefault { + dict["debugEnabled"] = debugEnabled + } + return dict } } diff --git a/Sources/XcodeGenKit/SchemeGenerator.swift b/Sources/XcodeGenKit/SchemeGenerator.swift index e9f2bddf..6325afc0 100644 --- a/Sources/XcodeGenKit/SchemeGenerator.swift +++ b/Sources/XcodeGenKit/SchemeGenerator.swift @@ -161,6 +161,7 @@ public class SchemeGenerator { testables: testables, preActions: scheme.test?.preActions.map(getExecutionAction) ?? [], postActions: scheme.test?.postActions.map(getExecutionAction) ?? [], + selectedDebuggerIdentifier: (scheme.test?.debugEnabled ?? Scheme.Test.debugEnabledDefault) ? XCScheme.defaultDebugger : "", shouldUseLaunchSchemeArgsEnv: scheme.test?.shouldUseLaunchSchemeArgsEnv ?? true, codeCoverageEnabled: scheme.test?.gatherCoverageData ?? Scheme.Test.gatherCoverageDataDefault, disableMainThreadChecker: scheme.test?.disableMainThreadChecker ?? Scheme.Test.disableMainThreadCheckerDefault, @@ -176,6 +177,8 @@ public class SchemeGenerator { preActions: scheme.run?.preActions.map(getExecutionAction) ?? [], postActions: scheme.run?.postActions.map(getExecutionAction) ?? [], macroExpansion: shouldExecuteOnLaunch ? nil : buildableReference, + selectedDebuggerIdentifier: (scheme.run?.debugEnabled ?? Scheme.Run.debugEnabledDefault) ? XCScheme.defaultDebugger : "", + selectedLauncherIdentifier: (scheme.run?.debugEnabled ?? Scheme.Run.debugEnabledDefault) ? XCScheme.defaultLauncher : "Xcode.IDEFoundation.Launcher.PosixSpawn", disableMainThreadChecker: scheme.run?.disableMainThreadChecker ?? Scheme.Run.disableMainThreadCheckerDefault, commandlineArguments: launchCommandLineArgs, environmentVariables: launchVariables, diff --git a/Sources/XcodeGenKit/SourceGenerator.swift b/Sources/XcodeGenKit/SourceGenerator.swift index 7d99f59b..35e1ab3b 100644 --- a/Sources/XcodeGenKit/SourceGenerator.swift +++ b/Sources/XcodeGenKit/SourceGenerator.swift @@ -242,12 +242,15 @@ class SourceGenerator { let groupReference: PBXGroup if let cachedGroup = groupsByPath[path] { + var cachedGroupChildren = cachedGroup.children for child in children { // only add the children that aren't already in the cachedGroup - if !cachedGroup.children.contains(child) { - cachedGroup.children.append(child) + // Check equality by path and sourceTree because XcodeProj.PBXObject.== is very slow. + if !cachedGroupChildren.contains(where: { $0.path == child.path && $0.sourceTree == child.sourceTree }) { + cachedGroupChildren.append(child) } } + cachedGroup.children = cachedGroupChildren groupReference = cachedGroup } else { diff --git a/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift b/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift index 9d828fd4..3299faed 100644 --- a/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift @@ -87,6 +87,9 @@ class SchemeGeneratorTests: XCTestCase { try expect(xcscheme.profileAction?.buildConfiguration) == "Release" try expect(xcscheme.analyzeAction?.buildConfiguration) == "Debug" try expect(xcscheme.archiveAction?.buildConfiguration) == "Release" + + try expect(xcscheme.launchAction?.selectedDebuggerIdentifier) == XCScheme.defaultDebugger + try expect(xcscheme.testAction?.selectedDebuggerIdentifier) == XCScheme.defaultDebugger } $0.it("sets environment variables for a scheme") { @@ -174,6 +177,27 @@ class SchemeGeneratorTests: XCTestCase { try expect(xcscheme.profileAction?.environmentVariables) == variables } + $0.it("generate scheme without debugger") { + let scheme = Scheme( + name: "TestScheme", + build: Scheme.Build(targets: [buildTarget]), + run: Scheme.Run(config: "Debug", debugEnabled: false) + ) + let project = Project( + name: "test", + targets: [app, framework], + schemes: [scheme] + ) + let xcodeProject = try project.generateXcodeProject() + + guard let xcscheme = xcodeProject.sharedData?.schemes.first else { + throw failure("Scheme not found") + } + + try expect(xcscheme.launchAction?.selectedDebuggerIdentifier) == "" + try expect(xcscheme.launchAction?.selectedLauncherIdentifier) == "Xcode.IDEFoundation.Launcher.PosixSpawn" + } + $0.it("generates pre and post actions for target schemes") { var target = app target.scheme = TargetScheme(