Skip to content

Commit

Permalink
Merge pull request #19 from yonaskolb/feature/extensions
Browse files Browse the repository at this point in the history
Extension support
  • Loading branch information
yonaskolb authored Aug 3, 2017
2 parents e2fd4eb + 1d0e310 commit d5523ad
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 50 deletions.
31 changes: 6 additions & 25 deletions Fixtures/TestProject/GeneratedProject.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,14 @@
objects = {

/* Begin PBXBuildFile section */
BF1073850101 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR1332263601 /* AppDelegate.swift */; settings = {}; };
BF1744565901 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR6218091901 /* ViewController.swift */; settings = {}; };
BF1073850101 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR1332263601 /* AppDelegate.swift */; };
BF1744565901 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR6218091901 /* ViewController.swift */; };
BF2753556301 /* MyFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR2993497801 /* MyFramework.framework */; };
BF2753556301 /* MyFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR2993497801 /* MyFramework.framework */; };
BF3154421201 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR5980633301 /* Assets.xcassets */; settings = {}; };
BF3154421201 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR5980633301 /* Assets.xcassets */; };
BF3515549501 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };
BF3862341101 = {isa = PBXBuildFile; fileRef = FR2993497801 /* MyFramework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
BF5986511201 = {isa = PBXBuildFile; fileRef = FR6523263101 /* TestProject.app */; };
BF9155249601 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR7078510801 /* FrameworkFile.swift */; settings = {}; };
BF9155249601 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR7078510801 /* FrameworkFile.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand All @@ -29,16 +28,7 @@
/* End PBXContainerItemProxy section */

/* Begin PBXCopyFilesBuildPhase section */
CFBP29934901 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
CFBP65232601 /* CopyFiles */ = {
CFBP50493301 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
Expand All @@ -65,13 +55,6 @@
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
FBP299349701 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
FBP652326301 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
Expand Down Expand Up @@ -154,8 +137,6 @@
SBP299349701 /* Sources */,
RBP299349701 /* Resources */,
HBP299349701 /* Headers */,
FBP299349701 /* Frameworks */,
CFBP29934901 /* Copy Files */,
SSBP30211001 /* Run Script */,
);
buildRules = (
Expand All @@ -174,7 +155,7 @@
RBP652326301 /* Resources */,
HBP652326301 /* Headers */,
FBP652326301 /* Frameworks */,
CFBP65232601 /* Copy Files */,
CFBP50493301 /* Copy Files */,
SSBP46803701 /* Run Script */,
);
buildRules = (
Expand Down
8 changes: 8 additions & 0 deletions Sources/ProjectSpec/ProjectExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,12 @@ extension PBXProductType {
return nil
}
}

public var isExtension: Bool {
return fileExtension == "appex"
}

public var isApp: Bool {
return fileExtension == "app"
}
}
86 changes: 61 additions & 25 deletions Sources/XcodeGenKit/PBXProjGenerator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,9 @@ public class PBXProjGenerator {

func generateSourceFile(path: Path) -> SourceFile {
let fileReference = fileReferencesByPath[path]!
var settings: [String: Any] = [:]
var settings: [String: Any]?
if getBuildPhaseForPath(path) == .headers {
settings["ATTRIBUTES"] = ["Public"]
settings = ["ATTRIBUTES": ["Public"]]
}
let buildFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, fileReference), fileRef: fileReference, settings: settings)
objects.append(.pbxBuildFile(buildFile))
Expand Down Expand Up @@ -158,25 +158,41 @@ public class PBXProjGenerator {
var dependancies: [String] = []
var targetFrameworkBuildFiles: [String] = []
var copyFiles: [String] = []
var extensions: [String] = []

for dependancy in target.dependencies {
switch dependancy {
case let .target(dependencyTarget):
let targetProxy = PBXContainerItemProxy(reference: generateUUID(PBXContainerItemProxy.self, target.name), containerPortal: projectReference, remoteGlobalIDString: targetNativeReferences[dependencyTarget]!, proxyType: .nativeTarget, remoteInfo: dependencyTarget)
let targetDependancy = PBXTargetDependency(reference: generateUUID(PBXTargetDependency.self, dependencyTarget + target.name), target: targetNativeReferences[dependencyTarget]!, targetProxy: targetProxy.reference)
case let .target(dependencyTargetName):
guard let dependencyTarget = spec.getTarget(dependencyTargetName) else { continue }
let dependencyFileReference = targetFileReferences[dependencyTargetName]!

let targetProxy = PBXContainerItemProxy(reference: generateUUID(PBXContainerItemProxy.self, target.name), containerPortal: projectReference, remoteGlobalIDString: targetNativeReferences[dependencyTargetName]!, proxyType: .nativeTarget, remoteInfo: dependencyTargetName)
let targetDependancy = PBXTargetDependency(reference: generateUUID(PBXTargetDependency.self, dependencyTargetName + target.name), target: targetNativeReferences[dependencyTargetName]!, targetProxy: targetProxy.reference)

objects.append(.pbxContainerItemProxy(targetProxy))
objects.append(.pbxTargetDependency(targetDependancy))
dependancies.append(targetDependancy.reference)

let dependencyBuildFile = targetBuildFileReferences[dependencyTarget]!
let dependencyBuildFile = targetBuildFileReferences[dependencyTargetName]!
// link
targetFrameworkBuildFiles.append(dependencyBuildFile)

// embed
let embedSettings: [String: Any] = ["ATTRIBUTES": ["CodeSignOnCopy", "RemoveHeadersOnCopy"]]
let embedFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, targetFileReferences[dependencyTarget]! + target.name), fileRef: targetFileReferences[dependencyTarget]!, settings: embedSettings)
objects.append(.pbxBuildFile(embedFile))
copyFiles.append(embedFile.reference)
if target.type.isApp {
if dependencyTarget.type.isExtension {
// embed app extensions
let embedSettings: [String: Any] = ["ATTRIBUTES": ["RemoveHeadersOnCopy"]]
let embedFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, dependencyFileReference + target.name), fileRef: dependencyFileReference, settings: embedSettings)
objects.append(.pbxBuildFile(embedFile))
extensions.append(embedFile.reference)
} else {
// embed frameworks
let embedSettings: [String: Any] = ["ATTRIBUTES": ["CodeSignOnCopy", "RemoveHeadersOnCopy"]]
let embedFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, dependencyFileReference + target.name), fileRef: dependencyFileReference, settings: embedSettings)
objects.append(.pbxBuildFile(embedFile))
copyFiles.append(embedFile.reference)
}
}

