diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/AbstractKotlinNativeBinary.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/AbstractKotlinNativeBinary.kt index f83b03361c4..25cf2996bcd 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/AbstractKotlinNativeBinary.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/AbstractKotlinNativeBinary.kt @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.gradle.plugin.experimental.ComponentWithBaseName import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeBinary import org.jetbrains.kotlin.gradle.plugin.experimental.sourcesets.KotlinNativeSourceSet import org.jetbrains.kotlin.gradle.plugin.experimental.tasks.KotlinNativeCompile +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.KonanTarget @@ -106,7 +107,7 @@ abstract class AbstractKotlinNativeBinary( // A configuration containing klibs. override val klibs = configurations.create(names.withPrefix("klibs")).apply { isCanBeConsumed = false - attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, Usage.JAVA_API)) + attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, KotlinUsages.KOTLIN_API)) attributes.attribute(CppBinary.DEBUGGABLE_ATTRIBUTE, debuggable) attributes.attribute(CppBinary.OPTIMIZED_ATTRIBUTE, optimized) attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.native) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/MatchingStrategies.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/MatchingStrategies.kt index 4f594d010f4..454577e8429 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/MatchingStrategies.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/MatchingStrategies.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.gradle.plugin.experimental.internal import org.gradle.api.attributes.* +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages open class Compatible: AttributeCompatibilityRule { override fun execute(details: CompatibilityCheckDetails) = details.compatible() @@ -44,17 +45,19 @@ open class UsageCompatibility: AttributeCompatibilityRule { when { requested == null -> compatible() - requested == Usage.JAVA_API && (provided == Usage.JAVA_API || provided == KotlinNativeUsage.KLIB) -> { - compatible() - } - requested == provided -> compatible() + requested in supportedRequestedUsages && provided in supportedProvidedUsages -> compatible() } } + + companion object { + val supportedRequestedUsages = listOf(KotlinUsages.KOTLIN_API, Usage.JAVA_API) + val supportedProvidedUsages = listOf(KotlinUsages.KOTLIN_API, Usage.JAVA_API, KotlinNativeUsage.KLIB) + } } open class UsageDisambiguation: AttributeDisambiguationRule { override fun execute(details: MultipleCandidatesDetails): Unit = with(details) { - val usagePriority = listOf(Usage.JAVA_API, KotlinNativeUsage.KLIB) + val usagePriority = listOf(KotlinUsages.KOTLIN_API, Usage.JAVA_API, KotlinNativeUsage.KLIB) usagePriority.forEach { usage -> val found = candidateValues.find { it.name == usage } if (found != null) { diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/OutputKind.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/OutputKind.kt index 0669248654e..8116ae21e18 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/OutputKind.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/OutputKind.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.gradle.plugin.experimental.internal import org.gradle.api.attributes.Usage import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeBinary +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.Family import org.jetbrains.kotlin.konan.target.KonanTarget @@ -42,9 +43,7 @@ enum class OutputKind( KotlinNativeLibraryImpl::class.java, 1, null, - // Use JAVA_API here because the MPP plugin uses this usage for all artifacts in 1.3-RC. - // TODO: Change to KOTLIN_API with such change is merged into big Kotlin's 1.3. - Usage.JAVA_API + KotlinUsages.KOTLIN_API ), FRAMEWORK( CompilerOutputKind.FRAMEWORK, @@ -63,7 +62,7 @@ enum class OutputKind( 3, Usage.NATIVE_RUNTIME, Usage.NATIVE_LINK, - false + false ) { override fun availableFor(target: KonanTarget): Boolean = target != KonanTarget.WASM32 }, diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/cinterop/CInteropSettingsImpl.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/cinterop/CInteropSettingsImpl.kt index d4e7a5b7658..077156343c2 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/cinterop/CInteropSettingsImpl.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/cinterop/CInteropSettingsImpl.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.gradle.plugin.experimental.CInteropSettings.IncludeD import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeBinary import org.jetbrains.kotlin.gradle.plugin.experimental.internal.KotlinNativeBuildType import org.jetbrains.kotlin.gradle.plugin.experimental.internal.getGradleOSFamily +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.konan.target.KonanTarget import java.io.File import javax.inject.Inject @@ -81,7 +82,7 @@ open class CInteropSettingsImpl @Inject constructor( val objects = project.objects isCanBeConsumed = false isCanBeResolved = true - attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, Usage.JAVA_API)) + attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, KotlinUsages.KOTLIN_API)) attributes.attribute(CppBinary.DEBUGGABLE_ATTRIBUTE, KotlinNativeBuildType.DEBUG.debuggable) attributes.attribute(CppBinary.OPTIMIZED_ATTRIBUTE, KotlinNativeBuildType.DEBUG.optimized) attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.native) diff --git a/tools/kotlin-native-gradle-plugin/src/test/kotlin/ExperimentalPluginTests.kt b/tools/kotlin-native-gradle-plugin/src/test/kotlin/ExperimentalPluginTests.kt index c7fad1def67..02cee53da7b 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/kotlin/ExperimentalPluginTests.kt +++ b/tools/kotlin-native-gradle-plugin/src/test/kotlin/ExperimentalPluginTests.kt @@ -884,4 +884,125 @@ class ExperimentalPluginTests { } project.createRunner().withArguments("assertClassPath").build() } + + @Test + fun `Plugin should be compatible with the MPP one`() { + val repo = tmpFolder.newFolder("repo") + val repoPath = KonanProject.escapeBackSlashes(repo.absolutePath) + val nativeProducer = KonanProject.createEmpty(tmpFolder.newFolder("native-producer")).apply { + buildFile.writeText(""" + plugins { + id 'kotlin-native' + id 'maven-publish' + } + + group 'test' + version '1.0' + + sourceSets.main.component { + targets = ['wasm32'] + } + + publishing { + repositories { + maven { url = '$repoPath' } + } + } + """.trimIndent()) + + settingsFile.appendText("enableFeaturePreview('GRADLE_METADATA')") + generateSrcFile("native.kt", "fun native() = 42") + } + + val mpp = KonanProject.createEmpty(tmpFolder.newFolder("mpp")).apply { + buildFile.writeText(""" + plugins { + id 'org.jetbrains.kotlin.multiplatform' version '${MultiplatformSpecification.KOTLIN_VERSION}' + id 'maven-publish' + } + + group 'test' + version '1.0' + + repositories { + maven { url '$repoPath' } + maven { url "${MultiplatformSpecification.KOTLIN_REPO}" } + jcenter() + } + + kotlin { + sourceSets { + wasmMain { + dependencies { + implementation 'test:native-producer:1.0' + } + } + } + + targets { + fromPreset(presets.wasm32, 'wasm') + } + } + + publishing { + repositories { + maven { url = '$repoPath' } + } + } + """.trimIndent()) + + settingsFile.writeText(""" + pluginManagement { + repositories { + maven { url "${MultiplatformSpecification.KOTLIN_REPO}" } + jcenter() + } + } + enableFeaturePreview('GRADLE_METADATA') + """.trimIndent()) + + propertiesFile.writeText("org.jetbrains.kotlin.native.home=$konanHome") + generateSrcFile(listOf("src/wasmMain/kotlin"), "mpp.kt", "fun mpp() = native()") + } + + val nativeConsumer = KonanProject.createEmpty(tmpFolder.newFolder("native-consumer")).apply { + buildFile.writeText(""" + plugins { + id 'kotlin-native' + } + + repositories { + maven { url '$repoPath' } + } + + sourceSets.main.component { + targets = ['wasm32'] + } + + dependencies { + implementation 'test:mpp:1.0' + } + """.trimIndent()) + + settingsFile.appendText("enableFeaturePreview('GRADLE_METADATA')") + generateSrcFile("consumer.kt", "fun consumer() = mpp()") + } + + nativeProducer.createRunner().withArguments("publish").build() + mpp.createRunner().withArguments("publish").build() + nativeConsumer.createRunner().withArguments("build").build() + + val publishedFiles = listOf( + "repo/test/native-producer/1.0/native-producer-1.0.module", + "repo/test/native-producer_debug/1.0/native-producer_debug-1.0.module", + "repo/test/native-producer_debug/1.0/native-producer_debug-1.0.klib", + "repo/test/mpp/1.0/mpp-1.0.module", + "repo/test/mpp-wasm/1.0/mpp-wasm-1.0.module", + "repo/test/mpp-wasm/1.0/mpp-wasm-1.0.klib" + ) + + publishedFiles.forEach { + assertFileExists(it) + } + } }