diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt index 89e156ac1c3..4ef12622ba1 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt @@ -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 diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-tests/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-tests/build.gradle.kts new file mode 100644 index 00000000000..b5b2921b498 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-tests/build.gradle.kts @@ -0,0 +1,22 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") + id("org.jetbrains.kotlin.native.cocoapods").version("") +} + +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") + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-tests/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-tests/settings.gradle new file mode 100644 index 00000000000..ae6eb00055e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-tests/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +enableFeaturePreview('GRADLE_METADATA') + +rootProject.name = "cocoapods" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-tests/src/iosX64Main/kotlin/A.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-tests/src/iosX64Main/kotlin/A.kt new file mode 100644 index 00000000000..1820c2e6630 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-tests/src/iosX64Main/kotlin/A.kt @@ -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 +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-tests/src/iosX64Test/kotlin/iosTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-tests/src/iosX64Test/kotlin/iosTest.kt new file mode 100644 index 00000000000..9c3a05258a8 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-tests/src/iosX64Test/kotlin/iosTest.kt @@ -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()) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/CocoapodsExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/CocoapodsExtension.kt index e6ecac701a5..b2ee25bf70a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/CocoapodsExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/CocoapodsExtension.kt @@ -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) }) + } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt index 90a1b8f72de..42d6cf44523 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt @@ -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 { } } + 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 { ) } createInterops(project, kotlinExtension, cocoapodsExtension) + configureTestBinaries(project, cocoapodsExtension) } }