Skip to content

Commit

Permalink
Build: support local.properties for JPS build. Apply JPS related twea…
Browse files Browse the repository at this point in the history
…ks only inside IDEA import.
  • Loading branch information
snrostov committed Mar 28, 2019
1 parent 5802928 commit fb3f289
Show file tree
Hide file tree
Showing 13 changed files with 116 additions and 26 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Expand Up @@ -39,4 +39,5 @@ build/
kotlin-ultimate/
node_modules/
.rpt2_cache/
libraries/tools/kotlin-test-nodejs-runner/lib/
libraries/tools/kotlin-test-nodejs-runner/lib/
local.properties
88 changes: 88 additions & 0 deletions 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(".")

This comment has been minimized.

Copy link
@ilya-g

ilya-g Mar 28, 2019

Member

substringBefore(".", "0")

?.getOrNull(0)

This comment has been minimized.

Copy link
@ilya-g

ilya-g Mar 28, 2019

Member

split result list has always at least one item. So get(0) is enough.

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)
}
10 changes: 6 additions & 4 deletions 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

This comment has been minimized.

Copy link
@ilya-g

ilya-g Mar 28, 2019

Member

Comment has been torn from Suppress where it relates to.


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
Expand Down Expand Up @@ -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)
Expand Down
3 changes: 1 addition & 2 deletions 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")
Expand Down Expand Up @@ -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"))
}
}
Expand Down
3 changes: 1 addition & 2 deletions gradle/jps.gradle.kts
Expand Up @@ -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
Expand All @@ -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"))
}
Expand Down
6 changes: 3 additions & 3 deletions idea/build.gradle.kts
@@ -1,5 +1,3 @@
import org.gradle.jvm.tasks.Jar

plugins {
kotlin("jvm")
id("jps-compatible")
Expand Down Expand Up @@ -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" {
Expand Down
8 changes: 4 additions & 4 deletions libraries/kotlin.test/jvm/build.gradle
Expand Up @@ -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
}
}
Expand All @@ -40,7 +40,7 @@ task modularJar(type: Jar) {
classifier = 'modular'

from zipTree(jar.outputs.files.singleFile)
if (!jpsBuild) {
if (includeJava9) {
from sourceSets.java9.output
}
}
Expand All @@ -66,6 +66,6 @@ compileTestKotlin {
kotlinOptions.freeCompilerArgs = ["-Xallow-kotlin-package"]
}

if (!jpsBuild) {
if (includeJava9) {
compileJava9Sources(project, 'kotlin.test')
}
8 changes: 4 additions & 4 deletions libraries/reflect/api/build.gradle
Expand Up @@ -4,7 +4,7 @@ apply plugin: 'kotlin'

configureJvm6Project(project)

def jpsBuild = findProperty("jpsBuild")?.toString() == "true"
def includeJava9 = BuildPropertiesKt.getKotlinBuildProperties(project).includeJava9

sourceSets {
main {
Expand All @@ -13,7 +13,7 @@ sourceSets {
}
}

if (!jpsBuild) {
if (includeJava9) {
java9
}
}
Expand All @@ -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 {
Expand All @@ -52,7 +52,7 @@ jar {

task java9Jar(type: Jar) {
classifier = "java9"
if (!jpsBuild) {
if (includeJava9) {
from sourceSets.java9.output
}
}
Expand Down
2 changes: 1 addition & 1 deletion libraries/stdlib/jdk7/build.gradle
Expand Up @@ -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'
Expand Down
2 changes: 1 addition & 1 deletion libraries/stdlib/jdk8/build.gradle
Expand Up @@ -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'
Expand Down
2 changes: 1 addition & 1 deletion libraries/stdlib/js/build.gradle
Expand Up @@ -51,7 +51,7 @@ sourceSets {
}

experimental {
if(!System.properties.'idea.active')
if(!BuildPropertiesKt.getKotlinBuildProperties(project).inIdeaSync)
kotlin {
srcDir experimentalSrcDir
}
Expand Down
2 changes: 1 addition & 1 deletion libraries/stdlib/jvm/build.gradle
Expand Up @@ -38,7 +38,7 @@ sourceSets {
}
coroutinesExperimentalMigrationTest {
kotlin {
if(!System.properties.'idea.active') {
if(!BuildPropertiesKt.getKotlinBuildProperties(project).inIdeaSync) {
srcDir '../coroutines-experimental/jvm/test'
}
}
Expand Down
5 changes: 3 additions & 2 deletions settings.gradle
Expand Up @@ -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 {
Expand Down

0 comments on commit fb3f289

Please sign in to comment.