[K/N][build] Composite build with build.tools-conventions plugin

Adds convention plugin instead of sources inclusion
inside the buildSrc, effectively reducing the amount
of the code to be compiled in buildSrc.

Merge-request: KT-MR-8898
This commit is contained in:
Pavel Punegov
2023-01-27 18:06:56 +01:00
committed by Space Team
parent 45637c1b94
commit 395e3e0f81
30 changed files with 190 additions and 313 deletions
+71 -31
View File
@@ -6,51 +6,44 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.util.Properties
plugins {
kotlin
groovy
id("org.gradle.kotlin.kotlin-dsl")
id("gradle-plugin-dependency-configuration")
id("org.jetbrains.kotlin.plugin.sam.with.receiver")
}
buildscript {
val rootBuildDirectory by extra(project.file("../.."))
apply(from = rootBuildDirectory.resolve("kotlin-native/gradle/loadRootProperties.gradle"))
dependencies {
classpath(commonDependency("com.google.code.gson:gson"))
classpath("com.google.code.gson:gson:2.8.9")
}
}
val rootProperties = Properties().apply {
project(":kotlin-native").projectDir.resolve("gradle.properties").reader().use(::load)
}
val kotlinVersion = project.bootstrapKotlinVersion
val metadataVersion: String by rootProperties
group = "org.jetbrains.kotlin"
version = kotlinVersion
repositories {
maven("https://cache-redirector.jetbrains.com/maven-central")
maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies")
mavenCentral()
gradlePluginPortal()
}
plugins {
groovy
kotlin("jvm")
`kotlin-dsl`
}
dependencies {
api(gradleApi())
api(kotlinStdlib())
implementation(commonDependency("org.jetbrains.kotlin:kotlin-reflect")) { isTransitive = false }
api("org.jetbrains.kotlin:kotlin-stdlib:${project.bootstrapKotlinVersion}")
implementation("org.jetbrains.kotlin:kotlin-reflect:${project.bootstrapKotlinVersion}") { isTransitive = false }
implementation("org.jetbrains.kotlin:kotlin-build-gradle-plugin:${kotlinBuildProperties.buildGradlePluginVersion}")
implementation("org.jetbrains.kotlin:kotlin-native-utils:${project.bootstrapKotlinVersion}")
// To build Konan Gradle plugin
implementation("org.jetbrains.kotlin:kotlin-build-common:${project.bootstrapKotlinVersion}")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${project.bootstrapKotlinVersion}")
val versionProperties = Properties()
project.rootProject.projectDir.resolve("gradle/versions.properties").inputStream().use { propInput ->
project.rootProject.projectDir.resolve("../../gradle/versions.properties").inputStream().use { propInput ->
versionProperties.load(propInput)
}
implementation(commonDependency("com.google.code.gson:gson"))
implementation("com.google.code.gson:gson:2.8.9")
configurations.all {
resolutionStrategy.eachDependency {
if (requested.group == "com.google.code.gson" && requested.name == "gson") {
@@ -60,12 +53,18 @@ dependencies {
}
}
implementation(commonDependency("org.jetbrains.kotlinx:kotlinx-coroutines-core"))
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0")
val metadataVersion = "0.0.1-dev-10"
implementation("org.jetbrains.kotlinx:kotlinx-metadata-klib:$metadataVersion")
implementation(commonDependency("org.jetbrains.kotlin:kotlin-native-utils:$kotlinVersion"))
implementation(commonDependency("org.jetbrains.kotlinx:kotlinx-metadata-klib:$metadataVersion"))
implementation("org.jetbrains.kotlin:kotlin-util-klib:${project.bootstrapKotlinVersion}")
implementation("org.jetbrains.kotlin:kotlin-native-utils:${project.bootstrapKotlinVersion}")
}
api(project(":kotlin-native-shared"))
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(8))
}
}
val compileKotlin: KotlinCompile by tasks
@@ -73,11 +72,12 @@ val compileGroovy: GroovyCompile by tasks
compileKotlin.apply {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs += listOf(
"-Xskip-prerelease-check",
"-Xsuppress-version-warnings",
"-opt-in=kotlin.ExperimentalStdlibApi")
"-opt-in=kotlin.ExperimentalStdlibApi",
"-opt-in=kotlin.RequiresOptIn"
)
}
}
@@ -86,3 +86,43 @@ compileGroovy.apply {
classpath += project.files(compileKotlin.destinationDirectory)
dependsOn(compileKotlin)
}
kotlin {
sourceSets {
main {
kotlin.srcDir("src/main/kotlin")
kotlin.srcDir("../../kotlin-native/shared/src/library/kotlin")
kotlin.srcDir("../../kotlin-native/shared/src/main/kotlin")
kotlin.srcDir("../../kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin")
}
}
}
gradlePlugin {
plugins {
create("compileToBitcode") {
id = "compile-to-bitcode"
implementationClass = "org.jetbrains.kotlin.bitcode.CompileToBitcodePlugin"
}
create("runtimeTesting") {
id = "runtime-testing"
implementationClass = "org.jetbrains.kotlin.testing.native.RuntimeTestingPlugin"
}
create("compilationDatabase") {
id = "compilation-database"
implementationClass = "org.jetbrains.kotlin.cpp.CompilationDatabasePlugin"
}
create("konanPlugin") {
id = "konan"
implementationClass = "org.jetbrains.kotlin.gradle.plugin.konan.KonanPlugin"
}
create("native-interop-plugin") {
id = "native-interop-plugin"
implementationClass = "org.jetbrains.kotlin.NativeInteropPlugin"
}
create("native") {
id = "native"
implementationClass = "org.jetbrains.kotlin.tools.NativePlugin"
}
}
}
@@ -0,0 +1,14 @@
cacheRedirectorEnabled=true
bootstrap.kotlin.default.version=1.8.20-dev-5197
kotlin.build.gradlePlugin.version=0.0.39
org.gradle.java.installations.fromEnv=\
JDK_1_6,JDK_16,\
JDK_1_7,JDK_17,\
JDK_1_8,JDK_18,\
JDK_9_0,JDK_9,\
JDK_10_0,JDK_10,\
JDK_11_0,JDK_11,\
JDK_15_0,JDK_15,\
JDK_16_0,\
JDK_17_0
@@ -0,0 +1,29 @@
rootProject.name = "build-tools"
pluginManagement {
apply(from = "../../repo/scripts/cache-redirector.settings.gradle.kts")
apply(from = "../../repo/scripts/kotlin-bootstrap.settings.gradle.kts")
repositories {
maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies")
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id("jvm-toolchain-provisioning")
id("build-cache")
}
buildscript {
repositories {
maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies")
mavenCentral()
gradlePluginPortal()
}
val buildGradlePluginVersion = extra["kotlin.build.gradlePlugin.version"]
dependencies {
classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:$buildGradlePluginVersion")
}
}
@@ -20,14 +20,11 @@ import org.gradle.api.Action
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.internal.file.FileOperations
import org.gradle.api.internal.project.ProjectInternal
import org.gradle.api.model.ObjectFactory
import org.gradle.process.ExecOperations
import org.gradle.process.ExecResult
import org.gradle.process.ExecSpec
import org.jetbrains.kotlin.konan.target.*
import org.jetbrains.kotlin.konan.file.*
import org.jetbrains.kotlin.konan.file.File as KFile
import java.io.File
import javax.inject.Inject
@@ -7,13 +7,11 @@ package org.jetbrains.kotlin
import groovy.lang.Closure
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.tasks.*
import org.jetbrains.kotlin.konan.target.*
import java.io.File
import java.nio.file.Path
import java.nio.file.Files
/**
* Gradle task that wraps FileCheck LLVM utility.
@@ -4,6 +4,7 @@ import org.gradle.api.Action
import org.gradle.api.Task
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Nested
/**
* An interface that any test that works with ExecutorService
@@ -20,7 +21,7 @@ interface KonanTestExecutable : Task {
* Action that configures task or does some workload before the test will be executed.
* Could be done as a first step in the test or just as a `doFirst` action in the test task.
*/
@get:Input
@get:Nested
var doBeforeRun: Action<in Task>?
/**
@@ -28,7 +29,7 @@ interface KonanTestExecutable : Task {
* Depending on the test task implementation this action is done before the build task
* or as its `doFirst` action.
*/
@get:Input
@get:Nested
var doBeforeBuild: Action<in Task>?
/**
@@ -16,7 +16,6 @@ import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.gradle.process.ExecSpec
import org.jetbrains.kotlin.konan.exec.Command
import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.konan.target.Family
import org.jetbrains.kotlin.konan.target.LinkerOutputKind
import java.io.ByteArrayOutputStream
@@ -1,6 +1,5 @@
package org.jetbrains.kotlin
import com.google.gson.*
import com.google.gson.annotations.*
@@ -9,7 +9,6 @@ import java.nio.file.Path
import java.nio.file.Paths
import java.util.regex.Matcher
import java.util.regex.Pattern
import java.io.File
private const val MODULE_DELIMITER = ",\\s*"
// These patterns are copies from
@@ -18,8 +18,6 @@ import org.jetbrains.kotlin.konan.properties.saveProperties
import org.jetbrains.kotlin.konan.target.*
import java.io.File
import java.util.concurrent.TimeUnit
import java.net.HttpURLConnection
import java.net.URL
import java.nio.file.Path
import org.jetbrains.kotlin.konan.file.File as KFile
import org.gradle.api.tasks.TaskProvider
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.cpp
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.AttributeDisambiguationRule
import org.gradle.api.attributes.MultipleCandidatesDetails
import org.jetbrains.kotlin.bitcode.CompileToBitcodePlugin
@@ -13,7 +13,6 @@ import org.gradle.api.provider.Provider
import org.gradle.api.tasks.TaskProvider
import org.gradle.kotlin.dsl.getByType
import org.jetbrains.kotlin.bitcode.CompileToBitcodeExtension
import org.jetbrains.kotlin.bitcode.CompileToBitcodePlugin
import org.jetbrains.kotlin.resolve
import java.io.File
import java.net.URL
@@ -1,121 +0,0 @@
package org.jetbrains.kotlin.utils
import java.util.*
// Copied from Kotlin org.jetbrains.kotlin.utils.DFS class
@Suppress("MemberVisibilityCanBePrivate", "MemberVisibilityCanBePrivate", "unused")
object DFS {
fun <N, R> dfs(nodes: Collection<N>, neighbors: Neighbors<N>, visited: Visited<N>, handler: NodeHandler<N, R>): R {
for (node in nodes) {
doDfs(node, neighbors, visited, handler)
}
return handler.result()
}
fun <N, R> dfs(
nodes: Collection<N>,
neighbors: Neighbors<N>,
handler: NodeHandler<N, R>
): R {
return dfs(nodes, neighbors, VisitedWithSet(), handler)
}
fun <N> ifAny(
nodes: Collection<N>,
neighbors: Neighbors<N>,
predicate: Function1<N, Boolean>
): Boolean {
val result = BooleanArray(1)
return dfs(nodes, neighbors, object : AbstractNodeHandler<N, Boolean?>() {
override fun beforeChildren(current: N): Boolean {
if (predicate.invoke(current)) {
result[0] = true
}
return !result[0]
}
override fun result(): Boolean {
return result[0]
}
})!!
}
fun <N, R> dfsFromNode(node: N, neighbors: Neighbors<N>, visited: Visited<N>, handler: NodeHandler<N, R>): R {
doDfs(node, neighbors, visited, handler)
return handler.result()
}
fun <N> dfsFromNode(
node: N,
neighbors: Neighbors<N>,
visited: Visited<N>
) {
dfsFromNode(node, neighbors, visited, object : AbstractNodeHandler<N, Void?>() {
override fun result(): Void? {
return null
}
})
}
fun <N> topologicalOrder(nodes: Iterable<N>, neighbors: Neighbors<N>, visited: Visited<N>): List<N> {
val handler = TopologicalOrder<N>()
for (node in nodes) {
doDfs(node, neighbors, visited, handler)
}
return handler.result()
}
fun <N> topologicalOrder(nodes: Iterable<N>, neighbors: Neighbors<N>): List<N> {
return topologicalOrder(nodes, neighbors, VisitedWithSet())
}
fun <N> doDfs(current: N, neighbors: Neighbors<N>, visited: Visited<N>, handler: NodeHandler<N, *>) {
if (!visited.checkAndMarkVisited(current)) return
if (!handler.beforeChildren(current)) return
for (neighbor in neighbors.getNeighbors(current)) {
doDfs(neighbor, neighbors, visited, handler)
}
handler.afterChildren(current)
}
interface NodeHandler<N, R> {
fun beforeChildren(current: N): Boolean
fun afterChildren(current: N)
fun result(): R
}
interface Neighbors<N> {
fun getNeighbors(current: N): Iterable<N>
}
interface Visited<N> {
fun checkAndMarkVisited(current: N): Boolean
}
abstract class AbstractNodeHandler<N, R> : NodeHandler<N, R> {
override fun beforeChildren(current: N): Boolean {
return true
}
override fun afterChildren(current: N) {}
}
class VisitedWithSet<N> @JvmOverloads constructor(private val visited: MutableSet<N> = HashSet()) : Visited<N> {
override fun checkAndMarkVisited(current: N): Boolean {
return visited.add(current)
}
}
abstract class CollectingNodeHandler<N, R, C : Iterable<R>> protected constructor(protected val result: C) : AbstractNodeHandler<N, C>() {
override fun result(): C {
return result
}
}
abstract class NodeHandlerWithListResult<N, R> protected constructor() : CollectingNodeHandler<N, R, LinkedList<R>>(LinkedList<R>())
class TopologicalOrder<N> : NodeHandlerWithListResult<N, N>() {
override fun afterChildren(current: N) {
result.addFirst(current)
}
}
}