From 96c0796296f82f2c8cd869218b97072984a24a22 Mon Sep 17 00:00:00 2001 From: "konstantin.tskhovrebov" Date: Tue, 2 Aug 2022 19:46:38 +0200 Subject: [PATCH] [KT-53340] Cocoapods fix: configure linker for default frameworks. There was a hidden problem: linker options was applied only if `framework` dsl was used. --- .../native/cocoapods/CocoapodsExtension.kt | 32 +------------- .../native/cocoapods/KotlinCocoapodsPlugin.kt | 42 +++++++++++++++++-- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/CocoapodsExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/CocoapodsExtension.kt index b9797b2d571..30a8e2ae37f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/CocoapodsExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/CocoapodsExtension.kt @@ -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) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt index 94ccc7383ea..6e43860de7d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt @@ -563,10 +563,44 @@ open class KotlinCocoapodsPlugin : Plugin { 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 { ) } createInterops(project, kotlinExtension, cocoapodsExtension) - configureTestBinaries(project, cocoapodsExtension) + configureLinkingOptions(project, cocoapodsExtension) } }