Skip to content

Commit fd51b6e

Browse files
timofey-soloninSpace Team
authored and
Space Team
committed
Allow KotlinNativeLink task's configurations to consume Uklibs
^KT-74005
1 parent 4db8bf1 commit fd51b6e

File tree

3 files changed

+74
-2
lines changed

3 files changed

+74
-2
lines changed

libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibConsumptionIT.kt

+43
Original file line numberDiff line numberDiff line change
@@ -557,4 +557,47 @@ class UklibConsumptionIT : KGPBaseTest() {
557557
)
558558
}
559559
}
560+
561+
@GradleTest
562+
fun `uklib consumption - linkage configurations consume uklibs`(
563+
version: GradleVersion,
564+
) {
565+
val direct = project("empty", version) {
566+
addKgpToBuildScriptCompilationClasspath()
567+
buildScriptInjection {
568+
project.setUklibPublicationStrategy()
569+
project.applyMultiplatform {
570+
linuxArm64()
571+
sourceSets.commonMain.get().compileSource(
572+
"""
573+
class Producer
574+
class ExportMe
575+
""".trimIndent()
576+
)
577+
}
578+
}
579+
}.publish(publisherConfiguration = PublisherConfiguration(group = "producer"))
580+
581+
project("empty", version) {
582+
addKgpToBuildScriptCompilationClasspath()
583+
addPublishedProjectToRepositories(direct)
584+
buildScriptInjection {
585+
project.setUklibResolutionStrategy()
586+
project.applyMultiplatform {
587+
linuxArm64 {
588+
binaries.staticLib {
589+
export(direct.rootCoordinate)
590+
}
591+
}
592+
sourceSets.commonMain.get().compileSource("fun consume(producer: Producer) {}")
593+
sourceSets.commonMain.get().dependencies {
594+
api(direct.rootCoordinate)
595+
}
596+
}
597+
}
598+
599+
// FIXME: Validate properly we resolved Uklib in the export and -library configurations
600+
build("linkDebugStaticLinuxArm64")
601+
}
602+
}
560603
}

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/uklibs/consumption/UklibConsumptionSetupAction.kt

+28-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.uklibs.uklibFragmentPlatformAttrib
1515
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
1616
import org.jetbrains.kotlin.gradle.plugin.*
1717
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
18+
import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractExecutable
19+
import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractNativeLibrary
20+
import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
1821
import org.jetbrains.kotlin.gradle.plugin.mpp.InternalKotlinCompilation
22+
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
1923
import org.jetbrains.kotlin.gradle.plugin.mpp.internal
2024
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages.KOTLIN_API
2125
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages.KOTLIN_METADATA
@@ -28,6 +32,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.uklibs.Uklib
2832
import org.jetbrains.kotlin.gradle.plugin.mpp.uklibs.UklibFragmentPlatformAttribute
2933
import org.jetbrains.kotlin.gradle.plugin.sources.internal
3034
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
35+
import org.jetbrains.kotlin.gradle.targets.native.resolvableApiConfiguration
3136
import org.jetbrains.kotlin.gradle.utils.javaSourceSets
3237

3338
internal val UklibConsumptionSetupAction = KotlinProjectSetupAction {
@@ -91,7 +96,6 @@ private fun Project.allowPlatformCompilationsToResolvePlatformCompilationArtifac
9196
*/
9297
/**
9398
* FIXME: This set of configurations is not correct. At the least:
94-
* - KotlinNativeTarget binaries have additional export configuration that must be able to resolve a Uklib
9599
* - hostSpecificMetadataConfiguration probably must be able to resolve leniently
96100
*/
97101
target.compilations.configureEach { compilation ->
@@ -109,6 +113,29 @@ private fun Project.allowPlatformCompilationsToResolvePlatformCompilationArtifac
109113
}
110114
}
111115

116+
if (target is KotlinNativeTarget) {
117+
target.binaries.all {
118+
val uklibResolvingConfiguration = when (it) {
119+
is Framework -> it.exportConfigurationName
120+
is AbstractNativeLibrary -> it.exportConfigurationName
121+
is AbstractExecutable -> {
122+
null
123+
}
124+
}
125+
if (uklibResolvingConfiguration != null) {
126+
configurations.named(uklibResolvingConfiguration).configure {
127+
it.applyUklibAttributes(usageByName(KOTLIN_UKLIB_API), uklibFragmentPlatformAttribute)
128+
}
129+
}
130+
}
131+
target.compilations.configureEach { compilation ->
132+
compilation.resolvableApiConfiguration().applyUklibAttributes(
133+
usageByName(KOTLIN_UKLIB_API),
134+
uklibFragmentPlatformAttribute,
135+
)
136+
}
137+
}
138+
112139
if (target is KotlinJvmTarget) {
113140
/**
114141
* FIXME: Unit test that Java base plugin resolvable configurations can consume Uklibs. Right now this is only covered by crude IT

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotilnNativeConfigureBinariesSideEffect.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,10 @@ internal val KotlinNativeConfigureBinariesSideEffect = KotlinTargetSideEffect<Ko
8686
* Creates a resolvable configuration from non-resolvable "api" of [KotlinNativeCompilation]
8787
* Kotlin Native requires that only API dependencies can be exported. So we need to resolve API-only dependencies
8888
* and exported dependencies to check that.
89+
*
90+
* FIXME: KT-76704 consider removing this configuration and the validation that exported klibs are present in the api scope configuration
8991
*/
90-
private fun KotlinNativeCompilation.resolvableApiConfiguration(): Configuration {
92+
internal fun KotlinNativeCompilation.resolvableApiConfiguration(): Configuration {
9193
val apiConfiguration = compilation.internal.configurations.apiConfiguration
9294
return project
9395
.configurations.maybeCreateResolvable(lowerCamelCaseName("resolvable", apiConfiguration.name)) {

0 commit comments

Comments
 (0)