Revert "KT-38250 The minimal supported Gradle version is 5.3 now"
This reverts commit 61f213c8
This commit is contained in:
+3
-3
@@ -779,15 +779,15 @@ fun CopySpec.setExecutablePermissions() {
|
|||||||
|
|
||||||
val zipCompiler by task<Zip> {
|
val zipCompiler by task<Zip> {
|
||||||
dependsOn(dist)
|
dependsOn(dist)
|
||||||
destinationDirectory.set(file(distDir))
|
destinationDir = file(distDir)
|
||||||
archiveFileName.set("kotlin-compiler-$kotlinVersion.zip")
|
archiveName = "kotlin-compiler-$kotlinVersion.zip"
|
||||||
|
|
||||||
from(distKotlinHomeDir)
|
from(distKotlinHomeDir)
|
||||||
into("kotlinc")
|
into("kotlinc")
|
||||||
setExecutablePermissions()
|
setExecutablePermissions()
|
||||||
|
|
||||||
doLast {
|
doLast {
|
||||||
logger.lifecycle("Compiler artifacts packed to ${archiveFile.get().asFile.absolutePath}")
|
logger.lifecycle("Compiler artifacts packed to $archivePath")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ val shortenTempRootName = System.getProperty("os.name")!!.contains("Windows")
|
|||||||
projectTest("test", shortenTempRootName = shortenTempRootName) {}
|
projectTest("test", shortenTempRootName = shortenTempRootName) {}
|
||||||
|
|
||||||
projectTest("testAdvanceGradleVersion", shortenTempRootName = shortenTempRootName) {
|
projectTest("testAdvanceGradleVersion", shortenTempRootName = shortenTempRootName) {
|
||||||
val gradleVersionForTests = "6.3"
|
val gradleVersionForTests = "5.3-rc-2"
|
||||||
systemProperty("kotlin.gradle.version.for.tests", gradleVersionForTests)
|
systemProperty("kotlin.gradle.version.for.tests", gradleVersionForTests)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+66
@@ -12,6 +12,9 @@ import kotlin.test.assertTrue
|
|||||||
open class KotlinAndroid33GradleIT : KotlinAndroid32GradleIT() {
|
open class KotlinAndroid33GradleIT : KotlinAndroid32GradleIT() {
|
||||||
override val androidGradlePluginVersion: AGPVersion
|
override val androidGradlePluginVersion: AGPVersion
|
||||||
get() = AGPVersion.v3_3_2
|
get() = AGPVersion.v3_3_2
|
||||||
|
|
||||||
|
override val defaultGradleVersion: GradleVersionRequired
|
||||||
|
get() = GradleVersionRequired.AtLeast("5.0")
|
||||||
}
|
}
|
||||||
|
|
||||||
open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() {
|
open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() {
|
||||||
@@ -407,6 +410,46 @@ open class KotlinAndroid32GradleIT : KotlinAndroid3GradleIT() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class KotlinAndroid30GradleIT : KotlinAndroid3GradleIT() {
|
||||||
|
override val androidGradlePluginVersion: AGPVersion
|
||||||
|
get() = AGPVersion.v3_0_0
|
||||||
|
|
||||||
|
override val defaultGradleVersion: GradleVersionRequired
|
||||||
|
get() = GradleVersionRequired.Until("4.10.2")
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testOmittedStdlibVersion() = Project("AndroidProject").run {
|
||||||
|
setupWorkingDir()
|
||||||
|
|
||||||
|
gradleBuildScript("Lib").modify {
|
||||||
|
it.checkedReplace("kotlin-stdlib:\$kotlin_version", "kotlin-stdlib") + "\n" + """
|
||||||
|
apply plugin: 'maven'
|
||||||
|
group 'com.example'
|
||||||
|
version '1.0'
|
||||||
|
android {
|
||||||
|
defaultPublishConfig 'flavor1Debug'
|
||||||
|
}
|
||||||
|
uploadArchives {
|
||||||
|
repositories {
|
||||||
|
mavenDeployer {
|
||||||
|
repository(url: "file://${'$'}buildDir/repo")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""".trimIndent()
|
||||||
|
}
|
||||||
|
|
||||||
|
build(":Lib:assembleFlavor1Debug", ":Lib:uploadArchives") {
|
||||||
|
assertSuccessful()
|
||||||
|
assertTasksExecuted(":Lib:compileFlavor1DebugKotlin", ":Lib:uploadArchives")
|
||||||
|
val pomLines = File(projectDir, "Lib/build/repo/com/example/Lib/1.0/Lib-1.0.pom").readLines()
|
||||||
|
val stdlibVersionLineNumber = pomLines.indexOfFirst { "<artifactId>kotlin-stdlib</artifactId>" in it } + 1
|
||||||
|
val versionLine = pomLines[stdlibVersionLineNumber]
|
||||||
|
assertTrue { "<version>${defaultBuildOptions().kotlinVersion}</version>" in versionLine }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
abstract class KotlinAndroid3GradleIT : AbstractKotlinAndroidGradleTests() {
|
abstract class KotlinAndroid3GradleIT : AbstractKotlinAndroidGradleTests() {
|
||||||
@Test
|
@Test
|
||||||
fun testApplyWithFeaturePlugin() {
|
fun testApplyWithFeaturePlugin() {
|
||||||
@@ -681,6 +724,29 @@ fun getSomething() = 10
|
|||||||
val project = Project("AndroidExtensionsSpecificFeatures")
|
val project = Project("AndroidExtensionsSpecificFeatures")
|
||||||
val options = defaultBuildOptions().copy(incremental = false)
|
val options = defaultBuildOptions().copy(incremental = false)
|
||||||
|
|
||||||
|
if (this is KotlinAndroid30GradleIT) {
|
||||||
|
project.setupWorkingDir()
|
||||||
|
project.gradleBuildScript("app").modify {
|
||||||
|
"""
|
||||||
|
def projectEvaluated = false
|
||||||
|
|
||||||
|
configurations.all { configuration ->
|
||||||
|
incoming.beforeResolve {
|
||||||
|
if (!projectEvaluated) {
|
||||||
|
throw new RuntimeException("${'$'}configuration resolved during project configuration phase.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$it
|
||||||
|
|
||||||
|
afterEvaluate {
|
||||||
|
projectEvaluated = true
|
||||||
|
}
|
||||||
|
""".trimIndent()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
project.build("assemble", options = options) {
|
project.build("assemble", options = options) {
|
||||||
assertFailed()
|
assertFailed()
|
||||||
assertContains("Unresolved reference: textView")
|
assertContains("Unresolved reference: textView")
|
||||||
|
|||||||
+9
-1
@@ -168,9 +168,17 @@ abstract class BaseGradleIT {
|
|||||||
assert(version != runnerGradleVersion) { "Not stopping Gradle daemon v$version as it matches the runner version" }
|
assert(version != runnerGradleVersion) { "Not stopping Gradle daemon v$version as it matches the runner version" }
|
||||||
println("Stopping gradle daemon v$version")
|
println("Stopping gradle daemon v$version")
|
||||||
|
|
||||||
|
val envVariables = if (GradleVersion.version(version) < GradleVersion.version("5.0")) {
|
||||||
|
// Gradle versions below 5.0 do not support running on JDK11, and some of the tests
|
||||||
|
// set JAVA_HOME to JDK11. This makes sure we are using JDK8 when stopping those daemons.
|
||||||
|
environmentVariables + mapOf("JAVA_HOME" to System.getenv()["JDK_18"]!!)
|
||||||
|
} else {
|
||||||
|
environmentVariables
|
||||||
|
}
|
||||||
|
|
||||||
val wrapperDir = gradleWrappers[version] ?: error("Was asked to stop unknown daemon $version")
|
val wrapperDir = gradleWrappers[version] ?: error("Was asked to stop unknown daemon $version")
|
||||||
val cmd = createGradleCommand(wrapperDir, arrayListOf("-stop"))
|
val cmd = createGradleCommand(wrapperDir, arrayListOf("-stop"))
|
||||||
val result = runProcess(cmd, wrapperDir, environmentVariables)
|
val result = runProcess(cmd, wrapperDir, envVariables)
|
||||||
assert(result.isSuccessful) { "Could not stop daemon: $result" }
|
assert(result.isSuccessful) { "Could not stop daemon: $result" }
|
||||||
DaemonRegistry.unregister(version)
|
DaemonRegistry.unregister(version)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ import org.junit.Test
|
|||||||
class ConfigurationAvoidanceIT : BaseGradleIT() {
|
class ConfigurationAvoidanceIT : BaseGradleIT() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testUnrelatedTaskNotConfigured() = with(Project("simpleProject")) {
|
fun testUnrelatedTaskNotConfigured() = with(Project("simpleProject", GradleVersionRequired.AtLeast("4.10.2"))) {
|
||||||
setupWorkingDir()
|
setupWorkingDir()
|
||||||
|
|
||||||
val expensivelyConfiguredTaskName = "expensivelyConfiguredTask"
|
val expensivelyConfiguredTaskName = "expensivelyConfiguredTask"
|
||||||
|
|||||||
+7
-2
@@ -89,6 +89,8 @@ abstract class ExecutionStrategyIT : BaseGradleIT() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun CompiledProject.checkCompileDaemon() {
|
private fun CompiledProject.checkCompileDaemon() {
|
||||||
|
val isGradleAtLeast50 = project.testGradleVersionAtLeast("5.0")
|
||||||
|
|
||||||
val m = "Kotlin compile daemon JVM options: \\[(.*?)\\]".toRegex().find(output)
|
val m = "Kotlin compile daemon JVM options: \\[(.*?)\\]".toRegex().find(output)
|
||||||
?: error("Could not find Kotlin compile daemon JVM options in Gradle's output")
|
?: error("Could not find Kotlin compile daemon JVM options in Gradle's output")
|
||||||
val kotlinDaemonJvmArgs = m.groupValues[1].split(",").mapTo(LinkedHashSet()) { it.trim() }
|
val kotlinDaemonJvmArgs = m.groupValues[1].split(",").mapTo(LinkedHashSet()) { it.trim() }
|
||||||
@@ -100,8 +102,11 @@ abstract class ExecutionStrategyIT : BaseGradleIT() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 256m is the default value for Gradle 5.0+
|
if (isGradleAtLeast50) {
|
||||||
assertDaemonArgsContain("-XX:MaxMetaspaceSize=256m")
|
// 256m is the default value for Gradle 5.0+
|
||||||
|
assertDaemonArgsContain("-XX:MaxMetaspaceSize=256m")
|
||||||
|
}
|
||||||
|
|
||||||
assertDaemonArgsContain("-ea")
|
assertDaemonArgsContain("-ea")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-6
@@ -17,12 +17,11 @@
|
|||||||
package org.jetbrains.kotlin.gradle
|
package org.jetbrains.kotlin.gradle
|
||||||
|
|
||||||
import org.gradle.util.GradleVersion
|
import org.gradle.util.GradleVersion
|
||||||
import org.jetbrains.kotlin.gradle.GradleVersionRequired.Companion.OLDEST_SUPPORTED
|
|
||||||
import org.junit.Assume
|
import org.junit.Assume
|
||||||
|
|
||||||
sealed class GradleVersionRequired(val minVersion: String, val maxVersion: String?) {
|
sealed class GradleVersionRequired(val minVersion: String, val maxVersion: String?) {
|
||||||
companion object {
|
companion object {
|
||||||
const val OLDEST_SUPPORTED = "5.3"
|
const val OLDEST_SUPPORTED = "4.9"
|
||||||
|
|
||||||
val FOR_MPP_SUPPORT = AtLeast("6.0")
|
val FOR_MPP_SUPPORT = AtLeast("6.0")
|
||||||
}
|
}
|
||||||
@@ -35,13 +34,13 @@ sealed class GradleVersionRequired(val minVersion: String, val maxVersion: Strin
|
|||||||
|
|
||||||
class Until(maxVersion: String) : GradleVersionRequired(OLDEST_SUPPORTED, maxVersion)
|
class Until(maxVersion: String) : GradleVersionRequired(OLDEST_SUPPORTED, maxVersion)
|
||||||
|
|
||||||
object None : GradleVersionRequired(OLDEST_SUPPORTED, null)
|
object None : GradleVersionRequired(GradleVersionRequired.OLDEST_SUPPORTED, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun BaseGradleIT.Project.chooseWrapperVersionOrFinishTest(): String {
|
fun BaseGradleIT.Project.chooseWrapperVersionOrFinishTest(): String {
|
||||||
val gradleVersionForTests = System.getProperty("kotlin.gradle.version.for.tests")?.toGradleVersion()
|
val gradleVersionForTests = System.getProperty("kotlin.gradle.version.for.tests")?.toGradleVersion()
|
||||||
val minVersion = max(gradleVersionRequirement.minVersion.toGradleVersion(), OLDEST_SUPPORTED.toGradleVersion())
|
val minVersion = gradleVersionRequirement.minVersion.toGradleVersion()
|
||||||
val maxVersion = gradleVersionRequirement.maxVersion?.toGradleVersion()
|
val maxVersion = gradleVersionRequirement.maxVersion?.toGradleVersion()
|
||||||
|
|
||||||
if (gradleVersionForTests == null) {
|
if (gradleVersionForTests == null) {
|
||||||
@@ -53,6 +52,4 @@ fun BaseGradleIT.Project.chooseWrapperVersionOrFinishTest(): String {
|
|||||||
return gradleVersionForTests.version
|
return gradleVersionForTests.version
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun <T : Comparable<T>> max(a: T, b: T): T = if (a < b) b else a
|
|
||||||
|
|
||||||
private fun String.toGradleVersion() = GradleVersion.version(this)
|
private fun String.toGradleVersion() = GradleVersion.version(this)
|
||||||
+9
-3
@@ -20,6 +20,9 @@ open class Kapt3Android33IT : Kapt3AndroidIT() {
|
|||||||
override val androidGradlePluginVersion: AGPVersion
|
override val androidGradlePluginVersion: AGPVersion
|
||||||
get() = AGPVersion.v3_3_2
|
get() = AGPVersion.v3_3_2
|
||||||
|
|
||||||
|
override val defaultGradleVersion: GradleVersionRequired
|
||||||
|
get() = GradleVersionRequired.AtLeast("5.2")
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testAndroidxNavigationSafeArgs() = with(Project("androidx-navigation-safe-args", directoryPrefix = "kapt2")) {
|
fun testAndroidxNavigationSafeArgs() = with(Project("androidx-navigation-safe-args", directoryPrefix = "kapt2")) {
|
||||||
// KT-30735
|
// KT-30735
|
||||||
@@ -69,19 +72,22 @@ open class Kapt3Android33IT : Kapt3AndroidIT() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Kapt3Android34IT : Kapt3AndroidIT() {
|
class Kapt3Android31IT : Kapt3AndroidIT() {
|
||||||
override val androidGradlePluginVersion: AGPVersion
|
override val androidGradlePluginVersion: AGPVersion
|
||||||
get() = AGPVersion.v3_4_1
|
get() = AGPVersion.v3_1_0
|
||||||
|
|
||||||
// there is a weird validation exception in testICWithAnonymousClasses with 5.0 todo: fix it
|
// there is a weird validation exception in testICWithAnonymousClasses with 5.0 todo: fix it
|
||||||
override val defaultGradleVersion: GradleVersionRequired
|
override val defaultGradleVersion: GradleVersionRequired
|
||||||
get() = GradleVersionRequired.Until("5.4.1")
|
get() = GradleVersionRequired.Until("4.10.2")
|
||||||
}
|
}
|
||||||
|
|
||||||
open class Kapt3AndroidIT : Kapt3BaseIT() {
|
open class Kapt3AndroidIT : Kapt3BaseIT() {
|
||||||
protected open val androidGradlePluginVersion: AGPVersion
|
protected open val androidGradlePluginVersion: AGPVersion
|
||||||
get() = AGPVersion.v3_0_0
|
get() = AGPVersion.v3_0_0
|
||||||
|
|
||||||
|
override val defaultGradleVersion: GradleVersionRequired
|
||||||
|
get() = GradleVersionRequired.Until("4.10.2")
|
||||||
|
|
||||||
override fun defaultBuildOptions() =
|
override fun defaultBuildOptions() =
|
||||||
super.defaultBuildOptions().copy(
|
super.defaultBuildOptions().copy(
|
||||||
androidHome = KotlinTestUtils.findAndroidSdk(),
|
androidHome = KotlinTestUtils.findAndroidSdk(),
|
||||||
|
|||||||
+3
-3
@@ -69,7 +69,7 @@ class Kapt3WorkersIT : Kapt3IT() {
|
|||||||
Assume.assumeTrue("JDK 10 isn't available", javaHome.isDirectory)
|
Assume.assumeTrue("JDK 10 isn't available", javaHome.isDirectory)
|
||||||
val options = defaultBuildOptions().copy(javaHome = javaHome)
|
val options = defaultBuildOptions().copy(javaHome = javaHome)
|
||||||
|
|
||||||
val project = Project("simple", directoryPrefix = "kapt2")
|
val project = Project("simple", directoryPrefix = "kapt2", gradleVersionRequirement = GradleVersionRequired.AtLeast("4.7"))
|
||||||
project.build("build", options = options) {
|
project.build("build", options = options) {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
assertKaptSuccessful()
|
assertKaptSuccessful()
|
||||||
@@ -84,7 +84,7 @@ class Kapt3WorkersIT : Kapt3IT() {
|
|||||||
Assume.assumeTrue("JDK 11 isn't available", javaHome.isDirectory)
|
Assume.assumeTrue("JDK 11 isn't available", javaHome.isDirectory)
|
||||||
val options = defaultBuildOptions().copy(javaHome = javaHome)
|
val options = defaultBuildOptions().copy(javaHome = javaHome)
|
||||||
|
|
||||||
val project = Project("simple", directoryPrefix = "kapt2")
|
val project = Project("simple", directoryPrefix = "kapt2", gradleVersionRequirement = GradleVersionRequired.AtLeast("5.0"))
|
||||||
project.build("build", options = options) {
|
project.build("build", options = options) {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
assertKaptSuccessful()
|
assertKaptSuccessful()
|
||||||
@@ -649,7 +649,7 @@ open class Kapt3IT : Kapt3BaseIT() {
|
|||||||
Assume.assumeTrue("JDK 11 isn't available", javaHome.isDirectory)
|
Assume.assumeTrue("JDK 11 isn't available", javaHome.isDirectory)
|
||||||
val options = defaultBuildOptions().copy(javaHome = javaHome)
|
val options = defaultBuildOptions().copy(javaHome = javaHome)
|
||||||
|
|
||||||
val project = Project("simple", directoryPrefix = "kapt2").also {
|
val project = Project("simple", directoryPrefix = "kapt2", gradleVersionRequirement = GradleVersionRequired.AtLeast("5.0")).also {
|
||||||
it.setupWorkingDir()
|
it.setupWorkingDir()
|
||||||
it.gradleBuildScript().appendText("\nsourceCompatibility = '8'")
|
it.gradleBuildScript().appendText("\nsourceCompatibility = '8'")
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -37,7 +37,7 @@ class Kotlin2JsIrGradlePluginIT : AbstractKotlin2JsGradlePluginIT(true) {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testCleanOutputWithEmptySources() {
|
fun testCleanOutputWithEmptySources() {
|
||||||
with(Project("kotlin-js-nodejs-project")) {
|
with(Project("kotlin-js-nodejs-project", GradleVersionRequired.AtLeast("5.3"))) {
|
||||||
setupWorkingDir()
|
setupWorkingDir()
|
||||||
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
||||||
gradleSettingsScript().modify(::transformBuildScriptWithPluginsDsl)
|
gradleSettingsScript().modify(::transformBuildScriptWithPluginsDsl)
|
||||||
@@ -512,7 +512,7 @@ abstract class AbstractKotlin2JsGradlePluginIT(private val irBackend: Boolean) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testNewKotlinJsPlugin() = with(Project("kotlin-js-plugin-project")) {
|
fun testNewKotlinJsPlugin() = with(Project("kotlin-js-plugin-project", GradleVersionRequired.AtLeast("5.3"))) {
|
||||||
assumeFalse(irBackend) // TODO: Support IR version of kotlinx.html
|
assumeFalse(irBackend) // TODO: Support IR version of kotlinx.html
|
||||||
setupWorkingDir()
|
setupWorkingDir()
|
||||||
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
||||||
@@ -558,7 +558,7 @@ abstract class AbstractKotlin2JsGradlePluginIT(private val irBackend: Boolean) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testYarnSetup() = with(Project("yarn-setup")) {
|
fun testYarnSetup() = with(Project("yarn-setup", GradleVersionRequired.AtLeast("5.3"))) {
|
||||||
setupWorkingDir()
|
setupWorkingDir()
|
||||||
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
||||||
gradleSettingsScript().modify(::transformBuildScriptWithPluginsDsl)
|
gradleSettingsScript().modify(::transformBuildScriptWithPluginsDsl)
|
||||||
@@ -589,7 +589,7 @@ abstract class AbstractKotlin2JsGradlePluginIT(private val irBackend: Boolean) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testNpmDependencies() = with(Project("npm-dependencies")) {
|
fun testNpmDependencies() = with(Project("npm-dependencies", GradleVersionRequired.AtLeast("5.3"))) {
|
||||||
setupWorkingDir()
|
setupWorkingDir()
|
||||||
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
||||||
|
|
||||||
@@ -603,7 +603,7 @@ abstract class AbstractKotlin2JsGradlePluginIT(private val irBackend: Boolean) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testBrowserDistribution() = with(Project("kotlin-js-browser-project")) {
|
fun testBrowserDistribution() = with(Project("kotlin-js-browser-project", GradleVersionRequired.AtLeast("5.3"))) {
|
||||||
setupWorkingDir()
|
setupWorkingDir()
|
||||||
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
||||||
gradleSettingsScript().modify(::transformBuildScriptWithPluginsDsl)
|
gradleSettingsScript().modify(::transformBuildScriptWithPluginsDsl)
|
||||||
|
|||||||
+7
-5
@@ -588,12 +588,14 @@ class KotlinGradleIT : BaseGradleIT() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testNoUnnamedInputsOutputs() {
|
fun testNoUnnamedInputsOutputs() {
|
||||||
|
// Use a new Gradle version to enable the usage of the input/output builders, which are new API:
|
||||||
|
val gradleVersionRequirement = GradleVersionRequired.AtLeast("4.4")
|
||||||
|
|
||||||
val projects = listOf(
|
val projects = listOf(
|
||||||
Project("simpleProject"),
|
Project("simpleProject", gradleVersionRequirement),
|
||||||
Project("kotlin2JsProject"),
|
Project("kotlin2JsProject", gradleVersionRequirement),
|
||||||
Project("multiplatformProject"),
|
Project("multiplatformProject", gradleVersionRequirement),
|
||||||
Project("simple", directoryPrefix = "kapt2")
|
Project("simple", gradleVersionRequirement, "kapt2")
|
||||||
)
|
)
|
||||||
|
|
||||||
projects.forEach {
|
projects.forEach {
|
||||||
@@ -892,7 +894,7 @@ class KotlinGradleIT : BaseGradleIT() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testNewModelInOldJvmPlugin() = with(Project("new-model-in-old-plugin")) {
|
fun testNewModelInOldJvmPlugin() = with(Project("new-model-in-old-plugin", GradleVersionRequired.AtLeast("5.0"))) {
|
||||||
setupWorkingDir()
|
setupWorkingDir()
|
||||||
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -452,7 +452,7 @@ class NewMultiplatformIT : BaseGradleIT() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testResourceProcessing() = with(Project("sample-lib", gradleVersion, "new-mpp-lib-and-app")) {
|
fun testResourceProcessing() = with(Project("sample-lib", directoryPrefix = "new-mpp-lib-and-app")) {
|
||||||
val targetsWithResources = listOf("jvm6", "nodeJs", "wasm32", nativeHostTargetName)
|
val targetsWithResources = listOf("jvm6", "nodeJs", "wasm32", nativeHostTargetName)
|
||||||
val processResourcesTasks =
|
val processResourcesTasks =
|
||||||
targetsWithResources.map { ":${it}ProcessResources" }
|
targetsWithResources.map { ":${it}ProcessResources" }
|
||||||
|
|||||||
+18
-7
@@ -149,14 +149,25 @@ class SubpluginsIT : BaseGradleIT() {
|
|||||||
var isFailed = false
|
var isFailed = false
|
||||||
project.build("build", options = options) {
|
project.build("build", options = options) {
|
||||||
val classesDir = kotlinClassesDir("app", "main")
|
val classesDir = kotlinClassesDir("app", "main")
|
||||||
assertSuccessful()
|
if (project.testGradleVersionAtLeast("5.0")) {
|
||||||
assertFileExists("${classesDir}World.class")
|
assertSuccessful()
|
||||||
assertFileExists("${classesDir}Alice.class")
|
assertFileExists("${classesDir}World.class")
|
||||||
assertFileExists("${classesDir}Bob.class")
|
assertFileExists("${classesDir}Alice.class")
|
||||||
|
assertFileExists("${classesDir}Bob.class")
|
||||||
|
|
||||||
if (withIC) {
|
if (withIC) {
|
||||||
// compile iterations are not logged when IC is disabled
|
// compile iterations are not logged when IC is disabled
|
||||||
assertCompiledKotlinSources(project.relativize(bobGreet, aliceGreet, worldGreet, greetScriptTemplateKt))
|
assertCompiledKotlinSources(project.relativize(bobGreet, aliceGreet, worldGreet, greetScriptTemplateKt))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val usedGradleVersion =
|
||||||
|
GradleVersion.version(
|
||||||
|
System.getProperty("kotlin.gradle.version.for.tests")
|
||||||
|
?: project.gradleVersionRequirement.minVersion
|
||||||
|
)
|
||||||
|
assertEquals(true, usedGradleVersion.version.substringBefore('.').toIntOrNull()?.let { it < 5 }, "Expected gradle version < 5, got ${usedGradleVersion.version}")
|
||||||
|
assertContains("kotlin scripting plugin: incompatible Gradle version")
|
||||||
|
isFailed = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -279,7 +279,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
|
|||||||
// Starting with Gradle 5.0, plain Maven dependencies are represented as two variants, and resolving them to the API one leads
|
// Starting with Gradle 5.0, plain Maven dependencies are represented as two variants, and resolving them to the API one leads
|
||||||
// to transitive dependencies left out of the resolution results. We need to ensure that our attributes schema does not lead to the API
|
// to transitive dependencies left out of the resolution results. We need to ensure that our attributes schema does not lead to the API
|
||||||
// variants chosen over the runtime ones when resolving a configuration with no required Usage:
|
// variants chosen over the runtime ones when resolving a configuration with no required Usage:
|
||||||
with(Project("simpleProject")) {
|
with(Project("simpleProject", GradleVersionRequired.AtLeast("5.0-milestone-1"))) {
|
||||||
setupWorkingDir()
|
setupWorkingDir()
|
||||||
gradleBuildScript().appendText("\ndependencies { compile 'org.jetbrains.kotlin:kotlin-compiler-embeddable' }")
|
gradleBuildScript().appendText("\ndependencies { compile 'org.jetbrains.kotlin:kotlin-compiler-embeddable' }")
|
||||||
|
|
||||||
|
|||||||
-1
@@ -22,7 +22,6 @@ class AGPVersion private constructor(private val versionNumber: VersionNumber) {
|
|||||||
val v3_1_0 = fromString("3.1.0")
|
val v3_1_0 = fromString("3.1.0")
|
||||||
val v3_2_0 = fromString("3.2.0")
|
val v3_2_0 = fromString("3.2.0")
|
||||||
val v3_3_2 = fromString("3.3.2")
|
val v3_3_2 = fromString("3.3.2")
|
||||||
val v3_4_1 = fromString("3.4.1")
|
|
||||||
val v3_6_0 = fromString("3.6.0")
|
val v3_6_0 = fromString("3.6.0")
|
||||||
val v4_0_ALPHA_8 = fromString("4.0.0-alpha08")
|
val v4_0_ALPHA_8 = fromString("4.0.0-alpha08")
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -242,7 +242,7 @@ internal open class GradleCompilerRunner(protected val task: Task) {
|
|||||||
?: return null
|
?: return null
|
||||||
val sourceSet = javaConvention.sourceSets.findByName(sourceSetName) ?: return null
|
val sourceSet = javaConvention.sourceSets.findByName(sourceSetName) ?: return null
|
||||||
val jarTask = project.tasks.findByName(sourceSet.jarTaskName) as? Jar
|
val jarTask = project.tasks.findByName(sourceSet.jarTaskName) as? Jar
|
||||||
return jarTask?.archiveFile?.get()?.asFile
|
return jarTask?.archivePath
|
||||||
}
|
}
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
|
|||||||
+2
-1
@@ -7,10 +7,11 @@ package org.jetbrains.kotlin.gradle.internal.tasks
|
|||||||
|
|
||||||
import org.gradle.api.Task
|
import org.gradle.api.Task
|
||||||
import org.gradle.api.file.FileCollection
|
import org.gradle.api.file.FileCollection
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.outputsCompatible
|
||||||
|
|
||||||
internal interface TaskWithLocalState : Task {
|
internal interface TaskWithLocalState : Task {
|
||||||
fun localStateDirectories(): FileCollection
|
fun localStateDirectories(): FileCollection
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun TaskWithLocalState.allOutputFiles(): FileCollection =
|
internal fun TaskWithLocalState.allOutputFiles(): FileCollection =
|
||||||
outputs.files + localStateDirectories()
|
outputsCompatible.files + localStateDirectories()
|
||||||
|
|||||||
+17
-6
@@ -11,6 +11,7 @@ import com.android.build.gradle.api.BaseVariant
|
|||||||
import com.android.builder.model.SourceProvider
|
import com.android.builder.model.SourceProvider
|
||||||
import org.gradle.api.*
|
import org.gradle.api.*
|
||||||
import org.gradle.api.artifacts.ExternalDependency
|
import org.gradle.api.artifacts.ExternalDependency
|
||||||
|
import org.gradle.api.artifacts.MutableVersionConstraint
|
||||||
import org.gradle.api.artifacts.maven.Conf2ScopeMappingContainer
|
import org.gradle.api.artifacts.maven.Conf2ScopeMappingContainer
|
||||||
import org.gradle.api.artifacts.maven.MavenResolver
|
import org.gradle.api.artifacts.maven.MavenResolver
|
||||||
import org.gradle.api.attributes.Usage
|
import org.gradle.api.attributes.Usage
|
||||||
@@ -223,7 +224,7 @@ internal class Kotlin2JvmSourceSetProcessor(
|
|||||||
.flatMap { it.getSubpluginKotlinTasks(project, kotlinTaskInstance) }
|
.flatMap { it.getSubpluginKotlinTasks(project, kotlinTaskInstance) }
|
||||||
.forEach { plugin -> kotlinCompilation.allKotlinSourceSets.forEach { sourceSet -> plugin.source(sourceSet.kotlin) } }
|
.forEach { plugin -> kotlinCompilation.allKotlinSourceSets.forEach { sourceSet -> plugin.source(sourceSet.kotlin) } }
|
||||||
|
|
||||||
javaTask?.let { configureJavaTask(kotlinTaskInstance, it) }
|
javaTask?.let { configureJavaTask(kotlinTaskInstance, it, logger) }
|
||||||
|
|
||||||
if (project.pluginManager.hasPlugin("java-library") && sourceSetName == SourceSet.MAIN_SOURCE_SET_NAME) {
|
if (project.pluginManager.hasPlugin("java-library") && sourceSetName == SourceSet.MAIN_SOURCE_SET_NAME) {
|
||||||
registerKotlinOutputForJavaLibrary(kotlinTaskInstance.destinationDir, kotlinTaskInstance)
|
registerKotlinOutputForJavaLibrary(kotlinTaskInstance.destinationDir, kotlinTaskInstance)
|
||||||
@@ -530,7 +531,7 @@ internal abstract class AbstractKotlinPlugin(
|
|||||||
project.registerTask<InspectClassesForMultiModuleIC>("inspectClassesForKotlinIC") {
|
project.registerTask<InspectClassesForMultiModuleIC>("inspectClassesForKotlinIC") {
|
||||||
it.sourceSetName = SourceSet.MAIN_SOURCE_SET_NAME
|
it.sourceSetName = SourceSet.MAIN_SOURCE_SET_NAME
|
||||||
it.archivePath.set(project.provider { jarTask.archivePathCompatible.canonicalPath })
|
it.archivePath.set(project.provider { jarTask.archivePathCompatible.canonicalPath })
|
||||||
it.archiveName.set(project.provider { jarTask.archiveFileName.get() })
|
it.archiveName.set(project.provider { jarTask.archiveNameCompatible })
|
||||||
it.dependsOn(classesTask)
|
it.dependsOn(classesTask)
|
||||||
}
|
}
|
||||||
jarTask.dependsOn(inspectTask)
|
jarTask.dependsOn(inspectTask)
|
||||||
@@ -639,11 +640,21 @@ internal abstract class AbstractKotlinPlugin(
|
|||||||
|
|
||||||
internal fun configureDefaultVersionsResolutionStrategy(project: Project, kotlinPluginVersion: String) {
|
internal fun configureDefaultVersionsResolutionStrategy(project: Project, kotlinPluginVersion: String) {
|
||||||
project.configurations.all { configuration ->
|
project.configurations.all { configuration ->
|
||||||
|
fun MutableVersionConstraint.chooseVersion(version: String) {
|
||||||
|
if (isGradleVersionAtLeast(5, 0)) {
|
||||||
|
// In Gradle 5.0, the semantics of 'prefer' has changed to be much less imperative, and now it's 'require' that we need:
|
||||||
|
val requireMethod = javaClass.getMethod("require", String::class.java)
|
||||||
|
requireMethod(this, version)
|
||||||
|
} else {
|
||||||
|
prefer(version)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Use the API introduced in Gradle 4.4 to modify the dependencies directly before they are resolved:
|
// Use the API introduced in Gradle 4.4 to modify the dependencies directly before they are resolved:
|
||||||
configuration.withDependencies { dependencySet ->
|
configuration.withDependencies { dependencySet ->
|
||||||
dependencySet.filterIsInstance<ExternalDependency>()
|
dependencySet.filterIsInstance<ExternalDependency>()
|
||||||
.filter { it.group == "org.jetbrains.kotlin" && it.version.isNullOrEmpty() }
|
.filter { it.group == "org.jetbrains.kotlin" && it.version.isNullOrEmpty() }
|
||||||
.forEach { it.version { constraint -> constraint.require(kotlinPluginVersion) } }
|
.forEach { it.version { constraint -> constraint.chooseVersion(kotlinPluginVersion) } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1079,11 +1090,11 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun configureJavaTask(kotlinTask: KotlinCompile, javaTask: AbstractCompile) {
|
internal fun configureJavaTask(kotlinTask: KotlinCompile, javaTask: AbstractCompile, logger: Logger) {
|
||||||
kotlinTask.javaOutputDir = javaTask.destinationDir
|
kotlinTask.javaOutputDir = javaTask.destinationDir
|
||||||
|
|
||||||
// Make Gradle check if the javaTask is up-to-date based on the Kotlin classes
|
// Make Gradle check if the javaTask is up-to-date based on the Kotlin classes
|
||||||
javaTask.inputs.run {
|
javaTask.inputsCompatible.run {
|
||||||
dir(kotlinTask.destinationDir)
|
dir(kotlinTask.destinationDir)
|
||||||
.withNormalizer(CompileClasspathNormalizer::class.java)
|
.withNormalizer(CompileClasspathNormalizer::class.java)
|
||||||
.withPropertyName("${kotlinTask.name}OutputClasses")
|
.withPropertyName("${kotlinTask.name}OutputClasses")
|
||||||
@@ -1139,7 +1150,7 @@ internal fun Task.registerSubpluginOptionsAsInputs(subpluginId: String, subplugi
|
|||||||
}.run { /* exhaustive when */ }
|
}.run { /* exhaustive when */ }
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
inputs.property("$subpluginId." + option.key + indexSuffix, Callable { option.value })
|
inputsCompatible.propertyCompatible("$subpluginId." + option.key + indexSuffix, Callable { option.value })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -8,11 +8,16 @@ package org.jetbrains.kotlin.gradle.plugin.mpp
|
|||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.artifacts.ConfigurablePublishArtifact
|
import org.gradle.api.artifacts.ConfigurablePublishArtifact
|
||||||
import org.gradle.api.artifacts.Dependency
|
import org.gradle.api.artifacts.Dependency
|
||||||
|
import org.gradle.api.attributes.Usage.JAVA_API
|
||||||
|
import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE
|
||||||
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope
|
||||||
import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigurator
|
import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigurator
|
||||||
import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled
|
import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled
|
||||||
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
|
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
internal const val COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME = "commonMainMetadataElements"
|
internal const val COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME = "commonMainMetadataElements"
|
||||||
|
|||||||
+2
-2
@@ -351,8 +351,8 @@ internal fun sourcesJarTask(
|
|||||||
(project.tasks.findByName(taskName) as? Jar)?.let { return it }
|
(project.tasks.findByName(taskName) as? Jar)?.let { return it }
|
||||||
|
|
||||||
val result = project.tasks.create(taskName, Jar::class.java) { sourcesJar ->
|
val result = project.tasks.create(taskName, Jar::class.java) { sourcesJar ->
|
||||||
sourcesJar.archiveAppendix.set(artifactNameAppendix)
|
sourcesJar.setArchiveAppendixCompatible { artifactNameAppendix }
|
||||||
sourcesJar.archiveClassifier.set("sources")
|
sourcesJar.setArchiveClassifierCompatible { "sources" }
|
||||||
}
|
}
|
||||||
|
|
||||||
project.whenEvaluated {
|
project.whenEvaluated {
|
||||||
|
|||||||
+7
-5
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.jvm
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
|
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.usageByName
|
import org.jetbrains.kotlin.gradle.plugin.usageByName
|
||||||
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
|
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
|
||||||
|
|
||||||
object KotlinUsages {
|
object KotlinUsages {
|
||||||
const val KOTLIN_API = "kotlin-api"
|
const val KOTLIN_API = "kotlin-api"
|
||||||
@@ -40,14 +41,15 @@ object KotlinUsages {
|
|||||||
|
|
||||||
internal fun producerApiUsage(target: KotlinTarget) = target.project.usageByName(
|
internal fun producerApiUsage(target: KotlinTarget) = target.project.usageByName(
|
||||||
when (target.platformType) {
|
when (target.platformType) {
|
||||||
in jvmPlatformTypes -> "java-api-jars"
|
in jvmPlatformTypes ->
|
||||||
|
if (isGradleVersionAtLeast(5, 3)) "java-api-jars" else JAVA_API
|
||||||
else -> KOTLIN_API
|
else -> KOTLIN_API
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
internal fun producerRuntimeUsage(target: KotlinTarget) = target.project.usageByName(
|
internal fun producerRuntimeUsage(target: KotlinTarget) = target.project.usageByName(
|
||||||
when (target.platformType) {
|
when (target.platformType) {
|
||||||
in jvmPlatformTypes -> "java-runtime-jars"
|
in jvmPlatformTypes -> JAVA_RUNTIME_JARS
|
||||||
else -> KOTLIN_RUNTIME
|
else -> KOTLIN_RUNTIME
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -59,13 +61,13 @@ object KotlinUsages {
|
|||||||
when {
|
when {
|
||||||
consumerValue?.name == KOTLIN_API && producerValue?.name.let { it == JAVA_API || it == "java-api-jars" } ->
|
consumerValue?.name == KOTLIN_API && producerValue?.name.let { it == JAVA_API || it == "java-api-jars" } ->
|
||||||
compatible()
|
compatible()
|
||||||
consumerValue?.name in values && producerValue?.name.let { it == JAVA_RUNTIME || it == "java-runtime-jars" } ->
|
consumerValue?.name in values && producerValue?.name.let { it == JAVA_RUNTIME || it == JAVA_RUNTIME_JARS } ->
|
||||||
compatible()
|
compatible()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val javaUsagesForKotlinMetadataConsumers = listOf("java-api-jars", JAVA_API, "java-runtime-jars", JAVA_RUNTIME)
|
private val javaUsagesForKotlinMetadataConsumers = listOf("java-api-jars", JAVA_API, JAVA_RUNTIME_JARS, JAVA_RUNTIME)
|
||||||
|
|
||||||
private class KotlinMetadataCompatibility : AttributeCompatibilityRule<Usage> {
|
private class KotlinMetadataCompatibility : AttributeCompatibilityRule<Usage> {
|
||||||
override fun execute(details: CompatibilityCheckDetails<Usage>) = with(details) {
|
override fun execute(details: CompatibilityCheckDetails<Usage>) = with(details) {
|
||||||
@@ -105,7 +107,7 @@ object KotlinUsages {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val javaApiUsages = setOf(JAVA_API, "java-api-jars")
|
val javaApiUsages = setOf(JAVA_API, "java-api-jars")
|
||||||
val javaRuntimeUsages = setOf("java-runtime-jars", JAVA_RUNTIME)
|
val javaRuntimeUsages = setOf(JAVA_RUNTIME_JARS, JAVA_RUNTIME)
|
||||||
|
|
||||||
if (javaApiUsages.any { it in candidateNames } &&
|
if (javaApiUsages.any { it in candidateNames } &&
|
||||||
javaRuntimeUsages.any { it in candidateNames } &&
|
javaRuntimeUsages.any { it in candidateNames } &&
|
||||||
|
|||||||
+11
-2
@@ -16,6 +16,7 @@ import org.gradle.api.artifacts.result.ResolvedVariantResult
|
|||||||
import org.gradle.api.attributes.Usage
|
import org.gradle.api.attributes.Usage
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
|
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
|
||||||
import org.jetbrains.kotlin.gradle.plugin.usageByName
|
import org.jetbrains.kotlin.gradle.plugin.usageByName
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
internal class ResolvedMppVariantsProvider private constructor(private val project: Project) {
|
internal class ResolvedMppVariantsProvider private constructor(private val project: Project) {
|
||||||
@@ -104,7 +105,7 @@ internal class ResolvedMppVariantsProvider private constructor(private val proje
|
|||||||
|
|
||||||
configuration.incoming.resolutionResult.allComponents { component ->
|
configuration.incoming.resolutionResult.allComponents { component ->
|
||||||
val moduleId = ModuleIds.fromComponent(project, component)
|
val moduleId = ModuleIds.fromComponent(project, component)
|
||||||
val variants = component.variants
|
val variants = component.variantsCompatible
|
||||||
|
|
||||||
val isMpp = variants.any { variant -> variant.attributes.keySet().any { it.name == KotlinPlatformType.attribute.name } }
|
val isMpp = variants.any { variant -> variant.attributes.keySet().any { it.name == KotlinPlatformType.attribute.name } }
|
||||||
if (isMpp) {
|
if (isMpp) {
|
||||||
@@ -206,4 +207,12 @@ internal class ResolvedMppVariantsProvider private constructor(private val proje
|
|||||||
val resolvedMetadataArtifactByConfiguration: MutableMap<Configuration, File?> = HashMap()
|
val resolvedMetadataArtifactByConfiguration: MutableMap<Configuration, File?> = HashMap()
|
||||||
val chosenPlatformModuleByConfiguration: MutableMap<Configuration, ModuleEntry?> = HashMap()
|
val chosenPlatformModuleByConfiguration: MutableMap<Configuration, ModuleEntry?> = HashMap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val ResolvedComponentResult.variantsCompatible: List<ResolvedVariantResult>
|
||||||
|
get() = if (isGradleVersionAtLeast(5, 2)) {
|
||||||
|
variants
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
listOf(variant)
|
||||||
|
}
|
||||||
+3
@@ -26,7 +26,10 @@ import org.jetbrains.kotlin.gradle.plugin.sources.getSourceSetHierarchy
|
|||||||
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
|
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
|
||||||
import org.jetbrains.kotlin.gradle.tasks.locateTask
|
import org.jetbrains.kotlin.gradle.tasks.locateTask
|
||||||
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
|
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.archivePathCompatible
|
||||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
|
import java.io.File
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.*
|
||||||
import org.jetbrains.kotlin.gradle.utils.*
|
import org.jetbrains.kotlin.gradle.utils.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.Callable
|
import java.util.concurrent.Callable
|
||||||
|
|||||||
+33
-9
@@ -10,15 +10,15 @@ import org.gradle.api.DomainObjectSet
|
|||||||
import org.gradle.api.NamedDomainObjectContainer
|
import org.gradle.api.NamedDomainObjectContainer
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.artifacts.ConfigurablePublishArtifact
|
import org.gradle.api.artifacts.ConfigurablePublishArtifact
|
||||||
|
import org.gradle.api.artifacts.Configuration
|
||||||
import org.gradle.api.artifacts.PublishArtifact
|
import org.gradle.api.artifacts.PublishArtifact
|
||||||
import org.gradle.api.attributes.Attribute
|
import org.gradle.api.attributes.Attribute
|
||||||
import org.gradle.api.attributes.AttributeContainer
|
import org.gradle.api.attributes.AttributeContainer
|
||||||
import org.gradle.api.attributes.Usage
|
import org.gradle.api.attributes.Usage.JAVA_API
|
||||||
import org.gradle.api.attributes.Usage.JAVA_RUNTIME_JARS
|
import org.gradle.api.attributes.Usage.JAVA_RUNTIME_JARS
|
||||||
import org.gradle.api.component.ComponentWithCoordinates
|
import org.gradle.api.component.ComponentWithCoordinates
|
||||||
import org.gradle.api.component.ComponentWithVariants
|
import org.gradle.api.component.ComponentWithVariants
|
||||||
import org.gradle.api.component.SoftwareComponent
|
import org.gradle.api.component.SoftwareComponent
|
||||||
import org.gradle.api.component.SoftwareComponentFactory
|
|
||||||
import org.gradle.api.internal.component.SoftwareComponentInternal
|
import org.gradle.api.internal.component.SoftwareComponentInternal
|
||||||
import org.gradle.api.internal.component.UsageContext
|
import org.gradle.api.internal.component.UsageContext
|
||||||
import org.gradle.api.internal.project.ProjectInternal
|
import org.gradle.api.internal.project.ProjectInternal
|
||||||
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
|
|||||||
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
|
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
|
||||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
|
|
||||||
internal const val PRIMARY_SINGLE_COMPONENT_NAME = "kotlin"
|
internal const val PRIMARY_SINGLE_COMPONENT_NAME = "kotlin"
|
||||||
@@ -79,16 +80,32 @@ abstract class AbstractKotlinTarget(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val components: Set<SoftwareComponent> by lazy {
|
override val components: Set<SoftwareComponent> by lazy {
|
||||||
buildAdhocComponentsFromKotlinVariants(kotlinComponents)
|
val kotlinVariants = kotlinComponents
|
||||||
|
if (isGradleVersionAtLeast(5, 3)) {
|
||||||
|
buildAdhocComponentsFromKotlinVariants(kotlinVariants)
|
||||||
|
} else {
|
||||||
|
kotlinVariants.also { project.components.addAll(it) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This API is introduced in Gradle 5.3. TODO when we build against Gradle 5.3+, rewrite this function
|
||||||
private fun buildAdhocComponentsFromKotlinVariants(kotlinVariants: Set<KotlinTargetComponent>): Set<SoftwareComponent> {
|
private fun buildAdhocComponentsFromKotlinVariants(kotlinVariants: Set<KotlinTargetComponent>): Set<SoftwareComponent> {
|
||||||
val softwareComponentFactoryClass = SoftwareComponentFactory::class.java
|
val softwareComponentFactoryClass = Class.forName("org.gradle.api.component.SoftwareComponentFactory")
|
||||||
// TODO replace internal API access with injection (not possible until we have this class on the compile classpath)
|
// TODO replace internal API access with injection (not possible until we have this class on the compile classpath)
|
||||||
val softwareComponentFactory = (project as ProjectInternal).services.get(softwareComponentFactoryClass)
|
val softwareComponentFactory = (project as ProjectInternal).services.get(softwareComponentFactoryClass)
|
||||||
|
|
||||||
|
val adhocMethod = softwareComponentFactoryClass.getMethod("adhoc", String::class.java)
|
||||||
|
val adhocSoftwareComponentClass = Class.forName("org.gradle.api.component.AdhocComponentWithVariants")
|
||||||
|
val addVariantsFromConfigurationMethod = adhocSoftwareComponentClass.getMethod(
|
||||||
|
"addVariantsFromConfiguration", Configuration::class.java, org.gradle.api.Action::class.java
|
||||||
|
)
|
||||||
|
val configurationVariantDetailsClass = Class.forName("org.gradle.api.component.ConfigurationVariantDetails")
|
||||||
|
val mapToMavenScopeMethod = configurationVariantDetailsClass.getMethod(
|
||||||
|
"mapToMavenScope", String::class.java
|
||||||
|
)
|
||||||
|
|
||||||
return kotlinVariants.map { kotlinVariant ->
|
return kotlinVariants.map { kotlinVariant ->
|
||||||
val adhocVariant = softwareComponentFactory.adhoc(kotlinVariant.name)
|
val adhocVariant = adhocMethod(softwareComponentFactory, kotlinVariant.name)
|
||||||
|
|
||||||
project.whenEvaluated {
|
project.whenEvaluated {
|
||||||
(kotlinVariant as SoftwareComponentInternal).usages.filterIsInstance<KotlinUsageContext>().forEach { kotlinUsageContext ->
|
(kotlinVariant as SoftwareComponentInternal).usages.filterIsInstance<KotlinUsageContext>().forEach { kotlinUsageContext ->
|
||||||
@@ -110,14 +127,16 @@ abstract class AbstractKotlinTarget(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
adhocVariant.addVariantsFromConfiguration(configuration) { configurationVariantDetails ->
|
val chooseMavenScopeAction = Action<Any> { configurationVariantDetails ->
|
||||||
val mavenScope = when (kotlinUsageContext.usage.name) {
|
val mavenScope = when (kotlinUsageContext.usage.name) {
|
||||||
"java-api-jars" -> "compile"
|
"java-api-jars" -> "compile"
|
||||||
"java-runtime-jars" -> "runtime"
|
JAVA_RUNTIME_JARS -> "runtime"
|
||||||
else -> error("unexpected usage value '${kotlinUsageContext.usage.name}'")
|
else -> error("unexpected usage value '${kotlinUsageContext.usage.name}'")
|
||||||
}
|
}
|
||||||
configurationVariantDetails.mapToMavenScope(mavenScope)
|
mapToMavenScopeMethod(configurationVariantDetails, mavenScope)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addVariantsFromConfigurationMethod(adhocVariant, configuration, chooseMavenScopeAction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,7 +239,12 @@ abstract class AbstractKotlinTarget(
|
|||||||
internal fun KotlinTarget.disambiguateName(simpleName: String) =
|
internal fun KotlinTarget.disambiguateName(simpleName: String) =
|
||||||
lowerCamelCaseName(targetName, simpleName)
|
lowerCamelCaseName(targetName, simpleName)
|
||||||
|
|
||||||
internal fun javaApiUsageForMavenScoping() = "java-api-jars"
|
internal fun javaApiUsageForMavenScoping() =
|
||||||
|
if (isGradleVersionAtLeast(5, 3)) {
|
||||||
|
"java-api-jars"
|
||||||
|
} else {
|
||||||
|
JAVA_API
|
||||||
|
}
|
||||||
|
|
||||||
abstract class KotlinOnlyTarget<T : KotlinCompilation<*>>(
|
abstract class KotlinOnlyTarget<T : KotlinCompilation<*>>(
|
||||||
project: Project,
|
project: Project,
|
||||||
|
|||||||
+28
-5
@@ -9,6 +9,8 @@ import groovy.lang.Closure
|
|||||||
import org.gradle.api.InvalidUserCodeException
|
import org.gradle.api.InvalidUserCodeException
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.file.SourceDirectorySet
|
import org.gradle.api.file.SourceDirectorySet
|
||||||
|
import org.gradle.api.internal.file.DefaultSourceDirectorySet
|
||||||
|
import org.gradle.api.internal.file.FileResolver
|
||||||
import org.gradle.util.ConfigureUtil
|
import org.gradle.util.ConfigureUtil
|
||||||
import org.jetbrains.kotlin.build.DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS
|
import org.jetbrains.kotlin.build.DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler
|
import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler
|
||||||
@@ -26,7 +28,8 @@ const val METADATA_CONFIGURATION_NAME_SUFFIX = "DependenciesMetadata"
|
|||||||
|
|
||||||
class DefaultKotlinSourceSet(
|
class DefaultKotlinSourceSet(
|
||||||
private val project: Project,
|
private val project: Project,
|
||||||
val displayName: String
|
val displayName: String,
|
||||||
|
fileResolver: FileResolver
|
||||||
) : KotlinSourceSet {
|
) : KotlinSourceSet {
|
||||||
|
|
||||||
override val apiConfigurationName: String
|
override val apiConfigurationName: String
|
||||||
@@ -53,7 +56,7 @@ class DefaultKotlinSourceSet(
|
|||||||
override val runtimeOnlyMetadataConfigurationName: String
|
override val runtimeOnlyMetadataConfigurationName: String
|
||||||
get() = lowerCamelCaseName(runtimeOnlyConfigurationName, METADATA_CONFIGURATION_NAME_SUFFIX)
|
get() = lowerCamelCaseName(runtimeOnlyConfigurationName, METADATA_CONFIGURATION_NAME_SUFFIX)
|
||||||
|
|
||||||
override val kotlin: SourceDirectorySet = createDefaultSourceDirectorySet(project, "$name Kotlin source").apply {
|
override val kotlin: SourceDirectorySet = createDefaultSourceDirectorySet(project, "$name Kotlin source", fileResolver).apply {
|
||||||
filter.include("**/*.java")
|
filter.include("**/*.java")
|
||||||
filter.include("**/*.kt")
|
filter.include("**/*.kt")
|
||||||
filter.include("**/*.kts")
|
filter.include("**/*.kts")
|
||||||
@@ -61,7 +64,7 @@ class DefaultKotlinSourceSet(
|
|||||||
|
|
||||||
override val languageSettings: LanguageSettingsBuilder = DefaultLanguageSettingsBuilder()
|
override val languageSettings: LanguageSettingsBuilder = DefaultLanguageSettingsBuilder()
|
||||||
|
|
||||||
override val resources: SourceDirectorySet = createDefaultSourceDirectorySet(project, "$name resources")
|
override val resources: SourceDirectorySet = createDefaultSourceDirectorySet(project, "$name resources", fileResolver)
|
||||||
|
|
||||||
override fun kotlin(configureClosure: Closure<Any?>): SourceDirectorySet =
|
override fun kotlin(configureClosure: Closure<Any?>): SourceDirectorySet =
|
||||||
kotlin.apply { ConfigureUtil.configure(configureClosure, this) }
|
kotlin.apply { ConfigureUtil.configure(configureClosure, this) }
|
||||||
@@ -223,8 +226,28 @@ internal fun KotlinSourceSet.disambiguateName(simpleName: String): String {
|
|||||||
return lowerCamelCaseName(*nameParts.toTypedArray())
|
return lowerCamelCaseName(*nameParts.toTypedArray())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createDefaultSourceDirectorySet(project: Project, name: String?): SourceDirectorySet =
|
private fun createDefaultSourceDirectorySet(project: Project, name: String?, resolver: FileResolver?): SourceDirectorySet {
|
||||||
project.objects.sourceDirectorySet(name, name)
|
if (isGradleVersionAtLeast(5, 0)) {
|
||||||
|
val objects = project.objects
|
||||||
|
val sourceDirectorySetMethod = objects.javaClass.methods.single { it.name == "sourceDirectorySet" && it.parameterCount == 2 }
|
||||||
|
return sourceDirectorySetMethod(objects, name, name) as SourceDirectorySet
|
||||||
|
}
|
||||||
|
|
||||||
|
val klass = DefaultSourceDirectorySet::class.java
|
||||||
|
val defaultConstructor = klass.constructorOrNull(String::class.java, FileResolver::class.java)
|
||||||
|
|
||||||
|
return if (defaultConstructor != null && defaultConstructor.getAnnotation(java.lang.Deprecated::class.java) == null) {
|
||||||
|
// TODO: drop when gradle < 2.12 are obsolete
|
||||||
|
defaultConstructor.newInstance(name, resolver)
|
||||||
|
} else {
|
||||||
|
val directoryFileTreeFactoryClass = Class.forName("org.gradle.api.internal.file.collections.DirectoryFileTreeFactory")
|
||||||
|
val alternativeConstructor = klass.getConstructor(String::class.java, FileResolver::class.java, directoryFileTreeFactoryClass)
|
||||||
|
|
||||||
|
val defaultFileTreeFactoryClass = Class.forName("org.gradle.api.internal.file.collections.DefaultDirectoryFileTreeFactory")
|
||||||
|
val defaultFileTreeFactory = defaultFileTreeFactoryClass.getConstructor().newInstance()
|
||||||
|
alternativeConstructor.newInstance(name, resolver, defaultFileTreeFactory)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal fun KotlinSourceSet.getSourceSetHierarchy(): Set<KotlinSourceSet> {
|
internal fun KotlinSourceSet.getSourceSetHierarchy(): Set<KotlinSourceSet> {
|
||||||
val result = mutableSetOf<KotlinSourceSet>()
|
val result = mutableSetOf<KotlinSourceSet>()
|
||||||
|
|||||||
+1
-1
@@ -88,6 +88,6 @@ internal class DefaultKotlinSourceSetFactory(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun doCreateSourceSet(name: String): DefaultKotlinSourceSet {
|
override fun doCreateSourceSet(name: String): DefaultKotlinSourceSet {
|
||||||
return DefaultKotlinSourceSet(project, name)
|
return DefaultKotlinSourceSet(project, name, fileResolver)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+18
-9
@@ -22,11 +22,15 @@ import org.jetbrains.kotlin.gradle.internal.KaptGenerateStubsTask
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
import org.jetbrains.kotlin.gradle.scripting.ScriptingExtension
|
import org.jetbrains.kotlin.gradle.scripting.ScriptingExtension
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
|
||||||
import org.jetbrains.kotlin.scripting.compiler.plugin.impl.reporter
|
import org.jetbrains.kotlin.scripting.compiler.plugin.impl.reporter
|
||||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsFromClasspathDiscoverySource
|
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsFromClasspathDiscoverySource
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
|
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
|
||||||
|
|
||||||
|
private const val MIN_SUPPORTED_GRADLE_MAJOR_VERSION = 5
|
||||||
|
private const val MIN_SUPPORTED_GRADLE_MINOR_VERSION = 0
|
||||||
|
|
||||||
private const val SCRIPTING_LOG_PREFIX = "kotlin scripting plugin:"
|
private const val SCRIPTING_LOG_PREFIX = "kotlin scripting plugin:"
|
||||||
|
|
||||||
class ScriptingGradleSubplugin : Plugin<Project> {
|
class ScriptingGradleSubplugin : Plugin<Project> {
|
||||||
@@ -66,7 +70,10 @@ class ScriptingGradleSubplugin : Plugin<Project> {
|
|||||||
discoveryClasspathConfiguration.allDependencies.isEmpty() -> {
|
discoveryClasspathConfiguration.allDependencies.isEmpty() -> {
|
||||||
// skip further checks - user did not configured any discovery sources
|
// skip further checks - user did not configured any discovery sources
|
||||||
}
|
}
|
||||||
else -> configureScriptsExtensions(project, javaPluginConvention, task.sourceSetName)
|
!isGradleVersionAtLeast(MIN_SUPPORTED_GRADLE_MAJOR_VERSION, MIN_SUPPORTED_GRADLE_MINOR_VERSION) ->
|
||||||
|
project.logger.warn("$SCRIPTING_LOG_PREFIX incompatible Gradle version. Please use the plugin with Gradle version $MIN_SUPPORTED_GRADLE_MAJOR_VERSION.$MIN_SUPPORTED_GRADLE_MINOR_VERSION or newer.")
|
||||||
|
else ->
|
||||||
|
configureScriptsExtensions(project, javaPluginConvention, task.sourceSetName)
|
||||||
}
|
}
|
||||||
} catch (e: IllegalStateException) {
|
} catch (e: IllegalStateException) {
|
||||||
project.logger.warn("$SCRIPTING_LOG_PREFIX applied in the non-supported environment (error received: ${e.message})")
|
project.logger.warn("$SCRIPTING_LOG_PREFIX applied in the non-supported environment (error received: ${e.message})")
|
||||||
@@ -139,14 +146,16 @@ private fun configureDiscoveryTransformation(
|
|||||||
project.configurations.maybeCreate(discoveryResultsConfigurationName).apply {
|
project.configurations.maybeCreate(discoveryResultsConfigurationName).apply {
|
||||||
isCanBeConsumed = false
|
isCanBeConsumed = false
|
||||||
}
|
}
|
||||||
project.dependencies.apply {
|
if (isGradleVersionAtLeast(MIN_SUPPORTED_GRADLE_MAJOR_VERSION, MIN_SUPPORTED_GRADLE_MINOR_VERSION)) {
|
||||||
add(
|
project.dependencies.apply {
|
||||||
discoveryResultsConfigurationName,
|
add(
|
||||||
project.withRegisteredDiscoverScriptExtensionsTransform {
|
discoveryResultsConfigurationName,
|
||||||
discoveryConfiguration.discoverScriptExtensionsFiles()
|
project.withRegisteredDiscoverScriptExtensionsTransform {
|
||||||
}
|
discoveryConfiguration.discoverScriptExtensionsFiles()
|
||||||
)
|
}
|
||||||
}
|
)
|
||||||
|
}
|
||||||
|
} // otherwise the warning should already be reported in the ScriptingGradleSubplugin.apply
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class DiscoverScriptExtensionsTransform : ArtifactTransform() {
|
internal class DiscoverScriptExtensionsTransform : ArtifactTransform() {
|
||||||
|
|||||||
+1
@@ -13,6 +13,7 @@ import org.gradle.api.Project
|
|||||||
import org.gradle.api.attributes.Usage.JAVA_RUNTIME_JARS
|
import org.gradle.api.attributes.Usage.JAVA_RUNTIME_JARS
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
|
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
|
||||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
|
|
||||||
open class KotlinAndroidTarget(
|
open class KotlinAndroidTarget(
|
||||||
|
|||||||
+2
-1
@@ -55,7 +55,8 @@ open class KotlinJsIrTargetConfigurator(kotlinPluginVersion: String) :
|
|||||||
|
|
||||||
override fun createArchiveTasks(target: KotlinJsIrTarget): Zip {
|
override fun createArchiveTasks(target: KotlinJsIrTarget): Zip {
|
||||||
return super.createArchiveTasks(target).apply {
|
return super.createArchiveTasks(target).apply {
|
||||||
archiveExtension.set(KLIB_TYPE)
|
// not archiveExtension because it is since Gradle 5.1 only
|
||||||
|
extension = KLIB_TYPE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-4
@@ -1,12 +1,15 @@
|
|||||||
package org.jetbrains.kotlin.gradle.targets.js.nodejs
|
package org.jetbrains.kotlin.gradle.targets.js.nodejs
|
||||||
|
|
||||||
import org.gradle.api.DefaultTask
|
import org.gradle.api.DefaultTask
|
||||||
|
import org.gradle.api.artifacts.repositories.IvyPatternRepositoryLayout
|
||||||
import org.gradle.api.tasks.CacheableTask
|
import org.gradle.api.tasks.CacheableTask
|
||||||
import org.gradle.api.tasks.Input
|
import org.gradle.api.tasks.Input
|
||||||
import org.gradle.api.tasks.OutputDirectory
|
import org.gradle.api.tasks.OutputDirectory
|
||||||
import org.gradle.api.tasks.TaskAction
|
import org.gradle.api.tasks.TaskAction
|
||||||
import org.jetbrains.kotlin.gradle.logging.kotlinInfo
|
import org.jetbrains.kotlin.gradle.logging.kotlinInfo
|
||||||
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.patternLayoutCompatible
|
||||||
import org.jetbrains.kotlin.statistics.metrics.NumericalMetrics
|
import org.jetbrains.kotlin.statistics.metrics.NumericalMetrics
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.URI
|
import java.net.URI
|
||||||
@@ -37,12 +40,15 @@ open class NodeJsSetupTask : DefaultTask() {
|
|||||||
repo.name = "Node Distributions at ${settings.nodeDownloadBaseUrl}"
|
repo.name = "Node Distributions at ${settings.nodeDownloadBaseUrl}"
|
||||||
repo.url = URI(settings.nodeDownloadBaseUrl)
|
repo.url = URI(settings.nodeDownloadBaseUrl)
|
||||||
|
|
||||||
repo.patternLayout {
|
repo.patternLayoutCompatible {
|
||||||
it.artifact("v[revision]/[artifact](-v[revision]-[classifier]).[ext]")
|
artifact("v[revision]/[artifact](-v[revision]-[classifier]).[ext]")
|
||||||
it.ivy("v[revision]/ivy.xml")
|
ivy("v[revision]/ivy.xml")
|
||||||
}
|
}
|
||||||
repo.metadataSources { it.artifact() }
|
repo.metadataSources { it.artifact() }
|
||||||
repo.content { it.includeModule("org.nodejs", "node") }
|
|
||||||
|
if (isGradleVersionAtLeast(5, 1)) {
|
||||||
|
repo.content { it.includeModule("org.nodejs", "node") }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val dep = this.project.dependencies.create(ivyDependency)
|
val dep = this.project.dependencies.create(ivyDependency)
|
||||||
|
|||||||
+1
-1
@@ -113,7 +113,7 @@ open class KotlinJvmTarget @Inject constructor(
|
|||||||
val targetJar = project.tasks.getByName(artifactsTaskName) as Jar
|
val targetJar = project.tasks.getByName(artifactsTaskName) as Jar
|
||||||
val javaJar = project.tasks.getByName(javaPluginConvention.sourceSets.getByName("main").jarTaskName) as Jar
|
val javaJar = project.tasks.getByName(javaPluginConvention.sourceSets.getByName("main").jarTaskName) as Jar
|
||||||
(javaJar.source as? ConfigurableFileCollection)?.setFrom(targetJar.source)
|
(javaJar.source as? ConfigurableFileCollection)?.setFrom(targetJar.source)
|
||||||
javaJar.conventionMapping("archiveName") { targetJar.archiveFileName.get() }
|
javaJar.conventionMapping("archiveName") { targetJar.archiveName }
|
||||||
javaJar.dependsOn(targetJar)
|
javaJar.dependsOn(targetJar)
|
||||||
javaJar.enabled = false
|
javaJar.enabled = false
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -46,7 +46,7 @@ open class KotlinWithJavaTarget<KotlinOptionsType : KotlinCommonOptions>(
|
|||||||
internal val defaultArtifactClassesListFile: File
|
internal val defaultArtifactClassesListFile: File
|
||||||
get() {
|
get() {
|
||||||
val jarTask = project.tasks.getByName(artifactsTaskName) as Jar
|
val jarTask = project.tasks.getByName(artifactsTaskName) as Jar
|
||||||
return File(File(project.buildDir, KOTLIN_BUILD_DIR_NAME), "${sanitizeFileName(jarTask.archiveFileName.get())}-classes.txt")
|
return File(File(project.buildDir, KOTLIN_BUILD_DIR_NAME), "${sanitizeFileName(jarTask.archiveName)}-classes.txt")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-3
@@ -29,6 +29,8 @@ import org.jetbrains.kotlin.gradle.tasks.locateTask
|
|||||||
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
||||||
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
|
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
|
||||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.setArchiveAppendixCompatible
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.setArchiveClassifierCompatible
|
||||||
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
|
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
|
||||||
import java.util.concurrent.Callable
|
import java.util.concurrent.Callable
|
||||||
|
|
||||||
@@ -136,7 +138,7 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) :
|
|||||||
if (target.project.isKotlinGranularMetadataEnabled) {
|
if (target.project.isKotlinGranularMetadataEnabled) {
|
||||||
target.project.locateTask<Jar>(target.artifactsTaskName)!!.configure {
|
target.project.locateTask<Jar>(target.artifactsTaskName)!!.configure {
|
||||||
if (!target.project.isCompatibilityMetadataVariantEnabled) {
|
if (!target.project.isCompatibilityMetadataVariantEnabled) {
|
||||||
it.archiveClassifier.set("commonMain")
|
it.setArchiveClassifierCompatible { "commonMain" }
|
||||||
}
|
}
|
||||||
it.onlyIf { target.project.isCompatibilityMetadataVariantEnabled }
|
it.onlyIf { target.project.isCompatibilityMetadataVariantEnabled }
|
||||||
}
|
}
|
||||||
@@ -149,10 +151,10 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) :
|
|||||||
allMetadataJar.description = "Assembles a jar archive containing the metadata for all Kotlin source sets."
|
allMetadataJar.description = "Assembles a jar archive containing the metadata for all Kotlin source sets."
|
||||||
allMetadataJar.group = BasePlugin.BUILD_GROUP
|
allMetadataJar.group = BasePlugin.BUILD_GROUP
|
||||||
|
|
||||||
allMetadataJar.archiveAppendix.set(target.name.toLowerCase())
|
allMetadataJar.setArchiveAppendixCompatible { target.name.toLowerCase() }
|
||||||
|
|
||||||
if (target.project.isCompatibilityMetadataVariantEnabled) {
|
if (target.project.isCompatibilityMetadataVariantEnabled) {
|
||||||
allMetadataJar.archiveClassifier.set("all")
|
allMetadataJar.setArchiveClassifierCompatible { "all" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -25,6 +25,8 @@ import org.jetbrains.kotlin.gradle.targets.native.KotlinNativeHostTestRun
|
|||||||
import org.jetbrains.kotlin.gradle.targets.native.KotlinNativeSimulatorTestRun
|
import org.jetbrains.kotlin.gradle.targets.native.KotlinNativeSimulatorTestRun
|
||||||
import org.jetbrains.kotlin.gradle.targets.native.NativeBinaryTestRunSource
|
import org.jetbrains.kotlin.gradle.targets.native.NativeBinaryTestRunSource
|
||||||
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.setArchiveAppendixCompatible
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.setArchiveClassifierCompatible
|
||||||
import org.jetbrains.kotlin.konan.target.HostManager
|
import org.jetbrains.kotlin.konan.target.HostManager
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@@ -60,8 +62,8 @@ open class KotlinNativeTarget @Inject constructor(
|
|||||||
|
|
||||||
if (hostSpecificSourceSets.isNotEmpty()) {
|
if (hostSpecificSourceSets.isNotEmpty()) {
|
||||||
val hostSpecificMetadataJar = project.locateOrRegisterTask<Jar>(hostSpecificMetadataJarTaskName) {
|
val hostSpecificMetadataJar = project.locateOrRegisterTask<Jar>(hostSpecificMetadataJarTaskName) {
|
||||||
it.archiveAppendix.set(project.provider { disambiguationClassifier.orEmpty().toLowerCase() })
|
it.setArchiveAppendixCompatible { disambiguationClassifier.orEmpty().toLowerCase() }
|
||||||
it.archiveClassifier.set("metadata")
|
it.setArchiveClassifierCompatible { "metadata" }
|
||||||
}
|
}
|
||||||
project.artifacts.add(Dependency.ARCHIVES_CONFIGURATION, hostSpecificMetadataJar)
|
project.artifacts.add(Dependency.ARCHIVES_CONFIGURATION, hostSpecificMetadataJar)
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -82,8 +82,8 @@ class NativeCompilerDownloader(
|
|||||||
private fun setupRepo(repoUrl: String): ArtifactRepository {
|
private fun setupRepo(repoUrl: String): ArtifactRepository {
|
||||||
return project.repositories.ivy { repo ->
|
return project.repositories.ivy { repo ->
|
||||||
repo.setUrl(repoUrl)
|
repo.setUrl(repoUrl)
|
||||||
repo.patternLayout {
|
repo.patternLayoutCompatible {
|
||||||
it.artifact("[artifact]-[revision].[ext]")
|
artifact("[artifact]-[revision].[ext]")
|
||||||
}
|
}
|
||||||
repo.metadataSources {
|
repo.metadataSources {
|
||||||
it.artifact()
|
it.artifact()
|
||||||
|
|||||||
+3
-1
@@ -17,12 +17,14 @@
|
|||||||
package org.jetbrains.kotlin.gradle.tasks
|
package org.jetbrains.kotlin.gradle.tasks
|
||||||
|
|
||||||
import org.gradle.api.Task
|
import org.gradle.api.Task
|
||||||
|
import org.gradle.util.GradleVersion
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.outputsCompatible
|
||||||
|
|
||||||
internal fun isBuildCacheEnabledForKotlin(): Boolean =
|
internal fun isBuildCacheEnabledForKotlin(): Boolean =
|
||||||
System.getProperty(KOTLIN_CACHING_ENABLED_PROPERTY)?.toBoolean() ?: true
|
System.getProperty(KOTLIN_CACHING_ENABLED_PROPERTY)?.toBoolean() ?: true
|
||||||
|
|
||||||
internal fun <T : Task> T.cacheOnlyIfEnabledForKotlin() {
|
internal fun <T : Task> T.cacheOnlyIfEnabledForKotlin() {
|
||||||
outputs.cacheIf { isBuildCacheEnabledForKotlin() }
|
outputsCompatible.cacheIf { isBuildCacheEnabledForKotlin() }
|
||||||
}
|
}
|
||||||
|
|
||||||
private const val KOTLIN_CACHING_ENABLED_PROPERTY = "kotlin.caching.enabled"
|
private const val KOTLIN_CACHING_ENABLED_PROPERTY = "kotlin.caching.enabled"
|
||||||
|
|||||||
+3
@@ -9,8 +9,11 @@ import org.gradle.api.DefaultTask
|
|||||||
import org.gradle.api.file.FileCollection
|
import org.gradle.api.file.FileCollection
|
||||||
import org.gradle.api.plugins.JavaPluginConvention
|
import org.gradle.api.plugins.JavaPluginConvention
|
||||||
import org.gradle.api.tasks.*
|
import org.gradle.api.tasks.*
|
||||||
|
import org.gradle.api.tasks.bundling.AbstractArchiveTask
|
||||||
|
import org.gradle.jvm.tasks.Jar
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinSingleJavaTargetExtension
|
import org.jetbrains.kotlin.gradle.dsl.KotlinSingleJavaTargetExtension
|
||||||
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.archivePathCompatible
|
||||||
import org.jetbrains.kotlin.gradle.utils.newProperty
|
import org.jetbrains.kotlin.gradle.utils.newProperty
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -15,6 +15,7 @@ import org.gradle.process.internal.ExecHandleFactory
|
|||||||
import org.jetbrains.kotlin.gradle.internal.testing.KotlinTestRunnerListener
|
import org.jetbrains.kotlin.gradle.internal.testing.KotlinTestRunnerListener
|
||||||
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutor
|
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutor
|
||||||
import org.jetbrains.kotlin.gradle.utils.injected
|
import org.jetbrains.kotlin.gradle.utils.injected
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
abstract class KotlinTest : AbstractTestTask() {
|
abstract class KotlinTest : AbstractTestTask() {
|
||||||
@@ -38,7 +39,7 @@ abstract class KotlinTest : AbstractTestTask() {
|
|||||||
|
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
val excludePatterns: Set<String>
|
val excludePatterns: Set<String>
|
||||||
@Input get() = excludes + filterExt.excludePatterns
|
@Input get() = excludes + if (isGradleVersionAtLeast(5, 0)) filterExt.excludePatterns else emptySet()
|
||||||
|
|
||||||
@get:Inject
|
@get:Inject
|
||||||
open val fileResolver: FileResolver
|
open val fileResolver: FileResolver
|
||||||
|
|||||||
+9
-1
@@ -442,9 +442,17 @@ open class KotlinCompile : AbstractKotlinCompile<K2JVMCompilerArguments>(), Kotl
|
|||||||
private fun disableMultiModuleIC(): Boolean {
|
private fun disableMultiModuleIC(): Boolean {
|
||||||
if (!isIncrementalCompilationEnabled() || javaOutputDir == null) return false
|
if (!isIncrementalCompilationEnabled() || javaOutputDir == null) return false
|
||||||
|
|
||||||
|
fun forEachTask(fn: (Task) -> Unit) {
|
||||||
|
if (isGradleVersionAtLeast(4, 10)) {
|
||||||
|
project.tasks.configureEach(fn)
|
||||||
|
} else {
|
||||||
|
project.tasks.forEach(fn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var illegalTaskOrNull: AbstractCompile? = null
|
var illegalTaskOrNull: AbstractCompile? = null
|
||||||
|
|
||||||
project.tasks.configureEach {
|
forEachTask {
|
||||||
if (it is AbstractCompile &&
|
if (it is AbstractCompile &&
|
||||||
it !is JavaCompile &&
|
it !is JavaCompile &&
|
||||||
it !is AbstractKotlinCompile<*> &&
|
it !is AbstractKotlinCompile<*> &&
|
||||||
|
|||||||
+2
-2
@@ -68,7 +68,7 @@ internal inline fun <reified T : Task> Project.locateTask(name: String): TaskPro
|
|||||||
* with [name], type [T] and initialization script [body]
|
* with [name], type [T] and initialization script [body]
|
||||||
*/
|
*/
|
||||||
internal inline fun <reified T : Task> Project.locateOrRegisterTask(name: String, noinline body: (T) -> (Unit)): TaskProvider<T> {
|
internal inline fun <reified T : Task> Project.locateOrRegisterTask(name: String, noinline body: (T) -> (Unit)): TaskProvider<T> {
|
||||||
return project.locateTask(name) ?: project.registerTask(name, T::class.java, body = body)
|
return project.locateTask(name) ?: registerTask(project, name, T::class.java, body)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal open class KotlinTasksProvider(val targetName: String) {
|
internal open class KotlinTasksProvider(val targetName: String) {
|
||||||
@@ -80,7 +80,7 @@ internal open class KotlinTasksProvider(val targetName: String) {
|
|||||||
): TaskProvider<out KotlinCompile> {
|
): TaskProvider<out KotlinCompile> {
|
||||||
val properties = PropertiesProvider(project)
|
val properties = PropertiesProvider(project)
|
||||||
val taskClass = taskOrWorkersTask<KotlinCompile, KotlinCompileWithWorkers>(properties)
|
val taskClass = taskOrWorkersTask<KotlinCompile, KotlinCompileWithWorkers>(properties)
|
||||||
val result = project.registerTask(name, taskClass) {
|
val result = registerTask(project, name, taskClass) {
|
||||||
configureAction(it)
|
configureAction(it)
|
||||||
}
|
}
|
||||||
configure(result, project, properties, compilation)
|
configure(result, project, properties, compilation)
|
||||||
|
|||||||
+49
-4
@@ -16,16 +16,17 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.utils
|
package org.jetbrains.kotlin.gradle.utils
|
||||||
|
|
||||||
|
import org.gradle.api.Action
|
||||||
import org.gradle.api.GradleException
|
import org.gradle.api.GradleException
|
||||||
import org.gradle.api.Task
|
import org.gradle.api.Task
|
||||||
|
import org.gradle.api.artifacts.repositories.IvyArtifactRepository
|
||||||
|
import org.gradle.api.artifacts.repositories.IvyPatternRepositoryLayout
|
||||||
import org.gradle.api.tasks.TaskInputs
|
import org.gradle.api.tasks.TaskInputs
|
||||||
import org.gradle.api.tasks.TaskOutputs
|
import org.gradle.api.tasks.TaskOutputs
|
||||||
import org.gradle.api.tasks.bundling.AbstractArchiveTask
|
import org.gradle.api.tasks.bundling.AbstractArchiveTask
|
||||||
import org.gradle.util.GradleVersion
|
import org.gradle.util.GradleVersion
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
const val minSupportedGradleVersion = "5.4"
|
|
||||||
|
|
||||||
internal val Task.inputsCompatible: TaskInputs get() = inputs
|
internal val Task.inputsCompatible: TaskInputs get() = inputs
|
||||||
|
|
||||||
internal val Task.outputsCompatible: TaskOutputs get() = outputs
|
internal val Task.outputsCompatible: TaskOutputs get() = outputs
|
||||||
@@ -52,7 +53,7 @@ internal fun TaskInputs.dirCompatible(dirPath: Any) {
|
|||||||
|
|
||||||
internal fun checkGradleCompatibility(
|
internal fun checkGradleCompatibility(
|
||||||
withComponent: String = "the Kotlin Gradle plugin",
|
withComponent: String = "the Kotlin Gradle plugin",
|
||||||
minSupportedVersion: GradleVersion = GradleVersion.version(minSupportedGradleVersion)
|
minSupportedVersion: GradleVersion = GradleVersion.version("4.9")
|
||||||
) {
|
) {
|
||||||
val currentVersion = GradleVersion.current()
|
val currentVersion = GradleVersion.current()
|
||||||
if (currentVersion < minSupportedVersion) {
|
if (currentVersion < minSupportedVersion) {
|
||||||
@@ -63,5 +64,49 @@ internal fun checkGradleCompatibility(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun AbstractArchiveTask.setArchiveAppendixCompatible(appendixProvider: () -> String) {
|
||||||
|
if (isGradleVersionAtLeast(5, 2)) {
|
||||||
|
archiveAppendix.set(project.provider { appendixProvider() })
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
appendix = appendixProvider()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal val AbstractArchiveTask.archivePathCompatible: File
|
internal val AbstractArchiveTask.archivePathCompatible: File
|
||||||
get() = archiveFile.get().asFile
|
get() =
|
||||||
|
if (isGradleVersionAtLeast(5, 1)) {
|
||||||
|
archiveFile.get().asFile
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
archivePath
|
||||||
|
}
|
||||||
|
|
||||||
|
internal val AbstractArchiveTask.archiveNameCompatible: String
|
||||||
|
get() =
|
||||||
|
if (isGradleVersionAtLeast(5, 1)) {
|
||||||
|
archiveFileName.get()
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
archiveName
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun AbstractArchiveTask.setArchiveClassifierCompatible(classifierProvider: () -> String) {
|
||||||
|
if (isGradleVersionAtLeast(5, 2)) {
|
||||||
|
archiveClassifier.set(project.provider { classifierProvider() })
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
classifier = classifierProvider()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun IvyArtifactRepository.patternLayoutCompatible(config: IvyPatternRepositoryLayout.() -> Unit) {
|
||||||
|
if (isGradleVersionAtLeast(5, 0)) {
|
||||||
|
patternLayout(config)
|
||||||
|
} else {
|
||||||
|
// The "layout" method is planned to be removed in Gradle 6.0. Access it using reflection.
|
||||||
|
javaClass
|
||||||
|
.getMethod("layout", String::class.java, Action::class.java)
|
||||||
|
.invoke(this, "pattern", Action<IvyPatternRepositoryLayout> { it.config() })
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
-1
@@ -41,7 +41,13 @@ internal fun <T> Project.optionalProvider(initialize: () -> T?): ReadOnlyPropert
|
|||||||
// Before 5.0 fileProperty is created via ProjectLayout
|
// Before 5.0 fileProperty is created via ProjectLayout
|
||||||
// https://docs.gradle.org/current/javadoc/org/gradle/api/model/ObjectFactory.html#fileProperty--
|
// https://docs.gradle.org/current/javadoc/org/gradle/api/model/ObjectFactory.html#fileProperty--
|
||||||
internal fun Project.newFileProperty(initialize: (() -> File)? = null): RegularFileProperty {
|
internal fun Project.newFileProperty(initialize: (() -> File)? = null): RegularFileProperty {
|
||||||
val regularFileProperty = project.objects.fileProperty()
|
val regularFileProperty = if (isGradleVersionAtLeast(5, 0)) {
|
||||||
|
project.objects.fileProperty()
|
||||||
|
} else {
|
||||||
|
val projectLayoutClass = Class.forName("org.gradle.api.file.ProjectLayout")
|
||||||
|
val filePropertyMethod = projectLayoutClass.getMethod("fileProperty")
|
||||||
|
filePropertyMethod(project.layout) as RegularFileProperty
|
||||||
|
}
|
||||||
|
|
||||||
return regularFileProperty.apply {
|
return regularFileProperty.apply {
|
||||||
if (initialize != null) {
|
if (initialize != null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user