CocoaPods: Show error if a build is started not from Xcode

Issue #KT-31062 Fixed
This commit is contained in:
Ilya Matveev
2019-04-19 13:04:19 +07:00
parent a1e20f8d2a
commit c0eba201a5
2 changed files with 25 additions and 6 deletions
@@ -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.
@@ -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<Project> {
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> {
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()
}
}
}
}
}