CocoaPods: Skip synthetic task on non-mac hosts
This patch performs the following changes: 1. Create synthetic tasks even if synthetic projects are not supported on the current host. This change simplifies configuring dependencies between these tasks and custom user tasks at the user side. 2. Disable synthetic tasks if synthetic projects are not supported on the current host Issue #KT-40834 Fixed
This commit is contained in:
committed by
Ilya Matveev
parent
b10cc6657e
commit
ce02982226
+24
-1
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Compan
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.POD_SETUP_BUILD_TASK_NAME
|
import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.POD_SETUP_BUILD_TASK_NAME
|
||||||
import org.jetbrains.kotlin.gradle.util.modify
|
import org.jetbrains.kotlin.gradle.util.modify
|
||||||
import org.jetbrains.kotlin.konan.target.HostManager
|
import org.jetbrains.kotlin.konan.target.HostManager
|
||||||
|
import org.junit.Assume.assumeFalse
|
||||||
import org.junit.Assume.assumeTrue
|
import org.junit.Assume.assumeTrue
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -168,6 +169,28 @@ class CocoaPodsIT : BaseGradleIT() {
|
|||||||
mapOf("kotlin-library" to "foobaz")
|
mapOf("kotlin-library" to "foobaz")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSkippingTasksOnOtherHosts() {
|
||||||
|
assumeFalse(HostManager.hostIsMac)
|
||||||
|
|
||||||
|
with(transformProjectWithPluginsDsl(cocoapodsSingleKtPod, gradleVersion)) {
|
||||||
|
val syntheticTasks = arrayOf(
|
||||||
|
":podInstall",
|
||||||
|
":kotlin-library:generateDummyFramework",
|
||||||
|
":kotlin-library:podGenIOS",
|
||||||
|
":kotlin-library:podSetupBuildIOS",
|
||||||
|
":kotlin-library:podBuildDependenciesIOS",
|
||||||
|
":kotlin-library:podImport"
|
||||||
|
)
|
||||||
|
|
||||||
|
build(*syntheticTasks, "-Pkotlin.native.cocoapods.generate.wrapper=true") {
|
||||||
|
// Check that tasks working with synthetic projects are skipped on non-mac hosts.
|
||||||
|
assertSuccessful()
|
||||||
|
assertTasksSkipped(*syntheticTasks)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun BaseGradleIT.Project.useCustomFrameworkName(subproject: String, frameworkName: String, iosAppLocation: String? = null) {
|
private fun BaseGradleIT.Project.useCustomFrameworkName(subproject: String, frameworkName: String, iosAppLocation: String? = null) {
|
||||||
// Change the name at the Gradle side.
|
// Change the name at the Gradle side.
|
||||||
gradleBuildScript(subproject).appendText(
|
gradleBuildScript(subproject).appendText(
|
||||||
@@ -234,7 +257,7 @@ class CocoaPodsIT : BaseGradleIT() {
|
|||||||
subprojectsToFrameworkNamesMap: Map<String, String?>,
|
subprojectsToFrameworkNamesMap: Map<String, String?>,
|
||||||
) {
|
) {
|
||||||
assumeTrue(HostManager.hostIsMac)
|
assumeTrue(HostManager.hostIsMac)
|
||||||
assumeTrue(KotlinCocoapodsPlugin.isAvailableToProduceSynthetic())
|
assumeTrue(KotlinCocoapodsPlugin.isAvailableToProduceSynthetic)
|
||||||
|
|
||||||
val subprojects = subprojectsToFrameworkNamesMap.keys
|
val subprojects = subprojectsToFrameworkNamesMap.keys
|
||||||
val gradleProject = transformProjectWithPluginsDsl(projectName, gradleVersion)
|
val gradleProject = transformProjectWithPluginsDsl(projectName, gradleVersion)
|
||||||
|
|||||||
+24
-13
@@ -213,8 +213,8 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
interop.packageName = "cocoapods.${pod.moduleName}"
|
interop.packageName = "cocoapods.${pod.moduleName}"
|
||||||
|
|
||||||
|
|
||||||
if (//TODO ychernyshev improve first check
|
if (
|
||||||
isAvailableToProduceSynthetic()
|
isAvailableToProduceSynthetic
|
||||||
&& project.findProperty(TARGET_PROPERTY) == null
|
&& project.findProperty(TARGET_PROPERTY) == null
|
||||||
&& project.findProperty(CONFIGURATION_PROPERTY) == null
|
&& project.findProperty(CONFIGURATION_PROPERTY) == null
|
||||||
) {
|
) {
|
||||||
@@ -239,8 +239,8 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
// Since we cannot expand the configuration phase of interop tasks
|
// Since we cannot expand the configuration phase of interop tasks
|
||||||
// receiving the required environment variables happens on execution phase.
|
// receiving the required environment variables happens on execution phase.
|
||||||
// TODO This needs to be fixed to improve UP-TO-DATE checks.
|
// TODO This needs to be fixed to improve UP-TO-DATE checks.
|
||||||
if (// TODO ychernyshev improve first check
|
if (
|
||||||
isAvailableToProduceSynthetic()
|
isAvailableToProduceSynthetic
|
||||||
&& project.findProperty(TARGET_PROPERTY) == null
|
&& project.findProperty(TARGET_PROPERTY) == null
|
||||||
&& project.findProperty(CONFIGURATION_PROPERTY) == null
|
&& project.findProperty(CONFIGURATION_PROPERTY) == null
|
||||||
) {
|
) {
|
||||||
@@ -305,6 +305,8 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
it.group = TASK_GROUP
|
it.group = TASK_GROUP
|
||||||
it.description = "Invokes `pod install` call within Podfile location directory"
|
it.description = "Invokes `pod install` call within Podfile location directory"
|
||||||
it.cocoapodsExtension = cocoapodsExtension
|
it.cocoapodsExtension = cocoapodsExtension
|
||||||
|
it.onlyIf { isAvailableToProduceSynthetic }
|
||||||
|
|
||||||
//TODO avoid subproject task management here
|
//TODO avoid subproject task management here
|
||||||
project.allprojects.map { it.tasks.named(POD_SPEC_TASK_NAME, PodspecTask::class.java) }
|
project.allprojects.map { it.tasks.named(POD_SPEC_TASK_NAME, PodspecTask::class.java) }
|
||||||
.forEach { podspecTaskProvider ->
|
.forEach { podspecTaskProvider ->
|
||||||
@@ -328,6 +330,7 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
it.kotlinNativeTarget = target
|
it.kotlinNativeTarget = target
|
||||||
it.cocoapodsExtension = cocoapodsExtension
|
it.cocoapodsExtension = cocoapodsExtension
|
||||||
it.dependsOn(podspecTaskProvider)
|
it.dependsOn(podspecTaskProvider)
|
||||||
|
it.onlyIf { isAvailableToProduceSynthetic }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -352,6 +355,7 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
val podGenTaskProvider = project.tasks.named(target.toPodGenTaskName, PodGenTask::class.java)
|
val podGenTaskProvider = project.tasks.named(target.toPodGenTaskName, PodGenTask::class.java)
|
||||||
it.podsXcodeProjDirProvider = podGenTaskProvider.get().podsXcodeProjDirProvider
|
it.podsXcodeProjDirProvider = podGenTaskProvider.get().podsXcodeProjDirProvider
|
||||||
it.dependsOn(podGenTaskProvider)
|
it.dependsOn(podGenTaskProvider)
|
||||||
|
it.onlyIf { isAvailableToProduceSynthetic }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -374,6 +378,7 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
it.podsXcodeProjDirProvider = podSetupBuildTaskProvider.get().podsXcodeProjDirProvider
|
it.podsXcodeProjDirProvider = podSetupBuildTaskProvider.get().podsXcodeProjDirProvider
|
||||||
it.buildSettingsFileProvider = podSetupBuildTaskProvider.get().buildSettingsFileProvider
|
it.buildSettingsFileProvider = podSetupBuildTaskProvider.get().buildSettingsFileProvider
|
||||||
it.dependsOn(podSetupBuildTaskProvider)
|
it.dependsOn(podSetupBuildTaskProvider)
|
||||||
|
it.onlyIf { isAvailableToProduceSynthetic }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -388,6 +393,7 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
it.group = TASK_GROUP
|
it.group = TASK_GROUP
|
||||||
it.description = "Called on Gradle sync, depends on Cinterop tasks for every used pod"
|
it.description = "Called on Gradle sync, depends on Cinterop tasks for every used pod"
|
||||||
it.dependsOn(podInstallTaskProvider)
|
it.dependsOn(podInstallTaskProvider)
|
||||||
|
it.onlyIf { isAvailableToProduceSynthetic }
|
||||||
|
|
||||||
kotlinExtension.supportedTargets().all { target ->
|
kotlinExtension.supportedTargets().all { target ->
|
||||||
target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME).cinterops.all { interop ->
|
target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME).cinterops.all { interop ->
|
||||||
@@ -408,13 +414,14 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
registerDummyFrameworkTask(project, cocoapodsExtension)
|
registerDummyFrameworkTask(project, cocoapodsExtension)
|
||||||
createSyncTask(project, kotlinExtension)
|
createSyncTask(project, kotlinExtension)
|
||||||
registerPodspecTask(project, cocoapodsExtension)
|
registerPodspecTask(project, cocoapodsExtension)
|
||||||
if (isAvailableToProduceSynthetic()) {
|
|
||||||
registerPodGenTask(project, kotlinExtension, cocoapodsExtension)
|
registerPodGenTask(project, kotlinExtension, cocoapodsExtension)
|
||||||
registerPodInstallTask(project, cocoapodsExtension)
|
registerPodInstallTask(project, cocoapodsExtension)
|
||||||
registerPodSetupBuildTasks(project, kotlinExtension, cocoapodsExtension)
|
registerPodSetupBuildTasks(project, kotlinExtension, cocoapodsExtension)
|
||||||
registerPodBuildTasks(project, kotlinExtension, cocoapodsExtension)
|
registerPodBuildTasks(project, kotlinExtension, cocoapodsExtension)
|
||||||
registerPodImportTask(project, kotlinExtension)
|
registerPodImportTask(project, kotlinExtension)
|
||||||
} else {
|
|
||||||
|
if (HostManager.hostIsMac && !isAvailableToProduceSynthetic) {
|
||||||
logger.quiet(
|
logger.quiet(
|
||||||
"""
|
"""
|
||||||
To take advantage of the new functionality for Cocoapods Integration like synchronizing with the Xcode project
|
To take advantage of the new functionality for Cocoapods Integration like synchronizing with the Xcode project
|
||||||
@@ -457,13 +464,17 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
const val KOTLIN_TARGET_FOR_IOS_DEVICE = "ios_arm"
|
const val KOTLIN_TARGET_FOR_IOS_DEVICE = "ios_arm"
|
||||||
const val KOTLIN_TARGET_FOR_WATCHOS_DEVICE = "watchos_arm"
|
const val KOTLIN_TARGET_FOR_WATCHOS_DEVICE = "watchos_arm"
|
||||||
|
|
||||||
fun isAvailableToProduceSynthetic(): Boolean {
|
val isAvailableToProduceSynthetic: Boolean by lazy {
|
||||||
|
if (!HostManager.hostIsMac) {
|
||||||
|
return@lazy false
|
||||||
|
}
|
||||||
|
|
||||||
val gemListProcess = ProcessBuilder("gem", "list").start()
|
val gemListProcess = ProcessBuilder("gem", "list").start()
|
||||||
val gemListRetCode = gemListProcess.waitFor()
|
val gemListRetCode = gemListProcess.waitFor()
|
||||||
val gemListOutput = gemListProcess.inputStream.use {
|
val gemListOutput = gemListProcess.inputStream.use {
|
||||||
it.reader().readText()
|
it.reader().readText()
|
||||||
}
|
}
|
||||||
return gemListRetCode == 0 && gemListOutput.contains("cocoapods-generate")
|
gemListRetCode == 0 && gemListOutput.contains("cocoapods-generate")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user