diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCompilation.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCompilation.kt index 1d77add617c..394837b4dcd 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCompilation.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.plugin import groovy.lang.Closure import org.gradle.api.Named +import org.gradle.api.attributes.AttributeContainer import org.gradle.api.attributes.HasAttributes import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.FileCollection @@ -52,6 +53,9 @@ interface KotlinCompilation : Named, HasAttributes, fun kotlinOptions(configure: T.() -> Unit) fun kotlinOptions(configure: Closure<*>) = kotlinOptions { ConfigureUtil.configure(configure, this) } + fun attributes(configure: AttributeContainer.() -> Unit) = configure(attributes) + fun attributes(configure: Closure<*>) = attributes { ConfigureUtil.configure(configure, this) } + val compileAllTaskName: String companion object { diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTarget.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTarget.kt index a81f66c65bf..a5ffb3c19ef 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTarget.kt @@ -10,6 +10,7 @@ import org.gradle.api.Action import org.gradle.api.Named import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project +import org.gradle.api.attributes.AttributeContainer import org.gradle.api.attributes.HasAttributes import org.gradle.api.component.SoftwareComponent import org.gradle.api.internal.component.UsageContext @@ -47,6 +48,9 @@ interface KotlinTarget : Named, HasAttributes { fun mavenPublication(action: Closure) fun mavenPublication(action: Action) + fun attributes(configure: AttributeContainer.() -> Unit) = configure(attributes) + fun attributes(configure: Closure<*>) = attributes { ConfigureUtil.configure(configure, this) } + val preset: KotlinTargetPreset? override fun getName(): String = targetName diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index 458c7399f83..96162ad1681 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -1202,6 +1202,23 @@ class NewMultiplatformIT : BaseGradleIT() { testDependencies() } + @Test + fun testMultipleTargetsSamePlatform() = with(Project("newMppMultipleTargetsSamePlatform", gradleVersion)) { + testResolveAllConfigurations("app") { + assertContains(">> :app:junitCompileClasspath --> lib-junit.jar") + assertContains(">> :app:junitCompileClasspath --> junit-4.12.jar") + + assertContains(">> :app:mixedJunitCompileClasspath --> lib-junit.jar") + assertContains(">> :app:mixedJunitCompileClasspath --> junit-4.12.jar") + + assertContains(">> :app:testngCompileClasspath --> lib-testng.jar") + assertContains(">> :app:testngCompileClasspath --> testng-6.14.3.jar") + + assertContains(">> :app:mixedTestngCompileClasspath --> lib-testng.jar") + assertContains(">> :app:mixedTestngCompileClasspath --> testng-6.14.3.jar") + } + } + @Test fun testUnusedSourceSetsReport() = with(Project("sample-lib", gradleVersion, "new-mpp-lib-and-app")) { setupWorkingDir() diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/app/build.gradle.kts new file mode 100644 index 00000000000..d88a08de299 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/app/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform") +} + +val testFrameworkAttribute = Attribute.of("com.example.testFramework", String::class.java) + +kotlin { + configure(listOf(jvm("junit"), jvm("testng"))) { + attributes { + attribute(testFrameworkAttribute, targetName) + } + } + + jvm("mixed") { + configure(listOf(compilations.create("junit"), compilations.create("testng"))) { + defaultSourceSet.dependsOn(sourceSets["commonMain"]) + attributes { + attribute(testFrameworkAttribute, compilationName) + } + } + } + + sourceSets["commonMain"].dependencies { + implementation(project(":lib")) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/build.gradle new file mode 100644 index 00000000000..741bff793a5 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/build.gradle @@ -0,0 +1,16 @@ +buildscript { + repositories { + mavenLocal() + jcenter() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + mavenLocal() + jcenter() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/lib/build.gradle.kts new file mode 100644 index 00000000000..4ab020c87ae --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/lib/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform") +} + +val testFrameworkAttribute = Attribute.of("com.example.testFramework", String::class.java) + +kotlin { + configure(listOf(jvm("junit"), jvm("testng"))) { + attributes { + attribute(testFrameworkAttribute, targetName) + } + } + + jvm("junit").compilations["main"].defaultSourceSet.dependencies { + api("junit:junit:4.12") + } + + jvm("testng").compilations["main"].defaultSourceSet.dependencies { + api("org.testng:testng:6.14.3") + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/lib/src/commonMain/kotlin/testAnnotation.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/lib/src/commonMain/kotlin/testAnnotation.kt new file mode 100644 index 00000000000..ae7f4639bb3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/lib/src/commonMain/kotlin/testAnnotation.kt @@ -0,0 +1,3 @@ +package com.example + +expect annotation class Test() \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/lib/src/junitMain/kotlin/junitTestAnnotation.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/lib/src/junitMain/kotlin/junitTestAnnotation.kt new file mode 100644 index 00000000000..e5161ee93c4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/lib/src/junitMain/kotlin/junitTestAnnotation.kt @@ -0,0 +1,3 @@ +package com.example + +actual typealias Test = org.junit.Test \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/lib/src/testngMain/kotlin/testngTestAnnotation.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/lib/src/testngMain/kotlin/testngTestAnnotation.kt new file mode 100644 index 00000000000..204f2e13dbf --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/lib/src/testngMain/kotlin/testngTestAnnotation.kt @@ -0,0 +1,3 @@ +package com.example + +actual typealias Test = org.testng.annotations.Test \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/settings.gradle new file mode 100644 index 00000000000..b1de2138f4f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/newMppMultipleTargetsSamePlatform/settings.gradle @@ -0,0 +1 @@ +include ':lib', ':app' \ No newline at end of file