From 739b9f36f70bc6c47711ef44473d0b2eac398326 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Mon, 16 Oct 2017 18:18:28 -0700 Subject: [PATCH 1/3] Link framework and library dependencies --- .../GeneratedProject.xcodeproj/project.pbxproj | 2 ++ Sources/ProjectSpec/ProjectExtensions.swift | 8 ++++++++ Sources/XcodeGenKit/PBXProjGenerator.swift | 13 ++++++++----- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Fixtures/TestProject/GeneratedProject.xcodeproj/project.pbxproj b/Fixtures/TestProject/GeneratedProject.xcodeproj/project.pbxproj index e5c2a476..ce7e60b9 100644 --- a/Fixtures/TestProject/GeneratedProject.xcodeproj/project.pbxproj +++ b/Fixtures/TestProject/GeneratedProject.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ BF3862341101 /* MyFramework.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR2993497801 /* MyFramework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; BF5986511201 = {isa = PBXBuildFile; fileRef = FR6523263101 /* TestProject.app */; }; BF6182896901 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR9215298301 /* Result.framework */; }; + BF7015992001 /* MyFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR2993497801 /* MyFramework.framework */; }; BF9001417701 /* TestProjectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR6877173101 /* TestProjectTests.swift */; }; BF9155249601 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR7078510801 /* FrameworkFile.swift */; }; /* End PBXBuildFile section */ @@ -80,6 +81,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BF7015992001 /* MyFramework.framework in Frameworks */, BF6182896901 /* Result.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Sources/ProjectSpec/ProjectExtensions.swift b/Sources/ProjectSpec/ProjectExtensions.swift index eedb2c79..93317b58 100644 --- a/Sources/ProjectSpec/ProjectExtensions.swift +++ b/Sources/ProjectSpec/ProjectExtensions.swift @@ -46,6 +46,14 @@ extension PBXProductType { } } + public var isFramework: Bool { + return self == .framework + } + + public var isLibrary: Bool { + return self == .staticLibrary || self == .dynamicLibrary + } + public var isExtension: Bool { return fileExtension == "appex" } diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index fa8764f1..f0f9e9f4 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -25,7 +25,7 @@ public class PBXProjGenerator { var variantGroupsByPath: [Path: PBXVariantGroup] = [:] var targetNativeReferences: [String: String] = [:] - var targetBuildFileReferences: [String: String] = [:] + var targetBuildFiles: [String: PBXBuildFile] = [:] var targetFileReferences: [String: String] = [:] var topLevelGroups: [PBXGroup] = [] var carthageFrameworksByPlatform: [String: [String]] = [:] @@ -93,7 +93,7 @@ public class PBXProjGenerator { let buildFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, fileReference.reference), fileRef: fileReference.reference) addObject(buildFile) - targetBuildFileReferences[target.name] = buildFile.reference + targetBuildFiles[target.name] = buildFile } let targets = try spec.targets.map(generateTarget) @@ -249,9 +249,12 @@ public class PBXProjGenerator { addObject(targetDependency) dependencies.append(targetDependency.reference) - // don't bother linking a target dependency - // let dependencyBuildFile = targetBuildFileReferences[dependencyTargetName]! - // targetFrameworkBuildFiles.append(dependencyBuildFile) + if dependencyTarget.type.isLibrary || dependencyTarget.type.isFramework { + let dependencyBuildFile = targetBuildFiles[dependencyTargetName]! + let buildFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, dependencyBuildFile.reference + target.name), fileRef: dependencyBuildFile.fileRef) + addObject(buildFile) + targetFrameworkBuildFiles.append(buildFile.reference) + } if embed { let embedSettings = dependency.buildSettings From 5c90d6189c12b1a55f895023d3c249c21d693ee8 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Mon, 16 Oct 2017 18:18:46 -0700 Subject: [PATCH 2/3] Don't copy libraries These should only be linked. If we add a library to the project here, Xcode will remove it next time it touches the project --- Sources/XcodeGenKit/PBXProjGenerator.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index f0f9e9f4..99dd66e9 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -256,7 +256,8 @@ public class PBXProjGenerator { targetFrameworkBuildFiles.append(buildFile.reference) } - if embed { + if embed && !dependencyTarget.type.isLibrary { + let embedSettings = dependency.buildSettings let embedFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, dependencyFileReference + target.name), fileRef: dependencyFileReference, settings: embedSettings) addObject(embedFile) From 894f00428acef143037cbe8dec88226f48bb79ad Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 17 Oct 2017 10:09:22 -0700 Subject: [PATCH 3/3] Add tests for PBXProductType booleans --- Tests/LinuxMain.swift | 1 + Tests/XcodeGenKitTests/ProjectSpecTests.swift | 28 +++++++++++++++++++ Tests/XcodeGenKitTests/XCTest.swift | 1 + 3 files changed, 30 insertions(+) create mode 100644 Tests/XcodeGenKitTests/ProjectSpecTests.swift diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift index 9df44975..7d5c97d1 100644 --- a/Tests/LinuxMain.swift +++ b/Tests/LinuxMain.swift @@ -5,4 +5,5 @@ XCTMain([ testCase(GeneratorTests.allTests), testCase(SpecLoadingTests.allTests), testCase(FixtureTests.allTests), + testCase(ProjectSpecTests.allTests), ]) diff --git a/Tests/XcodeGenKitTests/ProjectSpecTests.swift b/Tests/XcodeGenKitTests/ProjectSpecTests.swift new file mode 100644 index 00000000..ae5ec8ad --- /dev/null +++ b/Tests/XcodeGenKitTests/ProjectSpecTests.swift @@ -0,0 +1,28 @@ +import Spectre +import XcodeGenKit +import xcproj +import ProjectSpec + +func projectSpecTests() { + + describe("ProjectSpec") { + + let framework = Target(name: "MyFramework", type: .framework, platform: .iOS, + settings: Settings(buildSettings: ["SETTING_2": "VALUE"])) + let staticLibrary = Target(name: "MyStaticLibrary", type: .staticLibrary, platform: .iOS, + settings: Settings(buildSettings: ["SETTING_2": "VALUE"])) + let dynamicLibrary = Target(name: "MyDynamicLibrary", type: .dynamicLibrary, platform: .iOS, + settings: Settings(buildSettings: ["SETTING_2": "VALUE"])) + + $0.describe("Types") { + $0.it("is a framework when it has the right extension") { + try expect(framework.type.isFramework).to.beTrue() + } + + $0.it("is a library when it has the right type") { + try expect(staticLibrary.type.isLibrary).to.beTrue() + try expect(dynamicLibrary.type.isLibrary).to.beTrue() + } + } + } +} diff --git a/Tests/XcodeGenKitTests/XCTest.swift b/Tests/XcodeGenKitTests/XCTest.swift index cb066129..e989d4bc 100644 --- a/Tests/XcodeGenKitTests/XCTest.swift +++ b/Tests/XcodeGenKitTests/XCTest.swift @@ -7,5 +7,6 @@ class XCodeGenKitTests: XCTestCase { projectGeneratorTests() specLoadingTests() fixtureTests() + projectSpecTests() } }