diff --git a/CHANGELOG.md b/CHANGELOG.md index 99af2b18..442d2c59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,8 @@ - Add an ability to set an order of groups with `options.groupOrdering` [#613](https://github.com/yonaskolb/XcodeGen/pull/613) @Beniamiiin - Add `staticBinary` linkType for Carthage dependency [#847](https://github.com/yonaskolb/XcodeGen/pull/847) @d-date - Add the ability to output a dependency graph in graphviz format [#852](https://github.com/yonaskolb/XcodeGen/pull/852) @jeffctown -- Adds uncluttering the project manifest dumped to YAML from empty values [#858](https://github.com/yonaskolb/XcodeGen/pull/858) @paciej00 - +- Adds uncluttering the project manifest dumped to YAML from empty values [#858](https://github.com/yonaskolb/XcodeGen/pull/858) @paciej00 +- Added ability to name the executable target when declaring schemes. [#866](https://github.com/yonaskolb/XcodeGen/pull/866) @elland #### Fixed diff --git a/Sources/ProjectSpec/Scheme.swift b/Sources/ProjectSpec/Scheme.swift index 4584975f..55d36ef3 100644 --- a/Sources/ProjectSpec/Scheme.swift +++ b/Sources/ProjectSpec/Scheme.swift @@ -73,19 +73,23 @@ public struct Scheme: Equatable { public static let parallelizeBuildDefault = true public static let buildImplicitDependenciesDefault = true + public var executableName: String? public var targets: [BuildTarget] public var parallelizeBuild: Bool public var buildImplicitDependencies: Bool public var preActions: [ExecutionAction] public var postActions: [ExecutionAction] + public init( targets: [BuildTarget], + executableName: String? = nil, parallelizeBuild: Bool = parallelizeBuildDefault, buildImplicitDependencies: Bool = buildImplicitDependenciesDefault, preActions: [ExecutionAction] = [], postActions: [ExecutionAction] = [] ) { self.targets = targets + self.executableName = executableName self.parallelizeBuild = parallelizeBuild self.buildImplicitDependencies = buildImplicitDependencies self.preActions = preActions @@ -605,6 +609,7 @@ extension Scheme.Build: JSONObjectConvertible { targets.append(Scheme.BuildTarget(target: target, buildTypes: buildTypes)) } self.targets = targets.sorted { $0.target.name < $1.target.name } + self.executableName = jsonDictionary.json(atKeyPath: "executable") preActions = try jsonDictionary.json(atKeyPath: "preActions")?.map(Scheme.ExecutionAction.init) ?? [] postActions = try jsonDictionary.json(atKeyPath: "postActions")?.map(Scheme.ExecutionAction.init) ?? [] parallelizeBuild = jsonDictionary.json(atKeyPath: "parallelizeBuild") ?? Scheme.Build.parallelizeBuildDefault diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 6e8c3df7..fc177716 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -652,7 +652,7 @@ public class PBXProjGenerator { var packageDependencies: [XCSwiftPackageProductDependency] = [] var extensions: [PBXBuildFile] = [] var carthageFrameworksToEmbed: [String] = [] - var localPackageReferences: [String] = project.packages.compactMap { $0.value.isLocal ? $0.key : nil } + let localPackageReferences: [String] = project.packages.compactMap { $0.value.isLocal ? $0.key : nil } let targetDependencies = (target.transitivelyLinkDependencies ?? project.options.transitivelyLinkDependencies) ? getAllDependenciesPlusTransitiveNeedingEmbedding(target: target) : target.dependencies diff --git a/Sources/XcodeGenKit/SchemeGenerator.swift b/Sources/XcodeGenKit/SchemeGenerator.swift index d6cd89c2..d9f308ec 100644 --- a/Sources/XcodeGenKit/SchemeGenerator.swift +++ b/Sources/XcodeGenKit/SchemeGenerator.swift @@ -161,10 +161,17 @@ public class SchemeGenerator { return XCScheme.ExecutionAction(scriptText: action.script, title: action.name, environmentBuildable: environmentBuildable) } - let schemeTarget = target ?? project.getTarget(scheme.build.targets.first!.target.name) + let schemeTarget: Target? + + if let targetName = scheme.build.executableName { + schemeTarget = project.getTarget(targetName) + } else { + schemeTarget = target ?? project.getTarget(scheme.build.targets.first!.target.name) + } + let shouldExecuteOnLaunch = schemeTarget?.shouldExecuteOnLaunch == true - let buildableReference = buildActionEntries.first!.buildableReference + let buildableReference = buildActionEntries.first(where: { $0.buildableReference.blueprintName == schemeTarget?.name })?.buildableReference ?? buildActionEntries.first!.buildableReference let runnables = makeProductRunnables(for: schemeTarget, buildableReference: buildableReference) let buildAction = XCScheme.BuildAction(