From c0eba201a5e9a9e6d4331d1493b46a101302d1ab Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Fri, 19 Apr 2019 13:04:19 +0700 Subject: [PATCH] CocoaPods: Show error if a build is started not from Xcode Issue #KT-31062 Fixed --- .../jetbrains/kotlin/gradle/CocoaPodsIT.kt | 2 +- .../native/cocoapods/KotlinCocoapodsPlugin.kt | 29 +++++++++++++++---- 2 files changed, 25 insertions(+), 6 deletions(-) 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() + } + } + } } }