diff --git a/.gitignore b/.gitignore index 117f6dccdfb..c7e0101d301 100644 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,5 @@ build/ kotlin-ultimate/ node_modules/ .rpt2_cache/ -libraries/tools/kotlin-test-nodejs-runner/lib/ \ No newline at end of file +libraries/tools/kotlin-test-nodejs-runner/lib/ +local.properties diff --git a/buildSrc/src/main/kotlin/buildProperties.kt b/buildSrc/src/main/kotlin/buildProperties.kt new file mode 100644 index 00000000000..8d9f84d285b --- /dev/null +++ b/buildSrc/src/main/kotlin/buildProperties.kt @@ -0,0 +1,88 @@ +import org.gradle.api.Project +import org.gradle.api.initialization.Settings +import org.gradle.api.internal.DynamicObjectAware +import java.io.File +import java.util.* + +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +interface PropertiesProvider { + val rootProjectDir: File + fun getProperty(key: String): Any? +} + +class KotlinBuildProperties( + private val propertiesProvider: PropertiesProvider +) { + private val localProperties: Properties = Properties() + + init { + val localPropertiesFile = propertiesProvider.rootProjectDir.resolve("local.properties") + if (localPropertiesFile.isFile) { + localPropertiesFile.reader().use(localProperties::load) + } + } + + private operator fun get(key: String): Any? = localProperties.getProperty(key) ?: propertiesProvider.getProperty(key) + + private fun getBoolean(key: String): Boolean = this[key]?.toString() == "true" + + val isJpsBuildEnabled: Boolean = getBoolean("jpsBuild") + + val isInIdeaSync: Boolean = run { + // "idea.sync.active" was introduced in 2019.1 + System.getProperty("idea.sync.active")?.toBoolean() == true || let { + // before 2019.1 there is "idea.active" that was true only on sync, + // but since 2019.1 "idea.active" present in task execution too. + // So let's check Idea version + val majorIdeaVersion = System.getProperty("idea.version") + ?.split(".") + ?.getOrNull(0) + val isBeforeIdea2019 = majorIdeaVersion == null || majorIdeaVersion.toInt() < 2019 + + isBeforeIdea2019 && System.getProperty("idea.active")?.toBoolean() == true + } + } + + val isInJpsBuildIdeaSync: Boolean + get() = isJpsBuildEnabled && isInIdeaSync + + val includeJava9: Boolean + get() = !isInJpsBuildIdeaSync +} + +private const val extensionName = "kotlinBuildFlags" + +class ProjectProperties(val project: Project): PropertiesProvider { + override val rootProjectDir: File + get() = project.projectDir + + override fun getProperty(key: String): Any? = project.findProperty(key) +} + +val Project.kotlinBuildProperties: KotlinBuildProperties + get() = rootProject.extensions.findByName(extensionName) as KotlinBuildProperties? + ?: KotlinBuildProperties(ProjectProperties(rootProject)).also { + rootProject.extensions.add(extensionName, it) + } + +class SettingsProperties(val settings: Settings): PropertiesProvider { + override val rootProjectDir: File + get() = settings.rootDir + + override fun getProperty(key: String): Any? { + val obj = (settings as DynamicObjectAware).asDynamicObject + return if (obj.hasProperty(key)) obj.getProperty(key) else null + } +} + +fun getKotlinBuildPropertiesForSettings(settings: Any) = (settings as Settings).kotlinBuildProperties + +val Settings.kotlinBuildProperties: KotlinBuildProperties + get() = extensions.findByName(extensionName) as KotlinBuildProperties? + ?: KotlinBuildProperties(SettingsProperties(this)).also { + extensions.add(extensionName, it) + } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/dependencies.kt b/buildSrc/src/main/kotlin/dependencies.kt index 713f2e8d02b..54988c1dbc9 100644 --- a/buildSrc/src/main/kotlin/dependencies.kt +++ b/buildSrc/src/main/kotlin/dependencies.kt @@ -1,12 +1,14 @@ -@file:Suppress("unused") // usages in build scripts are not tracked properly +@file:Suppress("unused") +// usages in build scripts are not tracked properly + +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.GradleException import org.gradle.api.Project import org.gradle.api.artifacts.ProjectDependency import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.tasks.AbstractCopyTask -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.kotlin.dsl.extra import org.gradle.kotlin.dsl.project import java.io.File @@ -73,8 +75,8 @@ fun Project.ideaUltimatePreloadedDeps(vararg artifactBaseNames: String, subdir: fun Project.kotlinDep(artifactBaseName: String, version: String): String = "org.jetbrains.kotlin:kotlin-$artifactBaseName:$version" -val Project.useBootstrapStdlib: Boolean get() = - findProperty("jpsBuild")?.toString() == "true" +val Project.useBootstrapStdlib: Boolean + get() = kotlinBuildProperties.isInJpsBuildIdeaSync fun Project.kotlinStdlib(suffix: String? = null): Any { return if (useBootstrapStdlib) diff --git a/compiler/build.gradle.kts b/compiler/build.gradle.kts index 9d5c588b6ab..d3d77b4d0dc 100644 --- a/compiler/build.gradle.kts +++ b/compiler/build.gradle.kts @@ -1,7 +1,6 @@ import java.io.File import org.gradle.api.tasks.bundling.Jar import org.jetbrains.kotlin.gradle.dsl.KotlinCompile -import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile plugins { kotlin("jvm") @@ -67,7 +66,7 @@ dependencies { antLauncherJar(files(toolsJar())) // For JPS build - if (System.getProperty("idea.active") != null) { + if (project.kotlinBuildProperties.isInJpsBuildIdeaSync) { testRuntimeOnly(files("${rootProject.projectDir}/dist/kotlinc/lib/kotlin-reflect.jar")) } } diff --git a/gradle/jps.gradle.kts b/gradle/jps.gradle.kts index c7a4f5a8a6c..39ebc90bf10 100644 --- a/gradle/jps.gradle.kts +++ b/gradle/jps.gradle.kts @@ -2,7 +2,6 @@ import org.jetbrains.gradle.ext.* import org.jetbrains.kotlin.ideaExt.* import org.jetbrains.kotlin.buildUtils.idea.* -val isJpsBuildEnabled = findProperty("jpsBuild")?.toString() == "true" val ideaPluginDir: File by extra val ideaSandboxDir: File by extra val ideaSdkPath: String @@ -29,7 +28,7 @@ fun org.jetbrains.gradle.ext.JUnit.configureForKotlin() { workingDirectory = rootDir.toString() } -if (isJpsBuildEnabled && System.getProperty("idea.active") != null) { +if (kotlinBuildProperties.isInJpsBuildIdeaSync) { allprojects { apply(mapOf("plugin" to "idea")) } diff --git a/idea/build.gradle.kts b/idea/build.gradle.kts index 8c9c5507ebf..f3aa00daa5a 100644 --- a/idea/build.gradle.kts +++ b/idea/build.gradle.kts @@ -1,5 +1,3 @@ -import org.gradle.jvm.tasks.Jar - plugins { kotlin("jvm") id("jps-compatible") @@ -126,7 +124,9 @@ dependencies { testRuntime(intellijPluginDep("smali")) testRuntime(intellijPluginDep("testng")) - if (System.getProperty("idea.active") != null) testRuntimeOnly(files("${rootProject.projectDir}/dist/kotlinc/lib/kotlin-reflect.jar")) + if (project.kotlinBuildProperties.isInJpsBuildIdeaSync) { + testRuntimeOnly(files("${rootProject.projectDir}/dist/kotlinc/lib/kotlin-reflect.jar")) + } } sourceSets { "main" { diff --git a/libraries/kotlin.test/jvm/build.gradle b/libraries/kotlin.test/jvm/build.gradle index 4dc65daa8b2..cfbd6fe2e0c 100644 --- a/libraries/kotlin.test/jvm/build.gradle +++ b/libraries/kotlin.test/jvm/build.gradle @@ -11,10 +11,10 @@ pill { importAsLibrary = true } -def jpsBuild = findProperty("jpsBuild")?.toString() == "true" +def includeJava9 = BuildPropertiesKt.getKotlinBuildProperties(project).includeJava9 sourceSets { - if (!jpsBuild) { + if (includeJava9) { java9 } } @@ -40,7 +40,7 @@ task modularJar(type: Jar) { classifier = 'modular' from zipTree(jar.outputs.files.singleFile) - if (!jpsBuild) { + if (includeJava9) { from sourceSets.java9.output } } @@ -66,6 +66,6 @@ compileTestKotlin { kotlinOptions.freeCompilerArgs = ["-Xallow-kotlin-package"] } -if (!jpsBuild) { +if (includeJava9) { compileJava9Sources(project, 'kotlin.test') } diff --git a/libraries/reflect/api/build.gradle b/libraries/reflect/api/build.gradle index 5549f9bf6bb..cdaaa1fca8c 100644 --- a/libraries/reflect/api/build.gradle +++ b/libraries/reflect/api/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'kotlin' configureJvm6Project(project) -def jpsBuild = findProperty("jpsBuild")?.toString() == "true" +def includeJava9 = BuildPropertiesKt.getKotlinBuildProperties(project).includeJava9 sourceSets { main { @@ -13,7 +13,7 @@ sourceSets { } } - if (!jpsBuild) { + if (includeJava9) { java9 } } @@ -28,7 +28,7 @@ dependencies { compileOnly "org.jetbrains:annotations:13.0" } -if (!jpsBuild) { +if (includeJava9) { compileJava9Sources( project, 'kotlin.reflect', [sourceSets.main.output, configurations.compileOnly.filter { @@ -52,7 +52,7 @@ jar { task java9Jar(type: Jar) { classifier = "java9" - if (!jpsBuild) { + if (includeJava9) { from sourceSets.java9.output } } diff --git a/libraries/stdlib/jdk7/build.gradle b/libraries/stdlib/jdk7/build.gradle index 7b86beee3e9..149c21a268c 100644 --- a/libraries/stdlib/jdk7/build.gradle +++ b/libraries/stdlib/jdk7/build.gradle @@ -26,7 +26,7 @@ sourceSets { test { kotlin { srcDir 'test' - if(!System.properties.'idea.active') { + if(!BuildPropertiesKt.getKotlinBuildProperties(project).inIdeaSync) { srcDir '../jvm/test' srcDir '../common/test' srcDir '../test' diff --git a/libraries/stdlib/jdk8/build.gradle b/libraries/stdlib/jdk8/build.gradle index f04ffad8101..b496732ea05 100644 --- a/libraries/stdlib/jdk8/build.gradle +++ b/libraries/stdlib/jdk8/build.gradle @@ -28,7 +28,7 @@ sourceSets { test { kotlin { srcDir 'test' - if(!System.properties.'idea.active') { + if(!BuildPropertiesKt.getKotlinBuildProperties(project).inIdeaSync) { srcDir '../jvm/test' srcDir '../common/test' srcDir '../test' diff --git a/libraries/stdlib/js/build.gradle b/libraries/stdlib/js/build.gradle index 6c6c0fb04f0..76f61dc5130 100644 --- a/libraries/stdlib/js/build.gradle +++ b/libraries/stdlib/js/build.gradle @@ -51,7 +51,7 @@ sourceSets { } experimental { - if(!System.properties.'idea.active') + if(!BuildPropertiesKt.getKotlinBuildProperties(project).inIdeaSync) kotlin { srcDir experimentalSrcDir } diff --git a/libraries/stdlib/jvm/build.gradle b/libraries/stdlib/jvm/build.gradle index ba4fc940e95..9e97f6fb218 100644 --- a/libraries/stdlib/jvm/build.gradle +++ b/libraries/stdlib/jvm/build.gradle @@ -38,7 +38,7 @@ sourceSets { } coroutinesExperimentalMigrationTest { kotlin { - if(!System.properties.'idea.active') { + if(!BuildPropertiesKt.getKotlinBuildProperties(project).inIdeaSync) { srcDir '../coroutines-experimental/jvm/test' } } diff --git a/settings.gradle b/settings.gradle index bb40211b124..a7175fb32b8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -219,8 +219,9 @@ if (isTeamcityBuild || includeUltimate) { ) } -def isJpsBuild = hasProperty("jpsBuild") && jpsBuild == 'true' -if (isJpsBuild) { +def flags = BuildPropertiesKt.getKotlinBuildPropertiesForSettings(settings) + +if (flags.inJpsBuildIdeaSync) { include ":kotlin-stdlib:jps-build" project(":kotlin-stdlib:jps-build").projectDir = "$rootDir/libraries/stdlib/jps-build" as File } else {