From 8e24383428b7b47d3823117a87e827010fa4728c Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Mon, 11 Sep 2017 14:59:29 +0200 Subject: [PATCH] Improve build DSL --- buildSrc/src/main/kotlin/artifacts.kt | 47 ++++++++++++++++-------- buildSrc/src/main/kotlin/dependencies.kt | 11 +----- buildSrc/src/main/kotlin/sourceSets.kt | 2 +- buildSrc/src/main/kotlin/tasks.kt | 19 ++++++++++ 4 files changed, 54 insertions(+), 25 deletions(-) create mode 100644 buildSrc/src/main/kotlin/tasks.kt diff --git a/buildSrc/src/main/kotlin/artifacts.kt b/buildSrc/src/main/kotlin/artifacts.kt index a0958393796..7ea1b963c26 100644 --- a/buildSrc/src/main/kotlin/artifacts.kt +++ b/buildSrc/src/main/kotlin/artifacts.kt @@ -6,6 +6,8 @@ import org.gradle.api.tasks.* import org.gradle.kotlin.dsl.* import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ConfigurationContainer +import org.gradle.api.artifacts.Dependency +import org.gradle.api.file.DuplicatesStrategy import org.gradle.api.plugins.JavaPluginConvention import org.gradle.api.tasks.javadoc.Javadoc import org.gradle.jvm.tasks.Jar @@ -30,12 +32,23 @@ fun Project.runtimeJarArtifactBy(task: Task, artifactRef: T, body: Configurab addArtifact("runtimeJar", task, artifactRef, body) } -fun Project.runtimeJar(task: T, body: T.() -> Unit = {}): T = - task.apply { - setupPublicJar() - body() - project.runtimeJarArtifactBy(this, this) - } +fun Project.buildVersion(): Dependency { + val cfg = configurations.create("build-version") + return dependencies.add(cfg.name, dependencies.project(":prepare:build.version", configuration = "buildVersion")) +} + +fun Project.runtimeJar(task: T, body: T.() -> Unit = {}): T { + val buildVersionCfg = configurations.create("buildVersion") + dependencies.add(buildVersionCfg.name, dependencies.project(":prepare:build.version", configuration = "buildVersion")) + extra["runtimeJarTask"] = task + return task.apply { + setupPublicJar() + from(buildVersionCfg) { into("META-INF") } + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + body() + project.runtimeJarArtifactBy(this, this) + } +} fun Project.runtimeJar(taskName: String = "jar", body: Jar.() -> Unit = {}): Jar = runtimeJar(getOrCreateTask(taskName, body)) @@ -88,10 +101,8 @@ fun Project.ideaPlugin(subdir: String = "lib", body: Copy.() -> Unit) { } } -fun Project.ideaPlugin() = ideaPlugin { - tasks.findByName("jar")?.let { - from(it) - } +fun Project.ideaPlugin(subdir: String = "lib") = ideaPlugin(subdir) { + fromRuntimeJarIfExists(this) } @@ -104,8 +115,17 @@ fun Project.dist(body: Copy.() -> Unit) { } fun Project.dist() = dist { - tasks.findByName("jar")?.let { - from(it) + fromRuntimeJarIfExists(this) +} + +private fun Project.fromRuntimeJarIfExists(task: T) { + if (extra.has("runtimeJarTask")) { + task.from(extra["runtimeJarTask"] as Task) + } + else { + tasks.findByName("jar")?.let { + task.from(it) + } } } @@ -133,6 +153,3 @@ fun Project.addArtifact(configuration: Configuration, task: Task, artifactRef fun Project.addArtifact(configurationName: String, task: Task, artifactRef: T, body: ConfigurablePublishArtifact.() -> Unit = {}) = addArtifact(configurations.getOrCreate(configurationName), task, artifactRef, body) - -inline fun Project.getOrCreateTask(taskName: String, body: T.() -> Unit): T = - (tasks.findByName(taskName)?.let { it as T } ?: task(taskName)).apply{ body() } diff --git a/buildSrc/src/main/kotlin/dependencies.kt b/buildSrc/src/main/kotlin/dependencies.kt index e329459902a..17ed1cd6dbf 100644 --- a/buildSrc/src/main/kotlin/dependencies.kt +++ b/buildSrc/src/main/kotlin/dependencies.kt @@ -1,4 +1,3 @@ - @file:Suppress("unused") // usages in build scripts are not tracked properly import org.gradle.api.* @@ -17,11 +16,6 @@ val bootstrapKotlinVersion: String = System.getProperty("bootstrap.kotlin.versio fun PluginDependenciesSpec.kotlin(module: String, version: String? = null): PluginDependencySpec = id("org.jetbrains.kotlin.$module") version (version ?: bootstrapKotlinVersion) -fun Project.buildVersion(): Dependency { - val cfg = configurations.create("build-version") - return dependencies.add(cfg.name, dependencies.project(":prepare:build.version", configuration = "default")) -} - fun Project.commonDep(coord: String): String { val parts = coord.split(':') return when (parts.size) { @@ -58,6 +52,8 @@ fun DependencyHandler.projectDepIntransitive(name: String): Dependency = project(name, configuration = "default").apply { isTransitive = false } fun DependencyHandler.projectTests(name: String): Dependency = project(name, configuration = "tests-jar").apply { isTransitive = false } +fun DependencyHandler.projectRuntimeJar(name: String): Dependency = project(name, configuration = "runtimeJar") +fun DependencyHandler.projectArchives(name: String): Dependency = project(name, configuration = "archives") val protobufLiteProject = ":custom-dependencies:protobuf-lite" fun DependencyHandler.protobufLite(): ProjectDependency = @@ -68,7 +64,6 @@ fun DependencyHandler.protobufFull(): ProjectDependency = project(protobufLiteProject, configuration = "relocated").apply { isTransitive = false } val protobufFullTask = "$protobufLiteProject:prepare-relocated-protobuf" - private fun File.matchMaybeVersionedArtifact(baseName: String) = name.matches(baseName.toMaybeVersionedJarRegex()) private val wildcardsRe = """[^*?]+|(\*)|(\?)""".toRegex() @@ -89,5 +84,3 @@ private fun String.toMaybeVersionedJarRegex(): Regex { return Regex(if (hasJarExtension) escaped else "$escaped(-\\d.*)?\\.jar") // TODO: consider more precise version part of the regex } -val propertiesX = - java.util.Properties().apply { load(java.io.FileInputStream("gradle.properties")) } diff --git a/buildSrc/src/main/kotlin/sourceSets.kt b/buildSrc/src/main/kotlin/sourceSets.kt index a4e02eb98f6..cfebd3cd3f6 100644 --- a/buildSrc/src/main/kotlin/sourceSets.kt +++ b/buildSrc/src/main/kotlin/sourceSets.kt @@ -99,7 +99,7 @@ fun SourceSet.none() { resources.srcDirs() } -fun SourceSet.default() { +fun SourceSet.projectDefault() { when (name) { "main" -> { java.srcDirs("src") diff --git a/buildSrc/src/main/kotlin/tasks.kt b/buildSrc/src/main/kotlin/tasks.kt new file mode 100644 index 00000000000..29e92251780 --- /dev/null +++ b/buildSrc/src/main/kotlin/tasks.kt @@ -0,0 +1,19 @@ +@file:Suppress("unused") // usages in build scripts are not tracked properly + +import org.gradle.api.* +import org.gradle.kotlin.dsl.* +import org.gradle.api.tasks.testing.Test + +fun Project.projectTest(body: Test.() -> Unit = {}): Test = getOrCreateTask("test") { + jvmArgs("-ea", "-XX:+HeapDumpOnOutOfMemoryError", "-Xmx1200m", "-XX:+UseCodeCacheFlushing", "-XX:ReservedCodeCacheSize=128m", "-Djna.nosys=true") + maxHeapSize = "1200m" + systemProperty("idea.is.unit.test", "true") + environment("NO_FS_ROOTS_ACCESS_CHECK", "true") + environment("KOTLIN_HOME", rootProject.extra["distKotlinHomeDir"]) + systemProperty("jps.kotlin.home", rootProject.extra["distKotlinHomeDir"]) + ignoreFailures = System.getenv("kotlin_build_ignore_test_failures")?.let { it == "yes" } ?: false + body() +} + +inline fun Project.getOrCreateTask(taskName: String, body: T.() -> Unit): T = + (tasks.findByName(taskName)?.let { it as T } ?: task(taskName)).apply{ body() }