From 77a8cf4e66c47384f7660cd66e3e085dbca8b69b Mon Sep 17 00:00:00 2001 From: Vyacheslav Gerasimov Date: Fri, 26 Jun 2020 19:08:34 +0300 Subject: [PATCH] Build: Use attributes to resolve test dependencies in jps build mode --- build.gradle.kts | 9 +++++++++ core/builtins/build.gradle.kts | 10 +++++++++- dependencies/tools-jar-api/build.gradle.kts | 10 +++++++++- gradle/jps.gradle.kts | 19 ++++++++++++++++--- include/kotlin-compiler/build.gradle.kts | 8 +++++++- .../build.gradle.kts | 16 ++++++++++++++-- .../jvm-minimal-for-test/build.gradle.kts | 8 +++++++- libraries/stdlib/jvm/build.gradle | 6 +++++- prepare/compiler/build.gradle.kts | 8 +++++++- prepare/idea-plugin/build.gradle.kts | 1 + 10 files changed, 84 insertions(+), 11 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9718771fd87..ea64400f55c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -365,6 +365,15 @@ allprojects { } } + configurations.maybeCreate("embeddedElements").apply { + extendsFrom(configurations["embedded"]) + isCanBeConsumed = true + isCanBeResolved = false + attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named("embedded-java-runtime")) + } + } + jvmTarget = defaultJvmTarget javaHome = defaultJavaHome diff --git a/core/builtins/build.gradle.kts b/core/builtins/build.gradle.kts index 9946e427458..1be34d52a8f 100644 --- a/core/builtins/build.gradle.kts +++ b/core/builtins/build.gradle.kts @@ -11,6 +11,14 @@ val builtinsNative = fileFrom(rootDir, "core", "builtins", "native") val kotlinReflect = fileFrom(rootDir, "libraries/stdlib/src/kotlin/reflect") val builtinsCherryPicked = fileFrom(buildDir, "src") +val runtimeElements by configurations.creating { + isCanBeResolved = false + isCanBeConsumed = true + attributes { + attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) + } +} + val prepareSources by tasks.registering(Sync::class) { from(kotlinReflect) { exclude("typeOf.kt") @@ -47,7 +55,7 @@ val assemble by tasks.getting { dependsOn(serialize) } -val builtinsJarArtifact = artifacts.add("default", builtinsJar) +val builtinsJarArtifact = artifacts.add(runtimeElements.name, builtinsJar) publishing { publications { diff --git a/dependencies/tools-jar-api/build.gradle.kts b/dependencies/tools-jar-api/build.gradle.kts index 357beafd043..e8e093fd56b 100644 --- a/dependencies/tools-jar-api/build.gradle.kts +++ b/dependencies/tools-jar-api/build.gradle.kts @@ -10,6 +10,14 @@ plugins { base } +val runtimeElements by configurations.creating { + isCanBeResolved = false + isCanBeConsumed = true + attributes { + attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) + } +} + val JDK_18: String by rootProject.extra val toolsJarFile = toolsJarFile(jdkHome = File(JDK_18)) ?: error("Couldn't find tools.jar in $JDK_18") @@ -75,4 +83,4 @@ val jar = tasks.register("jar") { } } -artifacts.add("default", jar) +artifacts.add(runtimeElements.name, jar) diff --git a/gradle/jps.gradle.kts b/gradle/jps.gradle.kts index 85e3f68c85f..aaa0df1e42e 100644 --- a/gradle/jps.gradle.kts +++ b/gradle/jps.gradle.kts @@ -103,20 +103,33 @@ if (kotlinBuildProperties.isInJpsBuildIdeaSync) { apply(mapOf("plugin" to "idea")) // Make Idea import embedded configuration as transitive dependency for some configurations afterEvaluate { + val jpsBuildTestDependencies = configurations.maybeCreate("jpsBuildTestDependencies").apply { + isCanBeConsumed = false + isCanBeResolved = true + attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named("embedded-java-runtime")) + } + } + listOf( "testCompile", "testCompileOnly", "testRuntime", "testRuntimeOnly" ).forEach { configurationName -> - val dependencyProjects = configurations - .findByName(configurationName) + val configuration = configurations.findByName(configurationName) + + configuration?.apply { + extendsFrom(jpsBuildTestDependencies) + } + + val dependencyProjects = configuration ?.dependencies ?.mapNotNull { (it as? ProjectDependency)?.dependencyProject } dependencies { dependencyProjects?.forEach {dependencyProject -> - add(configurationName, project(dependencyProject.path, configuration = "embedded")) + add(jpsBuildTestDependencies.name, project(dependencyProject.path)) } } } diff --git a/include/kotlin-compiler/build.gradle.kts b/include/kotlin-compiler/build.gradle.kts index 9dc0eeb961e..c688b2b5118 100644 --- a/include/kotlin-compiler/build.gradle.kts +++ b/include/kotlin-compiler/build.gradle.kts @@ -4,7 +4,13 @@ plugins { } val compile by configurations -val fatJarContents by configurations.creating +val fatJarContents by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false + attributes { + attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) + } +} val fatJarContentsStripMetadata by configurations.creating val fatJarContentsStripServices by configurations.creating diff --git a/include/kotlin-stdlib-common-sources/build.gradle.kts b/include/kotlin-stdlib-common-sources/build.gradle.kts index e54cc372ec2..fa62d731173 100644 --- a/include/kotlin-stdlib-common-sources/build.gradle.kts +++ b/include/kotlin-stdlib-common-sources/build.gradle.kts @@ -2,10 +2,22 @@ plugins { base } -val sources by configurations.creating +val sources by configurations.creating { + attributes { + isCanBeResolved = true + isCanBeConsumed = false + attributes { + attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) + attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType.SOURCES)) + } + } +} + +configurations["embeddedElements"].isCanBeConsumed = false dependencies { - sources(project(":kotlin-stdlib-common", configuration = "sources")) + sources(project(":kotlin-stdlib-common")) } val buildSources by tasks.registering(Jar::class) { diff --git a/libraries/stdlib/jvm-minimal-for-test/build.gradle.kts b/libraries/stdlib/jvm-minimal-for-test/build.gradle.kts index a5ecc036bf9..109f7762bce 100644 --- a/libraries/stdlib/jvm-minimal-for-test/build.gradle.kts +++ b/libraries/stdlib/jvm-minimal-for-test/build.gradle.kts @@ -10,7 +10,13 @@ plugins { jvmTarget = "1.6" javaHome = rootProject.extra["JDK_16"] as String -val builtins by configurations.creating +val builtins by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false + attributes { + attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) + } +} val runtime by configurations val runtimeJar by configurations.creating { diff --git a/libraries/stdlib/jvm/build.gradle b/libraries/stdlib/jvm/build.gradle index bf686592346..e0249a98123 100644 --- a/libraries/stdlib/jvm/build.gradle +++ b/libraries/stdlib/jvm/build.gradle @@ -41,7 +41,11 @@ sourceSets { configurations { commonSources longRunningTestCompile.extendsFrom(testCompile) - builtins + builtins { + attributes { + attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements, LibraryElements.JAR)) + } + } compileOnly.extendsFrom(builtins) } diff --git a/prepare/compiler/build.gradle.kts b/prepare/compiler/build.gradle.kts index 304c3e51f60..ce186c72e60 100644 --- a/prepare/compiler/build.gradle.kts +++ b/prepare/compiler/build.gradle.kts @@ -12,7 +12,13 @@ plugins { val JDK_18: String by rootProject.extra -val fatJarContents by configurations.creating +val fatJarContents by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false + attributes { + attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) + } +} val fatJarContentsStripMetadata by configurations.creating val fatJarContentsStripServices by configurations.creating val fatJarContentsStripVersions by configurations.creating diff --git a/prepare/idea-plugin/build.gradle.kts b/prepare/idea-plugin/build.gradle.kts index caf269247c3..1cda44e5edf 100644 --- a/prepare/idea-plugin/build.gradle.kts +++ b/prepare/idea-plugin/build.gradle.kts @@ -145,6 +145,7 @@ val libraries by configurations.creating { val jpsPlugin by configurations.creating { attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) } }