diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index b31941ce..6e42466e 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -26,6 +26,7 @@ public class PBXProjGenerator { var targetBuildFileReferences: [String: String] = [:] var targetFileReferences: [String: String] = [:] var topLevelGroups: [PBXGroup] = [] + var carthageFrameworksByPlatform: [String: [String]] = [:] var ids = 0 var projectReference: String @@ -77,6 +78,18 @@ public class PBXProjGenerator { objects.append(.pbxGroup(productGroup)) topLevelGroups.append(productGroup) + if !carthageFrameworksByPlatform.isEmpty { + var platforms: [PBXGroup] = [] + for (platform, fileReferences) in carthageFrameworksByPlatform { + let platformGroup = PBXGroup(reference: id(), children: fileReferences, sourceTree: .group, name: platform, path: platform) + objects.append(.pbxGroup(platformGroup)) + platforms.append(platformGroup) + } + let carthageGroup = PBXGroup(reference: id(), children: platforms.referenceList, sourceTree: .group, name: "Carthage", path: "Carthage/Build") + objects.append(.pbxGroup(carthageGroup)) + topLevelGroups.append(carthageGroup) + } + let mainGroup = PBXGroup(reference: id(), children: topLevelGroups.referenceList, sourceTree: .group) objects.append(.pbxGroup(mainGroup)) @@ -149,6 +162,19 @@ public class PBXProjGenerator { case .system: //TODO: handle system frameworks break + case let .carthage(carthage): + if carthageFrameworksByPlatform[target.platform.rawValue] == nil { + carthageFrameworksByPlatform[target.platform.rawValue] = [] + } + let carthagePath: Path = "Carthage/Build" + let frameworkPath = carthagePath + target.platform.rawValue + carthage + let fileReference = getFileReference(path: frameworkPath) + + let buildFile = PBXBuildFile(reference: id(), fileRef: fileReference) + objects.append(.pbxBuildFile(buildFile)) + carthageFrameworksByPlatform[target.platform.rawValue]?.append(fileReference) + + frameworkFiles.append(buildFile.reference) } } @@ -231,6 +257,17 @@ public class PBXProjGenerator { return buildSettings } + func getFileReference(path: Path) -> String { + if let fileReference = fileReferencesByPath[path] { + return fileReference + } else { + let fileReference = PBXFileReference(reference: id(), sourceTree: .group, path: path.lastComponent) + objects.append(.pbxFileReference(fileReference)) + fileReferencesByPath[path] = fileReference.reference + return fileReference.reference + } + } + func getGroups(path: Path, groupReference: String, depth: Int = 0) throws -> (filePaths: [Path], groups: [PBXGroup]) { let directories = try path.children().filter { $0.isDirectory && $0.extension == nil && $0.extension != "lproj" } @@ -249,14 +286,8 @@ public class PBXProjGenerator { } for path in filePaths { - if let fileReference = fileReferencesByPath[path] { - groupChildren.append(fileReference) - } else { - let fileReference = PBXFileReference(reference: id(), sourceTree: .group, path: path.lastComponent) - objects.append(.pbxFileReference(fileReference)) - fileReferencesByPath[path] = fileReference.reference - groupChildren.append(fileReference.reference) - } + let fileReference = getFileReference(path: path) + groupChildren.append(fileReference) } for localisedDirectory in localisedDirectories { diff --git a/Sources/XcodeGenKit/Spec/Target.swift b/Sources/XcodeGenKit/Spec/Target.swift index 89c6c346..13a079a5 100644 --- a/Sources/XcodeGenKit/Spec/Target.swift +++ b/Sources/XcodeGenKit/Spec/Target.swift @@ -73,6 +73,7 @@ public enum Dependency { case target(String) case system(String) + case carthage(String) } @@ -83,6 +84,8 @@ extension Dependency: JSONObjectConvertible { self = .target(target) } else if let system: String = jsonDictionary.json(atKeyPath: "system") { self = .system(system) + } else if let carthage: String = jsonDictionary.json(atKeyPath: "carthage") { + self = .carthage(carthage) } else { throw SpecError.invalidDependency(jsonDictionary) }