case let .framework(framework):
let fileReference = getFileReference(path: Path(framework), inPath: basePath)
let buildFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, fileReference + target.name), fileRef: fileReference)
Expand Down Expand Up @@ -212,13 +228,6 @@ public class PBXProjGenerator {
let fileReference = targetFileReferences[target.name]!
var buildPhases: [String] = []

if target.type == .framework {
let buildFile = PBXBuildFile(reference: targetBuildFileReferences[target.name]!, fileRef: fileReference)
objects.append(.pbxBuildFile(buildFile))
}

// TODO: don't generate build files for files that won't be built

func getBuildFilesForPhase(_ buildPhase: BuildPhase) -> Set<String> {
let files = sourceFilePaths.filter { getBuildPhaseForPath($0) == buildPhase }.map(generateSourceFile)
return Set(files.map { $0.buildFile.reference })
Expand Down Expand Up @@ -262,15 +271,42 @@ public class PBXProjGenerator {
objects.append(.pbxHeadersBuildPhase(headersBuildPhase))
buildPhases.append(headersBuildPhase.reference)

let frameworkBuildPhase = PBXFrameworksBuildPhase(reference: generateUUID(PBXFrameworksBuildPhase.self, target.name), files: Set(targetFrameworkBuildFiles), runOnlyForDeploymentPostprocessing: 0)
objects.append(.pbxFrameworksBuildPhase(frameworkBuildPhase))
buildPhases.append(frameworkBuildPhase.reference)
if !targetFrameworkBuildFiles.isEmpty {

let frameworkBuildPhase = PBXFrameworksBuildPhase(
reference: generateUUID(PBXFrameworksBuildPhase.self, target.name),
files: Set(targetFrameworkBuildFiles),
runOnlyForDeploymentPostprocessing: 0)

let copyFilesPhase = PBXCopyFilesBuildPhase(reference: generateUUID(PBXCopyFilesBuildPhase.self, target.name), dstPath: "", dstSubfolderSpec: .frameworks, files: Set(copyFiles))
objects.append(.pbxCopyFilesBuildPhase(copyFilesPhase))
buildPhases.append(copyFilesPhase.reference)
objects.append(.pbxFrameworksBuildPhase(frameworkBuildPhase))
buildPhases.append(frameworkBuildPhase.reference)
}

if !extensions.isEmpty {

let copyFilesPhase = PBXCopyFilesBuildPhase(
reference: generateUUID(PBXCopyFilesBuildPhase.self, "embed app extensions" + target.name),
dstPath: "",
dstSubfolderSpec: .plugins,
files: Set(extensions))

objects.append(.pbxCopyFilesBuildPhase(copyFilesPhase))
buildPhases.append(copyFilesPhase.reference)
}

if !copyFiles.isEmpty {

let copyFilesPhase = PBXCopyFilesBuildPhase(
reference: generateUUID(PBXCopyFilesBuildPhase.self, "embed frameworks" + target.name),
dstPath: "",
dstSubfolderSpec: .frameworks,
files: Set(copyFiles))

objects.append(.pbxCopyFilesBuildPhase(copyFilesPhase))
buildPhases.append(copyFilesPhase.reference)
}

if target.type == .application {
if target.type.isApp {
func getCarthageFrameworks(target: Target) -> [String] {
var frameworks: [String] = []
for dependency in target.dependencies {
Expand Down

0 comments on commit d5523ad

Please sign in to comment.