KT-62380 Copy dummy dSYM directory for cocoapods integration

This commit is contained in:
Andrey Yastrebov
2024-01-23 18:47:05 +01:00
committed by Space Team
parent 1bae743524
commit 7c103e257d
3 changed files with 83 additions and 8 deletions
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin
import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.DUMMY_FRAMEWORK_TASK_NAME import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.DUMMY_FRAMEWORK_TASK_NAME
import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.POD_IMPORT_TASK_NAME import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.POD_IMPORT_TASK_NAME
import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.POD_SPEC_TASK_NAME import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.POD_SPEC_TASK_NAME
import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.SYNC_TASK_NAME
import org.jetbrains.kotlin.gradle.targets.native.cocoapods.CocoapodsPluginDiagnostics import org.jetbrains.kotlin.gradle.targets.native.cocoapods.CocoapodsPluginDiagnostics
import org.jetbrains.kotlin.gradle.testbase.* import org.jetbrains.kotlin.gradle.testbase.*
import org.jetbrains.kotlin.gradle.util.assertProcessRunResult import org.jetbrains.kotlin.gradle.util.assertProcessRunResult
@@ -45,6 +46,7 @@ class CocoaPodsIT : KGPBaseTest() {
private val podspecTaskName = ":$POD_SPEC_TASK_NAME" private val podspecTaskName = ":$POD_SPEC_TASK_NAME"
private val podImportTaskName = ":$POD_IMPORT_TASK_NAME" private val podImportTaskName = ":$POD_IMPORT_TASK_NAME"
private val podInstallTaskName = ":${KotlinCocoapodsPlugin.POD_INSTALL_TASK_NAME}" private val podInstallTaskName = ":${KotlinCocoapodsPlugin.POD_INSTALL_TASK_NAME}"
private val syncTaskName = ":$SYNC_TASK_NAME"
private val defaultPodName = "AFNetworking" private val defaultPodName = "AFNetworking"
@@ -131,14 +133,56 @@ class CocoaPodsIT : KGPBaseTest() {
@DisplayName("Dummy UTD") @DisplayName("Dummy UTD")
@GradleTest @GradleTest
fun testDummyUTD(gradleVersion: GradleVersion) { fun testDummyUTD(gradleVersion: GradleVersion) {
nativeProjectWithCocoapodsAndIosAppPodFile(gradleVersion = gradleVersion) { val buildOptions = defaultBuildOptions.copy(
nativeOptions = defaultBuildOptions.nativeOptions.copy(
cocoapodsPlatform = "iphonesimulator",
cocoapodsArchs = "x86_64",
cocoapodsConfiguration = "Debug"
)
)
nativeProjectWithCocoapodsAndIosAppPodFile(gradleVersion = gradleVersion, buildOptions = buildOptions) {
buildGradleKts.addCocoapodsBlock(
"""
framework {
baseName = "shared"
isStatic = false
}
""".trimIndent()
)
buildWithCocoapodsWrapper(dummyTaskName) { buildWithCocoapodsWrapper(dummyTaskName) {
assertDirectoryInProjectExists("build/cocoapods/framework/shared.framework")
assertDirectoryInProjectExists("build/cocoapods/framework/shared.framework.dSYM")
assertTasksExecuted(dummyTaskName) assertTasksExecuted(dummyTaskName)
} }
buildWithCocoapodsWrapper(dummyTaskName) { buildWithCocoapodsWrapper(dummyTaskName) {
assertTasksUpToDate(dummyTaskName) assertTasksUpToDate(dummyTaskName)
} }
buildWithCocoapodsWrapper(syncTaskName) {
assertTasksExecuted(syncTaskName)
}
val frameworkResult = runProcess(
listOf("dwarfdump", "--uuid", "shared.framework/shared"),
projectPath.resolve("build/cocoapods/framework/").toFile()
)
val dsymResult = runProcess(
listOf("dwarfdump", "--uuid", "shared.framework.dSYM"),
projectPath.resolve("build/cocoapods/framework/").toFile()
)
assertContains(frameworkResult.output, "UUID:")
assertContains(dsymResult.output, "UUID:")
val frameworkUUID = frameworkResult.output.split(" ").getOrNull(1)
val dsymUUID = dsymResult.output.split(" ").getOrNull(1)
assertEquals(frameworkUUID, dsymUUID)
} }
} }
@@ -154,8 +198,6 @@ class CocoaPodsIT : KGPBaseTest() {
) )
nativeProjectWithCocoapodsAndIosAppPodFile(gradleVersion = gradleVersion, buildOptions = buildOptions) { nativeProjectWithCocoapodsAndIosAppPodFile(gradleVersion = gradleVersion, buildOptions = buildOptions) {
val syncTaskName = ":syncFramework"
buildGradleKts.addCocoapodsBlock( buildGradleKts.addCocoapodsBlock(
""" """
framework { framework {
@@ -195,8 +237,6 @@ class CocoaPodsIT : KGPBaseTest() {
) )
nativeProjectWithCocoapodsAndIosAppPodFile(gradleVersion = gradleVersion, buildOptions = buildOptions) { nativeProjectWithCocoapodsAndIosAppPodFile(gradleVersion = gradleVersion, buildOptions = buildOptions) {
val syncTaskName = ":syncFramework"
buildGradleKts.addCocoapodsBlock( buildGradleKts.addCocoapodsBlock(
""" """
framework { framework {
@@ -404,7 +404,6 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
project.registerTask<DummyFrameworkTask>(DUMMY_FRAMEWORK_TASK_NAME) { task -> project.registerTask<DummyFrameworkTask>(DUMMY_FRAMEWORK_TASK_NAME) { task ->
task.frameworkName.convention(cocoapodsExtension.podFrameworkName) task.frameworkName.convention(cocoapodsExtension.podFrameworkName)
task.useStaticFramework.convention(cocoapodsExtension.podFrameworkIsStatic) task.useStaticFramework.convention(cocoapodsExtension.podFrameworkIsStatic)
task.outputFramework.convention(project.layout.cocoapodsBuildDirs.framework.map { it.dir(task.frameworkName.get() + ".framework") })
} }
} }
@@ -8,15 +8,22 @@ package org.jetbrains.kotlin.gradle.tasks
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.ProjectLayout
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property import org.gradle.api.provider.Property
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.tasks.Input import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskAction
import org.gradle.work.DisableCachingByDefault import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.plugin.cocoapods.cocoapodsBuildDirs
import org.jetbrains.kotlin.gradle.utils.MachO import org.jetbrains.kotlin.gradle.utils.MachO
import org.jetbrains.kotlin.gradle.utils.getFile import org.jetbrains.kotlin.gradle.utils.getFile
import org.jetbrains.kotlin.incremental.createDirectory
import java.io.File import java.io.File
import javax.inject.Inject
/** /**
* Creates a dummy framework in the target directory. * Creates a dummy framework in the target directory.
@@ -30,7 +37,10 @@ import java.io.File
* and then replace it with the real one during a real build process. * and then replace it with the real one during a real build process.
*/ */
@DisableCachingByDefault @DisableCachingByDefault
abstract class DummyFrameworkTask : DefaultTask() { abstract class DummyFrameworkTask @Inject constructor(
objectFactory: ObjectFactory,
projectLayout: ProjectLayout
) : DefaultTask() {
@get:Input @get:Input
abstract val frameworkName: Property<String> abstract val frameworkName: Property<String>
@@ -39,7 +49,19 @@ abstract class DummyFrameworkTask : DefaultTask() {
abstract val useStaticFramework: Property<Boolean> abstract val useStaticFramework: Property<Boolean>
@get:OutputDirectory @get:OutputDirectory
abstract val outputFramework: DirectoryProperty val outputFramework: DirectoryProperty = objectFactory.directoryProperty().convention(
frameworkName.flatMap { frameworkName ->
projectLayout.cocoapodsBuildDirs.framework.map { it.dir("$frameworkName.framework") }
}
)
@get:OutputDirectory
@get:Optional
val outputDsym: DirectoryProperty = objectFactory.directoryProperty().convention(
frameworkName.flatMap { frameworkName ->
projectLayout.cocoapodsBuildDirs.framework.map { it.dir("$frameworkName.framework.dSYM") }
}
)
@get:Internal @get:Internal
@Deprecated("Use outputFramework", replaceWith = ReplaceWith("outputFramework.get().asFile")) @Deprecated("Use outputFramework", replaceWith = ReplaceWith("outputFramework.get().asFile"))
@@ -88,6 +110,17 @@ abstract class DummyFrameworkTask : DefaultTask() {
transform transform
) )
private fun createDummyDsym() {
if (useStaticFramework.get()) {
return
}
outputDsym.orNull?.asFile?.apply {
deleteRecursively()
mkdirs()
}
}
private fun copyFramework() { private fun copyFramework() {
// Reset the destination directory // Reset the destination directory
with(outputFramework.getFile()) { with(outputFramework.getFile()) {
@@ -106,6 +139,9 @@ abstract class DummyFrameworkTask : DefaultTask() {
it it
} }
} }
// Create dSYM
createDummyDsym()
} }