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 8e1c26c4a67..ea59e9b332f 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 @@ -91,7 +91,7 @@ open class CocoapodsExtension(private val project: Project) { // For some reason Gradle doesn't consume the @Nested annotation on NamedDomainObjectContainer. @get:Nested - protected val podsAsTaskInput: List + val podsAsTaskInput: List get() = _pods.toList() /** @@ -273,7 +273,7 @@ open class CocoapodsExtension(private val project: Project) { class SpecRepos { @get:Internal - internal val specRepos = mutableSetOf() + internal val specRepos = mutableSetOf(URI("https://cdn.cocoapods.org")) fun url(url: String) { specRepos.add(URI(url)) 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 bc66c680865..f33b368df29 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 @@ -89,7 +89,6 @@ private val CocoapodsDependency.toPodDownloadTaskName: String ) open class KotlinCocoapodsPlugin : Plugin { - private fun KotlinMultiplatformExtension.supportedTargets() = targets .withType(KotlinNativeTarget::class.java) .matching { it.konanTarget.family.isAppleFamily } @@ -354,6 +353,7 @@ open class KotlinCocoapodsPlugin : Plugin { it.group = TASK_GROUP it.description = "Invokes `pod install` call within Podfile location directory" it.podfile.set(cocoapodsExtension.podfile) + it.frameworkName = project.provider { cocoapodsExtension.frameworkName } it.onlyIf { isAvailableToProduceSynthetic } //TODO avoid subproject task management here diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/missingPodfileInfoUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/missingPodfileInfoUtils.kt new file mode 100644 index 00000000000..0d9478f79fc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/missingPodfileInfoUtils.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.targets.native.cocoapods + +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.CocoapodsDependency +import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.SpecRepos + +interface MissingInfoMessage { + val missingInfo: T + val missingMessage: String +} + +class MissingSpecReposMessage(override val missingInfo: SpecRepos) : MissingInfoMessage { + override val missingMessage: String + get() = missingInfo.getAll().joinToString(separator = "\n") { "source '$it'" } +} + +class MissingCocoapodsMessage(override val missingInfo: CocoapodsDependency, private val project: Project) : + MissingInfoMessage { + override val missingMessage: String + get() = "pod '${missingInfo.name}'${missingInfo.source?.let { ", :path => '${it.getLocalPath(project, missingInfo.name)}'" } ?: ""}" +} + diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/AdvancedCocoapodsTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/AdvancedCocoapodsTasks.kt index 7308b9b079b..5f9c75392de 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/AdvancedCocoapodsTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/AdvancedCocoapodsTasks.kt @@ -16,6 +16,10 @@ import org.gradle.api.tasks.Optional import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.* import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.CocoapodsDependency.PodLocation.* import org.jetbrains.kotlin.gradle.plugin.cocoapods.cocoapodsBuildDirs +import org.jetbrains.kotlin.gradle.targets.native.cocoapods.MissingCocoapodsMessage +import org.jetbrains.kotlin.gradle.targets.native.cocoapods.MissingSpecReposMessage +import org.jetbrains.kotlin.gradle.tasks.PodspecTask.Companion.retrievePods +import org.jetbrains.kotlin.gradle.tasks.PodspecTask.Companion.retrieveSpecRepos import org.jetbrains.kotlin.konan.target.Family import java.io.File import java.io.FileInputStream @@ -46,6 +50,9 @@ open class PodInstallTask : DefaultTask() { onlyIf { podfile.isPresent } } + @get:Internal + internal lateinit var frameworkName: Provider + @get:Optional @get:Input internal val podfile = project.objects.property(File::class.java) @@ -68,10 +75,28 @@ open class PodInstallTask : DefaultTask() { val podInstallOutput = podInstallProcess.inputStream.use { it.reader().readText() } check(podInstallRetCode == 0) { - listOf( + val specReposMessages = retrieveSpecRepos(project)?.let { MissingSpecReposMessage(it).missingMessage } + val cocoapodsMessages = retrievePods(project)?.map { MissingCocoapodsMessage(it, project).missingMessage } + + listOfNotNull( "Executing of 'pod install' failed with code $podInstallRetCode.", "Error message:", - podInstallOutput + podInstallOutput, + specReposMessages?.let { + """ + |Please, check that file "${podfile.get().path}" contains following lines in header: + |$it + | + """.trimMargin() + }, + cocoapodsMessages?.let { + """ + |Please, check that each target depended on ${frameworkName.get()} contains following dependencies: + |${it.joinToString("\n")} + | + """.trimMargin() + } + ).joinToString("\n") } with(podsXcodeProjDirProvider) { @@ -350,8 +375,7 @@ open class PodGenTask : DefaultTask() { val syntheticDir = project.cocoapodsBuildDirs.synthetic(family).apply { mkdirs() } val localPodspecPaths = pods.get().mapNotNull { it.source?.getLocalPath(project, it.name) } - val specRepos = specRepos.get().getAll().toMutableList() - specRepos += URI("https://cdn.cocoapods.org") + val specRepos = specRepos.get().getAll() val podGenProcessArgs = listOfNotNull( "pod", "gen", diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt index 4fa31a0e37d..0bb529d7438 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt @@ -189,6 +189,9 @@ open class PodspecTask : DefaultTask() { if (project.rootProject == project) project.multiplatformExtensionOrNull?.cocoapodsExtensionOrNull?.podfile != null else project.multiplatformExtensionOrNull?.cocoapodsExtensionOrNull?.podfile != null || (project.parent?.let { hasPodfileOwnOrParent(it) } ?: false) + + internal fun retrieveSpecRepos(project: Project): SpecRepos? = project.multiplatformExtensionOrNull?.cocoapodsExtensionOrNull?.specRepos + internal fun retrievePods(project: Project): List? = project.multiplatformExtensionOrNull?.cocoapodsExtensionOrNull?.podsAsTaskInput } }