Link CocoaPods frameworks with iosTest binary

#KT-44857 #KT-37513
This commit is contained in:
Viacheslav Kormushkin
2021-07-15 21:23:43 +03:00
committed by Space
parent b51ff799cb
commit 780b9a032b
7 changed files with 82 additions and 8 deletions
@@ -61,6 +61,7 @@ class CocoaPodsIT : BaseGradleIT() {
private val cocoapodsMultipleKtPods = "native-cocoapods-multiple"
private val templateProjectName = "native-cocoapods-template"
private val groovyTemplateProjectName = "native-cocoapods-template-groovy"
private val cocoapodsTestsProjectName = "native-cocoapods-tests"
private val dummyTaskName = ":$DUMMY_FRAMEWORK_TASK_NAME"
private val podspecTaskName = ":$POD_SPEC_TASK_NAME"
@@ -880,6 +881,9 @@ class CocoaPodsIT : BaseGradleIT() {
}
}
@Test
fun testPodDependencyInUnitTests() =
getProjectByName(cocoapodsTestsProjectName).testWithWrapper(":iosX64Test")
// paths
@@ -0,0 +1,22 @@
plugins {
id("org.jetbrains.kotlin.multiplatform").version("<pluginMarkerVersion>")
id("org.jetbrains.kotlin.native.cocoapods").version("<pluginMarkerVersion>")
}
repositories {
mavenLocal()
mavenCentral()
}
group = "org.jetbrains.kotlin.sample.native"
version = "1.0"
kotlin {
iosX64()
cocoapods {
homepage = "https://github.com/JetBrains/kotlin"
summary = "CocoaPods test library"
ios.deploymentTarget = "13.5"
pod("AFNetworking")
}
}
@@ -0,0 +1,11 @@
pluginManagement {
repositories {
mavenLocal()
mavenCentral()
gradlePluginPortal()
}
}
enableFeaturePreview('GRADLE_METADATA')
rootProject.name = "cocoapods"
@@ -0,0 +1,8 @@
package testProject.`new-mpp-cocoapods-template`.src.iosX64Main.kotlin
import cocoapods.AFNetworking.*
fun foo() : Boolean {
val manager = AFURLSessionManager()
return manager != null
}
@@ -0,0 +1,13 @@
package testProject.`new-mpp-cocoapods-template`.src.iosTest.kotlin
import kotlin.test.Test
import kotlin.test.assertTrue
import testProject.`new-mpp-cocoapods-template`.src.iosX64Main.kotlin.foo
class IosGreetingTest {
@Test
fun testExample() {
assertTrue(foo())
}
}
@@ -17,6 +17,8 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.CocoapodsDependency.PodLocation.*
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBinary
import org.jetbrains.kotlin.gradle.plugin.mpp.TestExecutable
import java.io.File
import java.net.URI
@@ -242,30 +244,33 @@ open class CocoapodsExtension(private val project: Project) {
frameworkNameInternal = framework.baseName
useDynamicFramework = framework.isStatic.not()
if (useDynamicFramework) {
configureDynamicFrameworkLinking(framework)
configureLinkingOptions(framework)
}
}
}
}
private fun configureDynamicFrameworkLinking(framework: Framework) {
internal fun configureLinkingOptions(binary: NativeBinary, setRPath: Boolean = false) {
project.findProperty(KotlinCocoapodsPlugin.FRAMEWORK_PATHS_PROPERTY)?.toString()?.let { args ->
framework.linkerOpts.addAll(args.splitQuotedArgs().map { "-F$it" })
binary.linkerOpts.addAll(args.splitQuotedArgs().map { "-F$it" })
}
pods.all { pod ->
framework.linkerOpts("-framework", pod.moduleName)
binary.linkerOpts("-framework", pod.moduleName)
if (project.shouldUseSyntheticProjectSettings &&
KotlinCocoapodsPlugin.isAvailableToProduceSynthetic
) {
framework.linkTaskProvider.configure { task ->
binary.linkTaskProvider.configure { task ->
val podBuildTaskProvider = project.getPodBuildTaskProvider(framework.target, pod)
val podBuildTaskProvider = project.getPodBuildTaskProvider(binary.target, pod)
task.inputs.file(podBuildTaskProvider.map { it.buildSettingsFile })
task.dependsOn(podBuildTaskProvider)
task.doFirst { _ ->
val podBuildSettings = project.getPodBuildSettingsProperties(framework.target, pod)
framework.linkerOpts.addAll(podBuildSettings.frameworkSearchPaths.map { "-F$it" })
val podBuildSettings = project.getPodBuildSettingsProperties(binary.target, pod)
binary.linkerOpts.addAll(podBuildSettings.frameworkSearchPaths.map { "-F$it" })
if (setRPath) {
binary.linkerOpts.addAll(podBuildSettings.frameworkSearchPaths.flatMap { listOf("-rpath", it) })
}
}
}
}
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Compan
import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.PLATFORM_PROPERTY
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
import org.jetbrains.kotlin.gradle.plugin.mpp.TestExecutable
import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
import org.jetbrains.kotlin.gradle.targets.native.tasks.*
import org.jetbrains.kotlin.gradle.tasks.*
@@ -636,6 +637,15 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
}
}
private fun configureTestBinaries(project: Project, cocoapodsExtension: CocoapodsExtension) {
project.multiplatformExtension.supportedTargets().all { target ->
target.binaries.withType(TestExecutable::class.java) { testExecutable ->
cocoapodsExtension.configureLinkingOptions(testExecutable, setRPath = true)
}
}
}
override fun apply(project: Project): Unit = with(project) {
pluginManager.withPlugin("kotlin-multiplatform") {
@@ -666,6 +676,7 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
)
}
createInterops(project, kotlinExtension, cocoapodsExtension)
configureTestBinaries(project, cocoapodsExtension)
}
}