Link CocoaPods frameworks with iosTest binary
#KT-44857 #KT-37513
This commit is contained in:
committed by
Space
parent
b51ff799cb
commit
780b9a032b
+4
@@ -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
|
||||
|
||||
|
||||
+22
@@ -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")
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
pluginManagement {
|
||||
repositories {
|
||||
mavenLocal()
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
|
||||
enableFeaturePreview('GRADLE_METADATA')
|
||||
|
||||
rootProject.name = "cocoapods"
|
||||
+8
@@ -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
|
||||
}
|
||||
+13
@@ -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())
|
||||
}
|
||||
}
|
||||
+13
-8
@@ -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) })
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+11
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user