CocoaPods Gradle plugin: Support incremental task execution when switching between Xcode and terminal
#KT-37511
This commit is contained in:
committed by
Space
parent
91ecaa32e3
commit
fa2e787f76
+18
@@ -885,6 +885,24 @@ class CocoaPodsIT : BaseGradleIT() {
|
|||||||
fun testPodDependencyInUnitTests() =
|
fun testPodDependencyInUnitTests() =
|
||||||
getProjectByName(cocoapodsTestsProjectName).testWithWrapper(":iosX64Test")
|
getProjectByName(cocoapodsTestsProjectName).testWithWrapper(":iosX64Test")
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCinteropUpToDate() {
|
||||||
|
project.gradleBuildScript().addPod(defaultPodName, produceGitBlock(defaultPodRepo))
|
||||||
|
project.testImport()
|
||||||
|
hooks.addHook {
|
||||||
|
assertTasksUpToDate(
|
||||||
|
defaultCinteropTaskName
|
||||||
|
)
|
||||||
|
}
|
||||||
|
project.test(
|
||||||
|
"syncFramework",
|
||||||
|
"-Pkotlin.native.cocoapods.platform=iphonesimulator",
|
||||||
|
"-Pkotlin.native.cocoapods.archs=x86_64",
|
||||||
|
"-Pkotlin.native.cocoapods.configuration=Debug",
|
||||||
|
"-Pkotlin.native.cocoapods.generate.wrapper=true"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// paths
|
// paths
|
||||||
|
|
||||||
private fun CompiledProject.url() = externalSources().resolve("url")
|
private fun CompiledProject.url() = externalSources().resolve("url")
|
||||||
|
|||||||
+17
-16
@@ -251,26 +251,27 @@ open class CocoapodsExtension(private val project: Project) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal fun configureLinkingOptions(binary: NativeBinary, setRPath: Boolean = false) {
|
internal fun configureLinkingOptions(binary: NativeBinary, setRPath: Boolean = false) {
|
||||||
project.findProperty(KotlinCocoapodsPlugin.FRAMEWORK_PATHS_PROPERTY)?.toString()?.let { args ->
|
|
||||||
binary.linkerOpts.addAll(args.splitQuotedArgs().map { "-F$it" })
|
|
||||||
}
|
|
||||||
pods.all { pod ->
|
pods.all { pod ->
|
||||||
binary.linkerOpts("-framework", pod.moduleName)
|
binary.linkerOpts("-framework", pod.moduleName)
|
||||||
if (project.shouldUseSyntheticProjectSettings &&
|
|
||||||
KotlinCocoapodsPlugin.isAvailableToProduceSynthetic
|
|
||||||
) {
|
|
||||||
binary.linkTaskProvider.configure { task ->
|
|
||||||
|
|
||||||
val podBuildTaskProvider = project.getPodBuildTaskProvider(binary.target, pod)
|
check(KotlinCocoapodsPlugin.isAvailableToProduceSynthetic) {
|
||||||
task.inputs.file(podBuildTaskProvider.map { it.buildSettingsFile })
|
"""
|
||||||
task.dependsOn(podBuildTaskProvider)
|
Dependency on pods requires cocoapods-generate plugin to be installed.
|
||||||
|
Please install it by executing 'gem install cocoapods-generate' in terminal.
|
||||||
|
""".trimMargin()
|
||||||
|
}
|
||||||
|
|
||||||
task.doFirst { _ ->
|
binary.linkTaskProvider.configure { task ->
|
||||||
val podBuildSettings = project.getPodBuildSettingsProperties(binary.target, pod)
|
|
||||||
binary.linkerOpts.addAll(podBuildSettings.frameworkSearchPaths.map { "-F$it" })
|
val podBuildTaskProvider = project.getPodBuildTaskProvider(binary.target, pod)
|
||||||
if (setRPath) {
|
task.inputs.file(podBuildTaskProvider.map { it.buildSettingsFile })
|
||||||
binary.linkerOpts.addAll(podBuildSettings.frameworkSearchPaths.flatMap { listOf("-rpath", it) })
|
task.dependsOn(podBuildTaskProvider)
|
||||||
}
|
|
||||||
|
task.doFirst { _ ->
|
||||||
|
val podBuildSettings = project.getPodBuildSettingsProperties(binary.target, pod)
|
||||||
|
binary.linkerOpts.addAll(podBuildSettings.frameworkSearchPaths.map { "-F$it" })
|
||||||
|
if (setRPath) {
|
||||||
|
binary.linkerOpts.addAll(podBuildSettings.frameworkSearchPaths.flatMap { listOf("-rpath", it) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+39
-47
@@ -18,9 +18,6 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.addExtension
|
import org.jetbrains.kotlin.gradle.plugin.addExtension
|
||||||
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.CocoapodsDependency
|
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.CocoapodsDependency
|
||||||
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.CocoapodsDependency.PodLocation.*
|
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.CocoapodsDependency.PodLocation.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.ARCHS_PROPERTY
|
|
||||||
import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.CONFIGURATION_PROPERTY
|
|
||||||
import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Companion.PLATFORM_PROPERTY
|
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
|
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.TestExecutable
|
import org.jetbrains.kotlin.gradle.plugin.mpp.TestExecutable
|
||||||
@@ -92,11 +89,6 @@ private val CocoapodsDependency.toPodDownloadTaskName: String
|
|||||||
name.asValidTaskName()
|
name.asValidTaskName()
|
||||||
)
|
)
|
||||||
|
|
||||||
internal val Project.shouldUseSyntheticProjectSettings: Boolean
|
|
||||||
get() = (project.findProperty(PLATFORM_PROPERTY) == null &&
|
|
||||||
project.findProperty(ARCHS_PROPERTY) == null &&
|
|
||||||
project.findProperty(CONFIGURATION_PROPERTY) == null)
|
|
||||||
|
|
||||||
private val KotlinNativeTarget.toValidSDK: String
|
private val KotlinNativeTarget.toValidSDK: String
|
||||||
get() = when (konanTarget) {
|
get() = when (konanTarget) {
|
||||||
IOS_X64, IOS_SIMULATOR_ARM64 -> "iphonesimulator"
|
IOS_X64, IOS_SIMULATOR_ARM64 -> "iphonesimulator"
|
||||||
@@ -231,6 +223,21 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
val platforms = project.findProperty(PLATFORM_PROPERTY)?.toString()?.split(",", " ")?.filter { it.isNotBlank() }
|
val platforms = project.findProperty(PLATFORM_PROPERTY)?.toString()?.split(",", " ")?.filter { it.isNotBlank() }
|
||||||
val archs = project.findProperty(ARCHS_PROPERTY)?.toString()?.split(",", " ")?.filter { it.isNotBlank() }
|
val archs = project.findProperty(ARCHS_PROPERTY)?.toString()?.split(",", " ")?.filter { it.isNotBlank() }
|
||||||
|
|
||||||
|
if (
|
||||||
|
project.findProperty(CFLAGS_PROPERTY) != null ||
|
||||||
|
project.findProperty(FRAMEWORK_PATHS_PROPERTY) != null ||
|
||||||
|
project.findProperty(HEADER_PATHS_PROPERTY) != null
|
||||||
|
) {
|
||||||
|
logger.warn(
|
||||||
|
"""
|
||||||
|
Properties
|
||||||
|
kotlin.native.cocoapods.cflags
|
||||||
|
kotlin.native.cocoapods.paths.frameworks
|
||||||
|
kotlin.native.cocoapods.paths.headers
|
||||||
|
are not supported and will be ignored since Cocoapods plugin generates all required properties automatically.
|
||||||
|
""".trimIndent())
|
||||||
|
}
|
||||||
|
|
||||||
if (platforms == null || archs == null) {
|
if (platforms == null || archs == null) {
|
||||||
check(project.findProperty(TARGET_PROPERTY) == null) {
|
check(project.findProperty(TARGET_PROPERTY) == null) {
|
||||||
"""
|
"""
|
||||||
@@ -292,6 +299,13 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
// to avoid showing it in the `tasks` output.
|
// to avoid showing it in the `tasks` output.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check(isAvailableToProduceSynthetic) {
|
||||||
|
"""
|
||||||
|
Dependency on pods requires cocoapods-generate plugin to be installed.
|
||||||
|
Please install it by executing 'gem install cocoapods-generate' in terminal.
|
||||||
|
""".trimMargin()
|
||||||
|
}
|
||||||
|
|
||||||
kotlinExtension.supportedTargets().all { target ->
|
kotlinExtension.supportedTargets().all { target ->
|
||||||
target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME).cinterops.create(pod.moduleName) { interop ->
|
target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME).cinterops.create(pod.moduleName) { interop ->
|
||||||
|
|
||||||
@@ -305,46 +319,27 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
_extraOptsProp.addAll(project.provider { pod.extraOpts })
|
_extraOptsProp.addAll(project.provider { pod.extraOpts })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (project.shouldUseSyntheticProjectSettings &&
|
val podBuildTaskProvider = project.getPodBuildTaskProvider(target, pod)
|
||||||
isAvailableToProduceSynthetic
|
interopTask.inputs.file(podBuildTaskProvider.map {it.buildSettingsFile })
|
||||||
) {
|
interopTask.dependsOn(podBuildTaskProvider)
|
||||||
val podBuildTaskProvider = project.getPodBuildTaskProvider(target, pod)
|
|
||||||
interopTask.inputs.file(podBuildTaskProvider.map {it.buildSettingsFile })
|
|
||||||
interopTask.dependsOn(podBuildTaskProvider)
|
|
||||||
}
|
|
||||||
|
|
||||||
project.findProperty(CFLAGS_PROPERTY)?.toString()?.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())
|
|
||||||
}
|
|
||||||
project.findProperty(HEADER_PATHS_PROPERTY)?.toString()?.let { args ->
|
|
||||||
interop.compilerOpts.addAll(args.splitQuotedArgs().map { "-I$it" })
|
|
||||||
}
|
|
||||||
project.findProperty(FRAMEWORK_PATHS_PROPERTY)?.toString()?.let { args ->
|
|
||||||
interop.compilerOpts.addAll(args.splitQuotedArgs().map { "-F$it" })
|
|
||||||
}
|
|
||||||
|
|
||||||
interopTask.doFirst { _ ->
|
interopTask.doFirst { _ ->
|
||||||
// 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 (project.shouldUseSyntheticProjectSettings &&
|
val podBuildSettings = project.getPodBuildSettingsProperties(target, pod)
|
||||||
isAvailableToProduceSynthetic
|
|
||||||
) {
|
|
||||||
val podBuildSettings = project.getPodBuildSettingsProperties(target, pod)
|
|
||||||
|
|
||||||
podBuildSettings.cflags?.let { args ->
|
podBuildSettings.cflags?.let { args ->
|
||||||
// Xcode quotes around paths with spaces.
|
// Xcode quotes around paths with spaces.
|
||||||
// Here and below we need to split such paths taking this into account.
|
// Here and below we need to split such paths taking this into account.
|
||||||
interop.compilerOpts.addAll(args.splitQuotedArgs())
|
interop.compilerOpts.addAll(args.splitQuotedArgs())
|
||||||
}
|
|
||||||
podBuildSettings.headerPaths?.let { args ->
|
|
||||||
interop.compilerOpts.addAll(args.splitQuotedArgs().map { "-I$it" })
|
|
||||||
}
|
|
||||||
|
|
||||||
interop.compilerOpts.addAll(podBuildSettings.frameworkSearchPaths.map { "-F$it" })
|
|
||||||
}
|
}
|
||||||
|
podBuildSettings.headerPaths?.let { args ->
|
||||||
|
interop.compilerOpts.addAll(args.splitQuotedArgs().map { "-I$it" })
|
||||||
|
}
|
||||||
|
|
||||||
|
interop.compilerOpts.addAll(podBuildSettings.frameworkSearchPaths.map { "-F$it" })
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -589,12 +584,9 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
|
|||||||
if (HostManager.hostIsMac && !isAvailableToProduceSynthetic) {
|
if (HostManager.hostIsMac && !isAvailableToProduceSynthetic) {
|
||||||
logger.quiet(
|
logger.quiet(
|
||||||
"""
|
"""
|
||||||
To take advantage of the new functionality for Cocoapods Integration like synchronizing with the Xcode project
|
Dependency on pods requires cocoapods-generate plugin to be installed.
|
||||||
and supporting dependencies on pods, please install the `cocoapods-generate` plugin for CocoaPods
|
If you plan to add dependencies on third party pods, don't forget to install it by executing 'gem install cocoapods-generate' in terminal.
|
||||||
by calling `gem install cocoapods-generate` in terminal.
|
""".trimIndent()
|
||||||
|
|
||||||
More details are available by https://github.com/square/cocoapods-generate
|
|
||||||
""".trimIndent()
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
createInterops(project, kotlinExtension, cocoapodsExtension)
|
createInterops(project, kotlinExtension, cocoapodsExtension)
|
||||||
|
|||||||
+1
-4
@@ -149,10 +149,7 @@ open class PodspecTask : DefaultTask() {
|
|||||||
| "$gradleCommand" -p "${'$'}REPO_ROOT" ${'$'}KOTLIN_PROJECT_PATH:$SYNC_TASK_NAME \
|
| "$gradleCommand" -p "${'$'}REPO_ROOT" ${'$'}KOTLIN_PROJECT_PATH:$SYNC_TASK_NAME \
|
||||||
| -P${KotlinCocoapodsPlugin.PLATFORM_PROPERTY}=${'$'}PLATFORM_NAME \
|
| -P${KotlinCocoapodsPlugin.PLATFORM_PROPERTY}=${'$'}PLATFORM_NAME \
|
||||||
| -P${KotlinCocoapodsPlugin.ARCHS_PROPERTY}="${'$'}ARCHS" \
|
| -P${KotlinCocoapodsPlugin.ARCHS_PROPERTY}="${'$'}ARCHS" \
|
||||||
| -P${KotlinCocoapodsPlugin.CONFIGURATION_PROPERTY}=${'$'}CONFIGURATION \
|
| -P${KotlinCocoapodsPlugin.CONFIGURATION_PROPERTY}=${'$'}CONFIGURATION
|
||||||
| -P${KotlinCocoapodsPlugin.CFLAGS_PROPERTY}="${'$'}OTHER_CFLAGS" \
|
|
||||||
| -P${KotlinCocoapodsPlugin.HEADER_PATHS_PROPERTY}="${'$'}HEADER_SEARCH_PATHS" \
|
|
||||||
| -P${KotlinCocoapodsPlugin.FRAMEWORK_PATHS_PROPERTY}="${'$'}FRAMEWORK_SEARCH_PATHS"
|
|
||||||
| SCRIPT
|
| SCRIPT
|
||||||
| }
|
| }
|
||||||
| ]
|
| ]
|
||||||
|
|||||||
Reference in New Issue
Block a user