From e6e8b58db4a77fb8a29c64de4022e32da549138d Mon Sep 17 00:00:00 2001 From: Rogerio de Paula Assis Date: Tue, 15 Jan 2019 21:23:25 -0500 Subject: [PATCH] Fixes issue with sticker pack targets generating redundant compile sources build phase --- Sources/XcodeGenKit/PBXProjGenerator.swift | 9 ++- .../ProjectGeneratorTests.swift | 55 ++++++++++++++----- 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 9c3292ac..661c1d68 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -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) } diff --git a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift index 48b45771..89b523d1 100644 --- a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift @@ -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 } } }