From 3c0709cf4f1921965772c34890fd1ec279a3e2f2 Mon Sep 17 00:00:00 2001 From: Viacheslav Kormushkin Date: Fri, 11 Jun 2021 11:10:49 +0000 Subject: [PATCH] A new DSL for framework configuration within cocoapods block #KT-46479 #KT-35723 --- .../kotlin/gradle/native/CocoaPodsIT.kt | 43 ++++-- .../native/cocoapods/CocoapodsExtension.kt | 66 +++++++++- .../native/cocoapods/KotlinCocoapodsPlugin.kt | 123 ++++++++++-------- .../targets/native/tasks/CocoapodsTasks.kt | 14 +- .../dummy.framework/Headers/placeholder.h | 1 + .../dynamic/dummy.framework/Info.plist | Bin 0 -> 728 bytes .../dummy.framework/Modules/module.modulemap | 0 .../cocoapods/dynamic/dummy.framework/dummy | Bin 0 -> 49320 bytes .../dummy.framework/Headers/placeholder.h | 0 .../{ => static}/dummy.framework/Info.plist | Bin .../dummy.framework/Modules/module.modulemap | 6 + .../{ => static}/dummy.framework/dummy | Bin 12 files changed, 182 insertions(+), 71 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dynamic/dummy.framework/Headers/placeholder.h create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dynamic/dummy.framework/Info.plist rename libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/{ => dynamic}/dummy.framework/Modules/module.modulemap (100%) create mode 100755 libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dynamic/dummy.framework/dummy rename libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/{ => static}/dummy.framework/Headers/placeholder.h (100%) rename libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/{ => static}/dummy.framework/Info.plist (100%) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/static/dummy.framework/Modules/module.modulemap rename libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/{ => static}/dummy.framework/dummy (100%) 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 5ce078abaa6..f7d3652ab63 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 @@ -793,6 +793,35 @@ class CocoaPodsIT : BaseGradleIT() { } } + @Test + fun testUseDynamicFramework() { + with(project) { + gradleBuildScript().addPod(defaultPodName, produceGitBlock(defaultPodRepo)) + gradleBuildScript().appendToFrameworkBlock("isStatic=false") + hooks.addHook { + // Check that an output framework is a dynamic framework + val framework = fileInWorkingDir("build/cocoapods/framework/cocoapods.framework/cocoapods") + with(runProcess(listOf("file", framework.absolutePath), projectDir)) { + assertTrue(isSuccessful) + assertTrue(output.contains("dynamically linked shared library")) + } + } + + test( + "linkPodDebugFrameworkIOS", + "-Pkotlin.native.cocoapods.generate.wrapper=true" + ) + } + } + + @Test + fun testCocoapodsWithRegularFrameworkDefinition() { + with(project) { + gradleBuildScript().appendToKotlinBlock("iosX64(\"iOS\") {binaries.framework{}}") + testImport() + } + } + // paths private fun CompiledProject.url() = externalSources().resolve("url") @@ -980,6 +1009,8 @@ class CocoaPodsIT : BaseGradleIT() { private fun File.appendToCocoapodsBlock(str: String) = appendToKotlinBlock(str.wrap("cocoapods")) + private fun File.appendToFrameworkBlock(str: String) = appendToCocoapodsBlock(str.wrap("framework")) + private fun String.wrap(s: String): String = """ |$s { | $this @@ -1122,15 +1153,7 @@ class CocoaPodsIT : BaseGradleIT() { private fun Project.useCustomFrameworkName(subproject: String, frameworkName: String, iosAppLocation: String? = null) { // Change the name at the Gradle side. - gradleBuildScript(subproject).appendText( - """ - |kotlin { - | cocoapods { - | frameworkName = "$frameworkName" - | } - |} - """.trimMargin() - ) + gradleBuildScript(subproject).appendToFrameworkBlock("baseName = \"$frameworkName\"") // Change swift sources import if needed. if (iosAppLocation != null) { @@ -1289,7 +1312,6 @@ class CocoaPodsIT : BaseGradleIT() { spec.authors = '' spec.license = '' spec.summary = 'CocoaPods test library' - spec.static_framework = true spec.vendored_frameworks = "build/cocoapods/framework/${frameworkName ?: "kotlin_library"}.framework" spec.libraries = "c++" spec.module_name = "#{spec.name}_umbrella" @@ -1333,7 +1355,6 @@ class CocoaPodsIT : BaseGradleIT() { spec.authors = '' spec.license = '' spec.summary = 'CocoaPods test library' - spec.static_framework = true spec.vendored_frameworks = "build/cocoapods/framework/${frameworkName ?: "second_library"}.framework" spec.libraries = "c++" spec.module_name = "#{spec.name}_umbrella" 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 ff8222461b2..99e8da2e6fb 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 @@ -7,13 +7,16 @@ package org.jetbrains.kotlin.gradle.plugin.cocoapods import groovy.lang.Closure +import org.gradle.api.Action import org.gradle.api.Named import org.gradle.api.NamedDomainObjectSet import org.gradle.api.Project import org.gradle.api.tasks.* import org.gradle.util.ConfigureUtil +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.CocoapodsDependency.PodLocation.* import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType +import org.jetbrains.kotlin.gradle.plugin.mpp.Framework import java.io.File import java.net.URI @@ -85,6 +88,18 @@ open class CocoapodsExtension(private val project: Project) { @Input var homepage: String? = null + /** + * Configure framework of the pod built from this project. + */ + fun framework(configure: Framework.() -> Unit) = configureRegisteredFrameworks(configure) + + /** + * Configure framework of the pod built from this project. + */ + fun framework(configure: Action) = framework { + configure.execute(this) + } + @Nested val ios: PodspecPlatformSettings = PodspecPlatformSettings("ios") @@ -100,8 +115,18 @@ open class CocoapodsExtension(private val project: Project) { /** * Configure framework name of the pod built from this project. */ - @Input - var frameworkName: String = project.name.asValidFrameworkName() + @Deprecated("Use 'baseName' property within framework{} block to configure framework name") + var frameworkName: String + get() = frameworkNameInternal + set(value) { + configureRegisteredFrameworks { + baseName = value + } + } + + internal var frameworkNameInternal: String = project.name.asValidFrameworkName() + + internal var useDynamicFramework: Boolean = false /** * Configure custom Xcode Configurations to Native Build Types mapping @@ -210,6 +235,43 @@ open class CocoapodsExtension(private val project: Project) { ConfigureUtil.configure(configure, this) } + private fun configureRegisteredFrameworks(configure: Framework.() -> Unit) { + project.multiplatformExtension.supportedTargets().all { target -> + target.binaries.withType(Framework::class.java) { framework -> + framework.configure() + frameworkNameInternal = framework.baseName + useDynamicFramework = framework.isStatic.not() + if (useDynamicFramework) { + configureDynamicFrameworkLinking(framework) + } + } + } + } + + private fun configureDynamicFrameworkLinking(framework: Framework) { + project.findProperty(KotlinCocoapodsPlugin.FRAMEWORK_PATHS_PROPERTY)?.toString()?.let { args -> + framework.linkerOpts.addAll(args.splitQuotedArgs().map { "-F$it" }) + } + pods.all { pod -> + framework.linkerOpts("-framework", pod.moduleName) + if (project.shouldUseSyntheticProjectSettings && + KotlinCocoapodsPlugin.isAvailableToProduceSynthetic + ) { + framework.linkTaskProvider.configure { task -> + + val podBuildTaskProvider = project.getPodBuildTaskProvider(framework.target, pod) + task.inputs.file(podBuildTaskProvider.map { it.buildSettingsFile }) + task.dependsOn(podBuildTaskProvider) + + task.doFirst { _ -> + val podBuildSettings = project.getPodBuildSettingsProperties(framework.target, pod) + framework.linkerOpts.addAll(podBuildSettings.frameworkSearchPaths.map { "-F$it" }) + } + } + } + } + } + data class CocoapodsDependency( private val name: String, @get:Input var moduleName: String, 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 1851adfef0d..8525230c3a0 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 @@ -75,9 +75,6 @@ private fun String.toSetupBuildTaskName(pod: CocoapodsDependency): String = lowe this ) -fun KotlinNativeTarget.toSetupBuildTaskName(pod: CocoapodsDependency) = - this.toValidSDK.toSetupBuildTaskName(pod) - private fun String.toBuildDependenciesTaskName(pod: CocoapodsDependency): String = lowerCamelCaseName( KotlinCocoapodsPlugin.POD_BUILD_TASK_NAME, pod.name.asValidTaskName(), @@ -90,41 +87,72 @@ private val CocoapodsDependency.toPodDownloadTaskName: String name.asValidTaskName() ) +internal val Project.shouldUseSyntheticProjectSettings: Boolean + get() = (findProperty(KotlinCocoapodsPlugin.TARGET_PROPERTY) == null && + findProperty(KotlinCocoapodsPlugin.CONFIGURATION_PROPERTY) == null) private val KotlinNativeTarget.toValidSDK: String get() = when (konanTarget) { - IOS_X64 -> "iphonesimulator" + IOS_X64, IOS_SIMULATOR_ARM64 -> "iphonesimulator" IOS_ARM32, IOS_ARM64 -> "iphoneos" - WATCHOS_X86, WATCHOS_X64 -> "watchsimulator" + WATCHOS_X86, WATCHOS_X64, WATCHOS_SIMULATOR_ARM64 -> "watchsimulator" WATCHOS_ARM32, WATCHOS_ARM64 -> "watchos" - TVOS_X64 -> "appletvsimulator" + TVOS_X64, TVOS_SIMULATOR_ARM64 -> "appletvsimulator" TVOS_ARM64 -> "appletvos" - MACOS_X64 -> "macosx" + MACOS_X64, MACOS_ARM64 -> "macosx" else -> throw IllegalArgumentException("Bad target ${konanTarget.name}.") } -open class KotlinCocoapodsPlugin : Plugin { - fun KotlinMultiplatformExtension.supportedTargets() = targets - .withType(KotlinNativeTarget::class.java) - .matching { it.konanTarget.family.isAppleFamily } +internal fun Project.getPodBuildTaskProvider( + target: KotlinNativeTarget, + pod: CocoapodsDependency +): TaskProvider { + return tasks.named(target.toValidSDK.toBuildDependenciesTaskName(pod), PodBuildTask::class.java) +} - /** - * Splits a string using a whitespace characters as delimiters. - * Ignores whitespaces in quotes and drops quotes, e.g. a string - * `foo "bar baz" qux="quux"` will be split into ["foo", "bar baz", "qux=quux"]. - */ - private fun String.splitQuotedArgs(): List = - Regex("""(?:[^\s"]|(?:"[^"]*"))+""").findAll(this).map { - it.value.replace("\"", "") - }.toList() +internal fun Project.getPodBuildSettingsProperties( + target: KotlinNativeTarget, + pod: CocoapodsDependency +): PodBuildSettingsProperties { + return getPodBuildTaskProvider(target, pod).get().buildSettingsFile.get() + .reader() + .use { + PodBuildSettingsProperties.readSettingsFromReader(it) + } +} + +internal val PodBuildSettingsProperties.frameworkSearchPaths: List + get() { + val frameworkPathsSelfIncluding = mutableListOf() + frameworkPathsSelfIncluding += configurationBuildDir.trimQuotes() + frameworkPaths?.let { frameworkPathsSelfIncluding.addAll(it.splitQuotedArgs()) } + return frameworkPathsSelfIncluding + } + +/** + * Splits a string using a whitespace characters as delimiters. + * Ignores whitespaces in quotes and drops quotes, e.g. a string + * `foo "bar baz" qux="quux"` will be split into ["foo", "bar baz", "qux=quux"]. + */ +internal fun String.splitQuotedArgs(): List = + Regex("""(?:[^\s"]|(?:"[^"]*"))+""").findAll(this).map { + it.value.replace("\"", "") + }.toList() + +internal fun KotlinMultiplatformExtension.supportedTargets() = targets + .withType(KotlinNativeTarget::class.java) + .matching { it.konanTarget.family.isAppleFamily } + + +open class KotlinCocoapodsPlugin : Plugin { private fun KotlinMultiplatformExtension.targetsForPlatform(requestedPlatform: KonanTarget) = supportedTargets().matching { it.konanTarget == requestedPlatform } private fun createDefaultFrameworks(kotlinExtension: KotlinMultiplatformExtension, cocoapodsExtension: CocoapodsExtension) { kotlinExtension.supportedTargets().all { target -> - target.binaries.framework { - baseNameProvider = project.provider { cocoapodsExtension.frameworkName } + target.binaries.framework(POD_FRAMEWORK_PREFIX) { + baseName = cocoapodsExtension.frameworkNameInternal isStatic = true } } @@ -165,7 +193,7 @@ open class KotlinCocoapodsPlugin : Plugin { fatTargets.forEach { _, targets -> targets.singleOrNull()?.let { - task.from(it.binaries.getFramework(requestedBuildType)) + task.from(it.binaries.getFramework(POD_FRAMEWORK_PREFIX, requestedBuildType)) } } } @@ -184,7 +212,7 @@ open class KotlinCocoapodsPlugin : Plugin { check(targets.isNotEmpty()) { "The project doesn't contain a target for the requested platform: `${requestedPlatform.visibleName}`" } check(targets.size == 1) { "The project has more than one target for the requested platform: `${requestedPlatform.visibleName}`" } - val frameworkLinkTask = targets.single().binaries.getFramework(requestedBuildType).linkTaskProvider + val frameworkLinkTask = targets.single().binaries.getFramework(POD_FRAMEWORK_PREFIX, requestedBuildType).linkTaskProvider project.createSyncFrameworkTask(frameworkLinkTask.map { it.destinationDir }, frameworkLinkTask) } @@ -200,7 +228,7 @@ open class KotlinCocoapodsPlugin : Plugin { check(requestedBuildType != null) { """ - Could not identify build type for Kotlin framework '${cocoapodsExtension.frameworkName}' built via cocoapods plugin with CONFIGURATION=$xcodeConfiguration. + Could not identify build type for Kotlin framework '${cocoapodsExtension.frameworkNameInternal}' built via cocoapods plugin with CONFIGURATION=$xcodeConfiguration. Add xcodeConfigurationToNativeBuildType["$xcodeConfiguration"]=NativeBuildType.DEBUG or xcodeConfigurationToNativeBuildType["$xcodeConfiguration"]=NativeBuildType.RELEASE to cocoapods plugin configuration """.trimIndent() } @@ -259,14 +287,11 @@ open class KotlinCocoapodsPlugin : Plugin { _extraOptsProp.addAll(project.provider { pod.extraOpts }) } - if ( + if (project.shouldUseSyntheticProjectSettings && isAvailableToProduceSynthetic - && project.findProperty(TARGET_PROPERTY) == null - && project.findProperty(CONFIGURATION_PROPERTY) == null ) { - val podBuildTaskProvider = - project.tasks.named(target.toValidSDK.toBuildDependenciesTaskName(pod), PodBuildTask::class.java) - interopTask.inputs.file(podBuildTaskProvider.get().buildSettingsFile) + val podBuildTaskProvider = project.getPodBuildTaskProvider(target, pod) + interopTask.inputs.file(podBuildTaskProvider.map {it.buildSettingsFile }) interopTask.dependsOn(podBuildTaskProvider) } @@ -286,36 +311,21 @@ open class KotlinCocoapodsPlugin : Plugin { // Since we cannot expand the configuration phase of interop tasks // receiving the required environment variables happens on execution phase. // TODO This needs to be fixed to improve UP-TO-DATE checks. - if ( + if (project.shouldUseSyntheticProjectSettings && isAvailableToProduceSynthetic - && project.findProperty(TARGET_PROPERTY) == null - && project.findProperty(CONFIGURATION_PROPERTY) == null ) { - val podBuildTaskProvider = - project.tasks.named(target.toValidSDK.toBuildDependenciesTaskName(pod), PodBuildTask::class.java) - val buildSettings = - podBuildTaskProvider.get().buildSettingsFile.get() - .reader() - .use { - PodBuildSettingsProperties.readSettingsFromReader(it) - } + val podBuildSettings = project.getPodBuildSettingsProperties(target, pod) - buildSettings.cflags?.let { args -> + podBuildSettings.cflags?.let { args -> // Xcode quotes around paths with spaces. // Here and below we need to split such paths taking this into account. interop.compilerOpts.addAll(args.splitQuotedArgs()) } - buildSettings.headerPaths?.let { args -> + podBuildSettings.headerPaths?.let { args -> interop.compilerOpts.addAll(args.splitQuotedArgs().map { "-I$it" }) } - val frameworkPaths = buildSettings.frameworkPaths - val configurationBuildDir = buildSettings.configurationBuildDir - val frameworkPathsSelfIncluding = mutableListOf() - frameworkPathsSelfIncluding += configurationBuildDir.trimQuotes() - frameworkPaths?.let { frameworkPathsSelfIncluding.addAll(it.splitQuotedArgs()) } - - interop.compilerOpts.addAll(frameworkPathsSelfIncluding.map { "-F$it" }) + interop.compilerOpts.addAll(podBuildSettings.frameworkSearchPaths.map { "-F$it" }) } } } @@ -328,7 +338,8 @@ open class KotlinCocoapodsPlugin : Plugin { cocoapodsExtension: CocoapodsExtension ) { project.tasks.register(DUMMY_FRAMEWORK_TASK_NAME, DummyFrameworkTask::class.java) { - it.frameworkName = project.provider { cocoapodsExtension.frameworkName } + it.frameworkName = project.provider { cocoapodsExtension.frameworkNameInternal } + it.useDynamicFramework = project.provider { cocoapodsExtension.useDynamicFramework } } } @@ -348,7 +359,7 @@ open class KotlinCocoapodsPlugin : Plugin { it.license.set(cocoapodsExtension.license) it.authors.set(cocoapodsExtension.authors) it.summary.set(cocoapodsExtension.summary) - it.frameworkName = project.provider { cocoapodsExtension.frameworkName } + it.frameworkName = project.provider { cocoapodsExtension.frameworkNameInternal } it.ios = project.provider { cocoapodsExtension.ios } it.osx = project.provider { cocoapodsExtension.osx } it.tvos = project.provider { cocoapodsExtension.tvos } @@ -370,7 +381,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.frameworkName = project.provider { cocoapodsExtension.frameworkNameInternal } it.onlyIf { isAvailableToProduceSynthetic } it.dependsOn(podspecTaskProvider) } @@ -461,7 +472,7 @@ open class KotlinCocoapodsPlugin : Plugin { it.pod = project.provider { pod } it.sdk = project.provider { sdk } it.podsXcodeProjDir = podGenTaskProvider.map { podGen -> podGen.podsXcodeProjDir.get() } - it.frameworkName = project.provider { cocoapodsExtension.frameworkName } + it.frameworkName = project.provider { cocoapodsExtension.frameworkNameInternal } it.dependsOn(podGenTaskProvider) it.onlyIf { isAvailableToProduceSynthetic } } @@ -531,6 +542,7 @@ open class KotlinCocoapodsPlugin : Plugin { } override fun apply(project: Project): Unit = with(project) { + pluginManager.withPlugin("kotlin-multiplatform") { val kotlinExtension = project.multiplatformExtension val cocoapodsExtension = CocoapodsExtension(this) @@ -565,6 +577,7 @@ open class KotlinCocoapodsPlugin : Plugin { companion object { const val COCOAPODS_EXTENSION_NAME = "cocoapods" const val TASK_GROUP = "CocoaPods" + const val POD_FRAMEWORK_PREFIX = "pod" const val SYNC_TASK_NAME = "syncFramework" const val POD_SPEC_TASK_NAME = "podspec" const val DUMMY_FRAMEWORK_TASK_NAME = "generateDummyFramework" 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 6791c4bfc5d..3dfd892d9ed 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 @@ -124,7 +124,6 @@ open class PodspecTask : DefaultTask() { | spec.license = '${license.getOrEmpty()}' | spec.summary = '${summary.getOrEmpty()}' | - | spec.static_framework = true | spec.vendored_frameworks = "$frameworkDir/${frameworkName.get()}.framework" | spec.libraries = "c++" | spec.module_name = "#{spec.name}_umbrella" @@ -215,9 +214,18 @@ open class DummyFrameworkTask : DefaultTask() { @Input lateinit var frameworkName: Provider + @Input + lateinit var useDynamicFramework: Provider + private val frameworkDir: File get() = destinationDir.resolve("${frameworkName.get()}.framework") + private val dummyFrameworkPath: String + get() { + val staticOrDynamic = if (useDynamicFramework.get()) "dynamic" else "static" + return "/cocoapods/$staticOrDynamic/dummy.framework/" + } + private fun copyResource(from: String, to: File) { to.parentFile.mkdirs() to.outputStream().use { file -> @@ -240,7 +248,7 @@ open class DummyFrameworkTask : DefaultTask() { private fun copyFrameworkFile(relativeFrom: String, relativeTo: String = relativeFrom) = copyResource( - "/cocoapods/dummy.framework/$relativeFrom", + "$dummyFrameworkPath$relativeFrom", frameworkDir.resolve(relativeTo) ) @@ -249,7 +257,7 @@ open class DummyFrameworkTask : DefaultTask() { relativeTo: String = relativeFrom, transform: (String) -> String = { it } ) = copyTextResource( - "/cocoapods/dummy.framework/$relativeFrom", + "$dummyFrameworkPath$relativeFrom", frameworkDir.resolve(relativeTo), transform ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dynamic/dummy.framework/Headers/placeholder.h b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dynamic/dummy.framework/Headers/placeholder.h new file mode 100644 index 00000000000..b9a2e96d008 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dynamic/dummy.framework/Headers/placeholder.h @@ -0,0 +1 @@ +// Autogenerated placeholder header. Do not edit manually. \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dynamic/dummy.framework/Info.plist b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dynamic/dummy.framework/Info.plist new file mode 100644 index 0000000000000000000000000000000000000000..74fe6bd59a43f2bb6fdfffce0f018bb90aa372c9 GIT binary patch literal 728 zcmYjO%Wl&^6rDS~%Byi33T%=@DU8)Vds5_r_)t>7IiBk=H=5$Yzq31<3wd$M%9oM(} zhLA~}iD_5SO0MlOKAbG0XsI;bcyEkH(@c#UW523YWA$@Ii^`#JN70(5YtdGcljjp^ z%wcwDZ>ouTPp?ET$xK=%Hsb?BSkNmC`Z8obwMImVc%;oZ3mEO|g}kyZHK?Oop=}Rd z#8Hf+S`_nIxwcbPB{6?=qsi($cld8xk|C^^t}PPJ<5Y~Qc+5njVNEaP=t##Ow9HN1_R Rco)S7!ziN%Nlp^p{}1yc;i>=t literal 0 HcmV?d00001 diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Modules/module.modulemap b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dynamic/dummy.framework/Modules/module.modulemap similarity index 100% rename from libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Modules/module.modulemap rename to libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dynamic/dummy.framework/Modules/module.modulemap diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dynamic/dummy.framework/dummy b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dynamic/dummy.framework/dummy new file mode 100755 index 0000000000000000000000000000000000000000..e3fc47916e616cc84dcbeabc5caa74c442482dfc GIT binary patch literal 49320 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 literal 0 HcmV?d00001 diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Headers/placeholder.h b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/static/dummy.framework/Headers/placeholder.h similarity index 100% rename from libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Headers/placeholder.h rename to libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/static/dummy.framework/Headers/placeholder.h diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Info.plist b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/static/dummy.framework/Info.plist similarity index 100% rename from libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/Info.plist rename to libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/static/dummy.framework/Info.plist diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/static/dummy.framework/Modules/module.modulemap b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/static/dummy.framework/Modules/module.modulemap new file mode 100644 index 00000000000..95dec0ac93b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/static/dummy.framework/Modules/module.modulemap @@ -0,0 +1,6 @@ +framework module dummy { + umbrella header "placeholder.h" + + export * + module * { export * } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/dummy b/libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/static/dummy.framework/dummy similarity index 100% rename from libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/dummy.framework/dummy rename to libraries/tools/kotlin-gradle-plugin/src/main/resources/cocoapods/static/dummy.framework/dummy