From 7c103e257d5a14941fa21b502ffce2ece194771f Mon Sep 17 00:00:00 2001 From: Andrey Yastrebov Date: Tue, 23 Jan 2024 18:47:05 +0100 Subject: [PATCH] KT-62380 Copy dummy dSYM directory for cocoapods integration --- .../kotlin/gradle/native/CocoaPodsIT.kt | 50 +++++++++++++++++-- .../native/cocoapods/KotlinCocoapodsPlugin.kt | 1 - .../cocoapods/tasks/DummyFrameworkTask.kt | 40 ++++++++++++++- 3 files changed, 83 insertions(+), 8 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt index b381e37db8f..68e7c8d5624 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt @@ -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.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.SYNC_TASK_NAME import org.jetbrains.kotlin.gradle.targets.native.cocoapods.CocoapodsPluginDiagnostics import org.jetbrains.kotlin.gradle.testbase.* import org.jetbrains.kotlin.gradle.util.assertProcessRunResult @@ -45,6 +46,7 @@ class CocoaPodsIT : KGPBaseTest() { private val podspecTaskName = ":$POD_SPEC_TASK_NAME" private val podImportTaskName = ":$POD_IMPORT_TASK_NAME" private val podInstallTaskName = ":${KotlinCocoapodsPlugin.POD_INSTALL_TASK_NAME}" + private val syncTaskName = ":$SYNC_TASK_NAME" private val defaultPodName = "AFNetworking" @@ -131,14 +133,56 @@ class CocoaPodsIT : KGPBaseTest() { @DisplayName("Dummy UTD") @GradleTest 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) { + assertDirectoryInProjectExists("build/cocoapods/framework/shared.framework") + assertDirectoryInProjectExists("build/cocoapods/framework/shared.framework.dSYM") assertTasksExecuted(dummyTaskName) } + buildWithCocoapodsWrapper(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) { - val syncTaskName = ":syncFramework" - buildGradleKts.addCocoapodsBlock( """ framework { @@ -195,8 +237,6 @@ class CocoaPodsIT : KGPBaseTest() { ) nativeProjectWithCocoapodsAndIosAppPodFile(gradleVersion = gradleVersion, buildOptions = buildOptions) { - val syncTaskName = ":syncFramework" - buildGradleKts.addCocoapodsBlock( """ framework { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt index f6a26d9fc41..734dcfc872b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt @@ -404,7 +404,6 @@ open class KotlinCocoapodsPlugin : Plugin { project.registerTask(DUMMY_FRAMEWORK_TASK_NAME) { task -> task.frameworkName.convention(cocoapodsExtension.podFrameworkName) task.useStaticFramework.convention(cocoapodsExtension.podFrameworkIsStatic) - task.outputFramework.convention(project.layout.cocoapodsBuildDirs.framework.map { it.dir(task.frameworkName.get() + ".framework") }) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/tasks/DummyFrameworkTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/tasks/DummyFrameworkTask.kt index bfdf3cea2ac..5c599593df5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/tasks/DummyFrameworkTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/tasks/DummyFrameworkTask.kt @@ -8,15 +8,22 @@ package org.jetbrains.kotlin.gradle.tasks import org.gradle.api.DefaultTask 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.ProviderFactory import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.Optional import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.TaskAction 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.getFile +import org.jetbrains.kotlin.incremental.createDirectory import java.io.File +import javax.inject.Inject /** * 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. */ @DisableCachingByDefault -abstract class DummyFrameworkTask : DefaultTask() { +abstract class DummyFrameworkTask @Inject constructor( + objectFactory: ObjectFactory, + projectLayout: ProjectLayout +) : DefaultTask() { @get:Input abstract val frameworkName: Property @@ -39,7 +49,19 @@ abstract class DummyFrameworkTask : DefaultTask() { abstract val useStaticFramework: Property @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 @Deprecated("Use outputFramework", replaceWith = ReplaceWith("outputFramework.get().asFile")) @@ -88,6 +110,17 @@ abstract class DummyFrameworkTask : DefaultTask() { transform ) + private fun createDummyDsym() { + if (useStaticFramework.get()) { + return + } + + outputDsym.orNull?.asFile?.apply { + deleteRecursively() + mkdirs() + } + } + private fun copyFramework() { // Reset the destination directory with(outputFramework.getFile()) { @@ -106,6 +139,9 @@ abstract class DummyFrameworkTask : DefaultTask() { it } } + + // Create dSYM + createDummyDsym() }