[KT-53340] Cocoapods fix: configure linker for default frameworks.

There was a hidden problem: linker options was applied
only if `framework` dsl was used.
This commit is contained in:
konstantin.tskhovrebov
2022-08-02 19:46:38 +02:00
committed by Space
parent b58d2d72e7
commit 96c0796296
2 changed files with 39 additions and 35 deletions
@@ -244,37 +244,7 @@ abstract class CocoapodsExtension @Inject constructor(private val project: Proje
project.multiplatformExtension.supportedTargets().all { target ->
target.binaries
.matching { it.name.startsWith(POD_FRAMEWORK_PREFIX) }
.withType(Framework::class.java) {
action.execute(it)
if (!it.isStatic) {
configureLinkingOptions(it)
}
}
}
}
internal fun configureLinkingOptions(binary: NativeBinary, setRPath: Boolean = false) {
pods.all { pod ->
binary.linkTaskProvider.configure { task ->
if (HostManager.hostIsMac) {
val podBuildTaskProvider = project.getPodBuildTaskProvider(binary.target, pod)
task.inputs.file(podBuildTaskProvider.map { it.buildSettingsFile })
task.dependsOn(podBuildTaskProvider)
}
task.doFirst { _ ->
val podBuildSettings = project.getPodBuildSettingsProperties(binary.target, pod)
val frameworkFileName = pod.moduleName + ".framework"
val frameworkSearchPaths = podBuildSettings.frameworkSearchPaths
val frameworkFileExists = frameworkSearchPaths.any { dir -> File(dir, frameworkFileName).exists() }
if (frameworkFileExists) binary.linkerOpts.addArg("-framework", pod.moduleName)
binary.linkerOpts.addAll(frameworkSearchPaths.map { "-F$it" })
if (setRPath) binary.linkerOpts.addArgs("-rpath", frameworkSearchPaths)
}
}
.withType(Framework::class.java) { action.execute(it) }
}
}
@@ -563,10 +563,44 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
project.ideaImportDependsOn(podImportTaskProvider)
}
private fun configureTestBinaries(project: Project, cocoapodsExtension: CocoapodsExtension) {
private fun configureLinkingOptions(project: Project, cocoapodsExtension: CocoapodsExtension) {
project.multiplatformExtension.supportedTargets().all { target ->
target.binaries.withType(TestExecutable::class.java) { testExecutable ->
cocoapodsExtension.configureLinkingOptions(testExecutable, setRPath = true)
target.binaries.all { binary ->
val testExecutable = binary is TestExecutable
val podFramework = binary is Framework && binary.name.startsWith(POD_FRAMEWORK_PREFIX)
if (testExecutable || podFramework) {
configureLinkingOptions(project, cocoapodsExtension, binary)
}
}
}
}
private fun configureLinkingOptions(project: Project, cocoapodsExtension: CocoapodsExtension, nativeBinary: NativeBinary) {
cocoapodsExtension.pods.all { pod ->
nativeBinary.linkTaskProvider.configure { task ->
val binary = task.binary
if (HostManager.hostIsMac) {
val podBuildTaskProvider = project.getPodBuildTaskProvider(binary.target, pod)
task.inputs.file(podBuildTaskProvider.map { it.buildSettingsFile })
task.dependsOn(podBuildTaskProvider)
}
task.doFirst { _ ->
val isExecutable = binary is AbstractExecutable
val isDynamicFramework = (binary is Framework && !binary.isStatic)
val podBuildSettings = project.getPodBuildSettingsProperties(binary.target, pod)
val frameworkFileName = pod.moduleName + ".framework"
val frameworkSearchPaths = podBuildSettings.frameworkSearchPaths
if (isExecutable || isDynamicFramework) {
val frameworkFileExists = frameworkSearchPaths.any { dir -> File(dir, frameworkFileName).exists() }
if (frameworkFileExists) binary.linkerOpts.addArg("-framework", pod.moduleName)
binary.linkerOpts.addAll(frameworkSearchPaths.map { "-F$it" })
}
if (isExecutable) binary.linkerOpts.addArgs("-rpath", frameworkSearchPaths)
}
}
}
}
@@ -702,7 +736,7 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
)
}
createInterops(project, kotlinExtension, cocoapodsExtension)
configureTestBinaries(project, cocoapodsExtension)
configureLinkingOptions(project, cocoapodsExtension)
}
}