diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CocoaPodsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CocoaPodsIT.kt index d135f13e35c..f61927d2021 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CocoaPodsIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CocoaPodsIT.kt @@ -98,7 +98,7 @@ class CocoaPodsIT : BaseGradleIT() { // Check that a project with CocoaPods interop fails to be built from command line. build(":kotlin-library:build") { assertFailed() - // TODO: Test message for KT-31062. + assertContains("Cannot perform cinterop processing for pod_dependency: cannot determine headers location.") } // Check that a project without CocoaPods interop can be built from command line. 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 40d7af78089..6504d96ca88 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 @@ -16,10 +16,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.addExtension import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.whenEvaluated -import org.jetbrains.kotlin.gradle.tasks.DefFileTask -import org.jetbrains.kotlin.gradle.tasks.DummyFrameworkTask -import org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask -import org.jetbrains.kotlin.gradle.tasks.PodspecTask +import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.utils.asValidTaskName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.konan.target.Family @@ -190,7 +187,8 @@ open class KotlinCocoapodsPlugin: Plugin { kotlinExtension.supportedTargets().all { target -> target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME).cinterops.create(pod.name) { interop -> - project.tasks.getByPath(interop.interopProcessingTaskName).dependsOn(defTask) + val interopTask = project.tasks.getByPath(interop.interopProcessingTaskName) + interopTask.dependsOn(defTask) interop.defFile = defTask.outputFile interop.packageName = "cocoapods.${pod.moduleName}" @@ -205,6 +203,27 @@ open class KotlinCocoapodsPlugin: Plugin { project.findProperty(FRAMEWORK_PATHS_PROPERTY)?.toString()?.let { args -> interop.compilerOpts.addAll(args.splitQuotedArgs().map { "-F$it" }) } + + // Show a human-readable error messages if the interop is created + // but there are no parameters set by Xcode or manually by user (KT-31062). + interopTask.doFirst { _ -> + val hasCompilerOpts = interop.compilerOpts.isNotEmpty() + val hasHeaderSearchPath = interop.includeDirs.let { + !it.headerFilterDirs.isEmpty || !it.allHeadersDirs.isEmpty + } + + check(hasCompilerOpts || hasHeaderSearchPath) { + """ + |Cannot perform cinterop processing for ${pod.name}: cannot determine headers location. + | + |Probably the build is executed from command line. + |Note that a Kotlin/Native module using CocoaPods dependencies can be built only from Xcode. + | + |See details at https://kotlinlang.org/docs/reference/native/cocoapods.html#interoperability. + """.trimMargin() + } + } + } } }