Added support for dependency destination specification. (Resolves #1038) (#1039)

* Added support for dependency destination specification. (Resolves #1038)

* More generic way covering more different dependency types. (#1038)

* Added unit-test for each possible dependency combination. First test current embeding then the new one with custom copy spec. (#1038)

* Review fixes. (#1038)

* Minimized unit-test boiler-plate (#1038)

* Update CHANGELOG.md

Co-authored-by: Jakub Bednář <jakub.bednar@avast.com>
Co-authored-by: Yonas Kolb <yonaskolb@users.noreply.github.com>
This commit is contained in:
Jakub Bednar
2021-07-15 12:10:34 +10:00
committed by GitHub
co-authored by Jakub Bednář Yonas Kolb
parent e2f062b6be
commit d35d22f08b
8 changed files with 1522 additions and 11 deletions
+61 -6
View File
@@ -662,6 +662,7 @@ public class PBXProjGenerator {
var dependencies: [PBXTargetDependency] = []
var targetFrameworkBuildFiles: [PBXBuildFile] = []
var frameworkBuildPaths = Set<String>()
var customCopyDependenciesReferences: [PBXBuildFile] = []
var copyFilesBuildPhasesFiles: [BuildPhaseSpec.CopyFilesSettings: [PBXBuildFile]] = [:]
var copyFrameworksReferences: [PBXBuildFile] = []
var copyResourcesReferences: [PBXBuildFile] = []
@@ -689,7 +690,11 @@ public class PBXProjGenerator {
if dependency.removeHeaders {
embedAttributes.append("RemoveHeadersOnCopy")
}
return ["ATTRIBUTES": embedAttributes]
var retval: [String:Any] = ["ATTRIBUTES": embedAttributes]
if let copyPhase = dependency.copyPhase {
retval["COPY_PHASE"] = copyPhase
}
return retval
}
func getDependencyFrameworkSettings(dependency: Dependency) -> [String: Any]? {
@@ -727,7 +732,10 @@ public class PBXProjGenerator {
pbxBuildFile.platformFilter = platform
let embedFile = addObject(pbxBuildFile)
if dependencyTarget.type.isExtension {
if dependency.copyPhase != nil {
// custom copy takes precedence
customCopyDependenciesReferences.append(embedFile)
} else if dependencyTarget.type.isExtension {
// embed app extension
extensions.append(embedFile)
} else if dependencyTarget.type.isSystemExtension {
@@ -807,7 +815,12 @@ public class PBXProjGenerator {
let pbxBuildFile = PBXBuildFile(file: fileReference, settings: getEmbedSettings(dependency: dependency, codeSign: dependency.codeSign ?? true))
pbxBuildFile.platformFilter = platform
let embedFile = addObject(pbxBuildFile)
copyFrameworksReferences.append(embedFile)
if dependency.copyPhase != nil {
customCopyDependenciesReferences.append(embedFile)
} else {
copyFrameworksReferences.append(embedFile)
}
}
case .sdk(let root):
@@ -858,7 +871,12 @@ public class PBXProjGenerator {
let pbxBuildFile = PBXBuildFile(file: fileReference, settings: getEmbedSettings(dependency: dependency, codeSign: dependency.codeSign ?? true))
pbxBuildFile.platformFilter = platform
let embedFile = addObject(pbxBuildFile)
copyFrameworksReferences.append(embedFile)
if dependency.copyPhase != nil {
customCopyDependenciesReferences.append(embedFile)
} else {
copyFrameworksReferences.append(embedFile)
}
}
case .carthage(let findFrameworks, let linkType):
@@ -923,7 +941,12 @@ public class PBXProjGenerator {
settings: getEmbedSettings(dependency: dependency, codeSign: dependency.codeSign ?? true))
pbxBuildFile.platformFilter = platform
let embedFile = addObject(pbxBuildFile)
copyFrameworksReferences.append(embedFile)
if dependency.copyPhase != nil {
customCopyDependenciesReferences.append(embedFile)
} else {
copyFrameworksReferences.append(embedFile)
}
}
case .bundle:
// Static and dynamic libraries can't copy resources
@@ -969,7 +992,11 @@ public class PBXProjGenerator {
let embedFile = addObject(
PBXBuildFile(file: fileReference, settings: getEmbedSettings(dependency: dependency, codeSign: dependency.codeSign ?? true))
)
copyFrameworksReferences.append(embedFile)
if dependency.copyPhase != nil {
customCopyDependenciesReferences.append(embedFile)
} else {
copyFrameworksReferences.append(embedFile)
}
} else {
carthageFrameworksToEmbed.append(dependency.reference)
}
@@ -1016,6 +1043,19 @@ public class PBXProjGenerator {
)
}
func splitCopyDepsByDestination(_ references: [PBXBuildFile]) -> [BuildPhaseSpec.CopyFilesSettings : [PBXBuildFile]] {
var retval = [BuildPhaseSpec.CopyFilesSettings : [PBXBuildFile]]()
for reference in references {
guard let key = reference.settings?["COPY_PHASE"] as? BuildPhaseSpec.CopyFilesSettings else { continue }
var filesWithSameDestination = retval[key] ?? [PBXBuildFile]()
filesWithSameDestination.append(reference)
retval[key] = filesWithSameDestination
}
return retval
}
copyFilesBuildPhasesFiles.merge(getBuildFilesForCopyFilesPhases()) { $0 + $1 }
buildPhases += try target.preBuildScripts.map { try generateBuildScript(targetName: target.name, buildScript: $0) }
@@ -1154,6 +1194,21 @@ public class PBXProjGenerator {
buildPhases.append(copyFilesPhase)
}
if !customCopyDependenciesReferences.isEmpty {
let splitted = splitCopyDepsByDestination(customCopyDependenciesReferences)
for (phase, references) in splitted {
guard let destination = phase.destination.destination else { continue }
let copyFilesPhase = addObject(
getPBXCopyFilesBuildPhase(dstSubfolderSpec: destination, dstPath:phase.subpath, name: "Embed Dependencies", files: references)
)
buildPhases.append(copyFilesPhase)
}
}
if !copyWatchReferences.isEmpty {
let copyFilesPhase = addObject(