Fixes issue with sticker pack targets generating redundant compile sources build phase

This commit is contained in:
Rogerio de Paula Assis
2019-01-15 22:57:22 -05:00
parent 4247532c3c
commit e6e8b58db4
2 changed files with 47 additions and 17 deletions
+7 -2
View File
@@ -665,8 +665,13 @@ public class PBXProjGenerator {
}
let sourcesBuildPhaseFiles = getBuildFilesForPhase(.sources)
let sourcesBuildPhase = addObject(PBXSourcesBuildPhase(files: sourcesBuildPhaseFiles))
buildPhases.append(sourcesBuildPhase)
// Sticker packs should not include a compile sources build phase as they
// are purely based on a set of image files, and nothing else.
let shouldSkipSourcesBuildPhase = sourcesBuildPhaseFiles.isEmpty && target.type == .stickerPack
if !shouldSkipSourcesBuildPhase {
let sourcesBuildPhase = addObject(PBXSourcesBuildPhase(files: sourcesBuildPhaseFiles))
buildPhases.append(sourcesBuildPhase)
}
buildPhases += try target.postCompileScripts.map { try generateBuildScript(targetName: target.name, buildScript: $0) }
@@ -552,7 +552,20 @@ class ProjectGeneratorTests: XCTestCase {
iosFrameworkB.filename,
])
let targets = [app, iosFrameworkZ, staticLibrary, resourceBundle, iosFrameworkA, iosFrameworkB, appTest, appTestWithoutTransitive]
let stickerPack = Target(
name: "MyStickerApp",
type: .stickerPack,
platform: .iOS,
dependencies: [
Dependency(type: .sdk, reference: "NotificationCenter.framework")
]
)
expectedResourceFiles[stickerPack.name] = nil
expectedLinkedFiles[stickerPack.name] = Set([
"NotificationCenter.framework"
])
let targets = [app, iosFrameworkZ, staticLibrary, resourceBundle, iosFrameworkA, iosFrameworkB, appTest, appTestWithoutTransitive, stickerPack]
let project = Project(
basePath: "",
@@ -566,19 +579,28 @@ class ProjectGeneratorTests: XCTestCase {
guard let nativeTarget = pbxProject.nativeTargets.first(where: { $0.name == target.name }) else {
throw failure("PBXNativeTarget for \(target) not found")
}
let buildPhases = nativeTarget.buildPhases
let resourcesPhases = pbxProject.resourcesBuildPhases.filter { buildPhases.contains($0) }
let frameworkPhases = pbxProject.frameworksBuildPhases.filter { buildPhases.contains($0) }
let copyFilesPhases = pbxProject.copyFilesBuildPhases.filter { buildPhases.contains($0) }
// ensure only the right resources are copies, no more, no less
let expectedResourceFiles = expectedResourceFiles[target.name]!
try expect(resourcesPhases.count) == (expectedResourceFiles.isEmpty ? 0 : 1)
if !expectedResourceFiles.isEmpty {
let resourceFiles = resourcesPhases[0].files
.compactMap { $0.file }
.map { $0.nameOrPath }
try expect(Set(resourceFiles)) == expectedResourceFiles
// All targets should have a compile sources phase,
// except for the sticker pack one
let sourcesPhases = pbxProject.sourcesBuildPhases
try expect(sourcesPhases.count) == targets.count - 1
// ensure only the right resources are copied, no more, no less
if let expectedResourceFiles = expectedResourceFiles[target.name] {
try expect(resourcesPhases.count) == (expectedResourceFiles.isEmpty ? 0 : 1)
if !expectedResourceFiles.isEmpty {
let resourceFiles = resourcesPhases[0].files
.compactMap { $0.file }
.map { $0.nameOrPath }
try expect(Set(resourceFiles)) == expectedResourceFiles
}
} else {
try expect(resourcesPhases.count) == 0
}
// ensure only the right things are linked, no more, no less
@@ -591,12 +613,15 @@ class ProjectGeneratorTests: XCTestCase {
}
// ensure only the right things are embedded, no more, no less
let expectedEmbeddedFrameworks = expectedEmbeddedFrameworks[target.name]!
try expect(copyFilesPhases.count) == (expectedEmbeddedFrameworks.isEmpty ? 0 : 1)
if !expectedEmbeddedFrameworks.isEmpty {
let copyFiles = copyFilesPhases[0].files
.compactMap { $0.file?.nameOrPath }
try expect(Set(copyFiles)) == expectedEmbeddedFrameworks
if let expectedEmbeddedFrameworks = expectedEmbeddedFrameworks[target.name] {
try expect(copyFilesPhases.count) == (expectedEmbeddedFrameworks.isEmpty ? 0 : 1)
if !expectedEmbeddedFrameworks.isEmpty {
let copyFiles = copyFilesPhases[0].files
.compactMap { $0.file?.nameOrPath }
try expect(Set(copyFiles)) == expectedEmbeddedFrameworks
}
} else {
try expect(copyFilesPhases.count) == 0
}
}
}