Merge pull request #345 from brentleyjones/modulemap

Add support for Copy Files build phase
This commit is contained in:
Brentley Jones
2018-07-31 08:01:58 -05:00
committed by GitHub
9 changed files with 169 additions and 22 deletions
+32 -2
View File
@@ -590,9 +590,8 @@ public class PBXProjGenerator {
let fileReference = targetFileReferences[target.name]
var buildPhases: [String] = []
func getBuildFilesForPhase(_ buildPhase: BuildPhase) -> [String] {
func getBuildFilesForSourceFiles(_ sourceFiles: [SourceFile]) -> [String] {
let files = sourceFiles
.filter { $0.buildPhase == buildPhase }
.reduce(into: [SourceFile]()) { output, sourceFile in
if !output.contains(where: { $0.fileReference == sourceFile.fileReference }) {
output.append(sourceFile)
@@ -602,6 +601,21 @@ public class PBXProjGenerator {
return files.map { createObject(id: $0.fileReference + target.name, $0.buildFile) }
.map { $0.reference }
}
func getBuildFilesForPhase(_ buildPhase: BuildPhase) -> [String] {
let filteredSourceFiles = sourceFiles
.filter { $0.buildPhase?.buildPhase == buildPhase }
return getBuildFilesForSourceFiles(filteredSourceFiles)
}
func getBuildFilesForCopyFilesPhases() -> [TargetSource.BuildPhase.CopyFilesSettings: [String]] {
var sourceFilesByCopyFiles: [TargetSource.BuildPhase.CopyFilesSettings: [SourceFile]] = [:]
for sourceFile in sourceFiles {
guard case let .copyFiles(copyFilesSettings)? = sourceFile.buildPhase else { continue }
sourceFilesByCopyFiles[copyFilesSettings, default: []].append(sourceFile)
}
return sourceFilesByCopyFiles.mapValues { getBuildFilesForSourceFiles($0) }
}
buildPhases += try target.prebuildScripts.map { try generateBuildScript(targetName: target.name, buildScript: $0) }
@@ -614,6 +628,22 @@ public class PBXProjGenerator {
let resourcesBuildPhase = createObject(id: target.name, PBXResourcesBuildPhase(files: resourcesBuildPhaseFiles))
buildPhases.append(resourcesBuildPhase.reference)
}
let copyFilesBuildPhasesFiles = getBuildFilesForCopyFilesPhases()
if !copyFilesBuildPhasesFiles.isEmpty {
for (copyFiles, buildPhaseFiles) in copyFilesBuildPhasesFiles {
let copyFilesBuildPhase = createObject(
id: "copy files" + copyFiles.destination.rawValue + copyFiles.subpath + target.name,
PBXCopyFilesBuildPhase(
dstPath: copyFiles.subpath,
dstSubfolderSpec: copyFiles.destination.destination,
files: buildPhaseFiles
)
)
buildPhases.append(copyFilesBuildPhase.reference)
}
}
let headersBuildPhaseFiles = getBuildFilesForPhase(.headers)
if !headersBuildPhaseFiles.isEmpty && (target.type == .framework || target.type == .dynamicLibrary) {
+7 -7
View File
@@ -7,7 +7,7 @@ struct SourceFile {
let path: Path
let fileReference: String
let buildFile: PBXBuildFile
let buildPhase: BuildPhase?
let buildPhase: TargetSource.BuildPhase?
}
class SourceGenerator {
@@ -52,15 +52,15 @@ class SourceGenerator {
_ = try getSourceFiles(targetSource: TargetSource(path: path), path: fullPath)
}
func generateSourceFile(targetSource: TargetSource, path: Path, buildPhase: BuildPhase? = nil) -> SourceFile {
func generateSourceFile(targetSource: TargetSource, path: Path, buildPhase: TargetSource.BuildPhase? = nil) -> SourceFile {
let fileReference = fileReferencesByPath[path.string.lowercased()]!
var settings: [String: Any] = [:]
let chosenBuildPhase: BuildPhase?
let chosenBuildPhase: TargetSource.BuildPhase?
if let buildPhase = buildPhase {
chosenBuildPhase = buildPhase
} else if let buildPhase = targetSource.buildPhase {
chosenBuildPhase = buildPhase.buildPhase
chosenBuildPhase = buildPhase
} else {
chosenBuildPhase = getDefaultBuildPhase(for: path)
}
@@ -156,7 +156,7 @@ class SourceGenerator {
}
/// returns a default build phase for a given path. This is based off the filename
private func getDefaultBuildPhase(for path: Path) -> BuildPhase? {
private func getDefaultBuildPhase(for path: Path) -> TargetSource.BuildPhase? {
if path.lastComponent == "Info.plist" {
return nil
}
@@ -424,9 +424,9 @@ class SourceGenerator {
rootGroups.insert(fileReference)
}
let buildPhase: BuildPhase?
let buildPhase: TargetSource.BuildPhase?
if let targetBuildPhase = targetSource.buildPhase {
buildPhase = targetBuildPhase.buildPhase
buildPhase = targetBuildPhase
} else {
buildPhase = .resources
}