[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
+3
View File
@@ -39,6 +39,9 @@ plugins {
signing signing
id("org.jetbrains.kotlin.jvm") apply false id("org.jetbrains.kotlin.jvm") apply false
id("org.jetbrains.kotlin.plugin.serialization") apply false id("org.jetbrains.kotlin.plugin.serialization") apply false
if (kotlinBuildProperties.isKotlinNativeEnabled) {
id("kotlin.native.build-tools-conventions") apply false
}
} }
pill { pill {
+3 -69
View File
@@ -30,7 +30,6 @@ apply {
plugins { plugins {
`kotlin-dsl` `kotlin-dsl`
`java-gradle-plugin` `java-gradle-plugin`
`groovy`
id("org.jetbrains.kotlin.jvm") id("org.jetbrains.kotlin.jvm")
id("org.jetbrains.kotlin.plugin.sam.with.receiver") id("org.jetbrains.kotlin.plugin.sam.with.receiver")
} }
@@ -84,18 +83,6 @@ java {
} }
} }
sourceSets["main"].withConvention(org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet::class) {
kotlin.srcDir("src/main/kotlin")
if (!kotlinBuildProperties.isInJpsBuildIdeaSync) {
kotlin.srcDir("../kotlin-native/shared/src/library/kotlin")
kotlin.srcDir("../kotlin-native/shared/src/main/kotlin")
kotlin.srcDir("../kotlin-native/build-tools/src/main/kotlin")
kotlin.srcDir("../kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin")
kotlin.srcDir("../compiler/util-klib/src")
kotlin.srcDir("../native/utils/src")
}
}
tasks.validatePlugins.configure { tasks.validatePlugins.configure {
enabled = false enabled = false
} }
@@ -124,23 +111,13 @@ dependencies {
compileOnly(gradleApi()) compileOnly(gradleApi())
val kotlinVersion = project.bootstrapKotlinVersion
val metadataVersion = "0.0.1-dev-10"
val coroutinesVersion = "1.5.0"
// See https://github.com/gradle/gradle/issues/22510 // See https://github.com/gradle/gradle/issues/22510
implementation("org.gradle.kotlin:gradle-kotlin-dsl-plugins:2.4.1") implementation("org.gradle.kotlin:gradle-kotlin-dsl-plugins:2.4.1")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${project.bootstrapKotlinVersion}")
implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion") implementation("org.jetbrains.kotlin:kotlin-stdlib:${project.bootstrapKotlinVersion}")
implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion") implementation("org.jetbrains.kotlin:kotlin-reflect:${project.bootstrapKotlinVersion}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
implementation("com.google.code.gson:gson:2.8.9") // Workaround for Gradle dependency resolution error implementation("com.google.code.gson:gson:2.8.9") // Workaround for Gradle dependency resolution error
implementation("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.6.0") implementation("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.6.0")
implementation("org.jetbrains.kotlinx:kotlinx-metadata-klib:$metadataVersion")
if (kotlinBuildProperties.isInJpsBuildIdeaSync) {
implementation("org.jetbrains.kotlin:kotlin-native-utils:${project.bootstrapKotlinVersion}")
}
} }
samWithReceiver { samWithReceiver {
@@ -161,58 +138,15 @@ tasks.withType<KotlinCompile>().configureEach {
} }
} }
if (!kotlinBuildProperties.isInJpsBuildIdeaSync) {
sourceSets["main"].extensions
.getByType(GroovySourceDirectorySet::class.java)
.srcDir("../kotlin-native/build-tools/src/main/groovy")
}
tasks.withType<GroovyCompile>().configureEach {
classpath += project.files(compileKotlin.outputs)
dependsOn(compileKotlin)
}
allprojects { allprojects {
tasks.register("checkBuild") tasks.register("checkBuild")
} }
gradlePlugin { gradlePlugin {
plugins { 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("konan") {
id = "konan"
implementationClass = "org.jetbrains.kotlin.gradle.plugin.konan.KonanPlugin"
}
// We bundle a shaded version of kotlinx-serialization plugin
create("kotlinx-serialization-native") {
id = "kotlinx-serialization-native"
implementationClass = "shadow.org.jetbrains.kotlinx.serialization.gradle.SerializationGradleSubplugin"
}
create("org.jetbrains.kotlin.konan") {
id = "org.jetbrains.kotlin.konan"
implementationClass = "org.jetbrains.kotlin.gradle.plugin.konan.KonanPlugin"
}
create("native") { create("native") {
id = "native" id = "native"
implementationClass = "org.jetbrains.gradle.plugins.tools.NativePlugin" implementationClass = "org.jetbrains.gradle.plugins.tools.NativePlugin"
} }
create("native-interop-plugin") {
id = "native-interop-plugin"
implementationClass = "org.jetbrains.kotlin.NativeInteropPlugin"
}
} }
} }
@@ -24,7 +24,8 @@ import org.jetbrains.kotlin.konan.target.HostManager.Companion.hostIsMac
plugins { plugins {
`kotlin` `kotlin`
`native-interop-plugin` id("kotlin.native.build-tools-conventions")
id("native-interop-plugin")
`native` `native`
} }
@@ -16,8 +16,6 @@
import org.jetbrains.gradle.plugins.tools.lib import org.jetbrains.gradle.plugins.tools.lib
import org.jetbrains.gradle.plugins.tools.solib import org.jetbrains.gradle.plugins.tools.solib
import org.jetbrains.kotlin.* import org.jetbrains.kotlin.*
import org.jetbrains.kotlin.konan.target.HostManager
import java.io.ByteArrayOutputStream
val kotlinVersion = project.bootstrapKotlinVersion val kotlinVersion = project.bootstrapKotlinVersion
plugins { plugins {
+1 -1
View File
@@ -13,7 +13,7 @@ buildscript {
apply plugin: 'java' apply plugin: 'java'
apply plugin: 'kotlin' apply plugin: 'kotlin'
apply plugin: org.jetbrains.kotlin.NativeInteropPlugin apply plugin: "native-interop-plugin"
apply plugin: "maven-publish" apply plugin: "maven-publish"
apply plugin: CppConsumerPlugin apply plugin: CppConsumerPlugin
@@ -21,17 +21,11 @@ buildscript {
url project.bootstrapKotlinRepo url project.bootstrapKotlinRepo
} }
} }
ext.useCustomDist = UtilsKt.getUseCustomDist(project)
ext.kotlinNativeDist = UtilsKt.getKotlinNativeDist(project)
if (!useCustomDist) {
ext.setProperty("kotlin.native.home", kotlinNativeDist.absolutePath)
ext.setProperty("org.jetbrains.kotlin.native.home", kotlinNativeDist.absolutePath)
ext.setProperty("konan.home", kotlinNativeDist.absolutePath)
}
} }
apply plugin: 'konan' apply plugin: 'konan'
apply plugin: 'kotlin' apply plugin: 'kotlin'
apply plugin: 'kotlin.native.build-tools-conventions'
configurations { configurations {
cli_bc cli_bc
@@ -56,6 +50,13 @@ ext.testLibraryDir = "${ext.testOutputRoot}/klib/platform/${project.target.name}
// NOTE: If this persists in a gradle daemon, environment update (e.g. an Xcode update) may lead to execution failures. // NOTE: If this persists in a gradle daemon, environment update (e.g. an Xcode update) may lead to execution failures.
project.extensions.executor = ExecutorServiceKt.create(project) project.extensions.executor = ExecutorServiceKt.create(project)
ext.useCustomDist = UtilsKt.getUseCustomDist(project)
ext.kotlinNativeDist = UtilsKt.getKotlinNativeDist(project)
if (!useCustomDist) {
ext.setProperty("kotlin.native.home", kotlinNativeDist.absolutePath)
ext.setProperty("org.jetbrains.kotlin.native.home", kotlinNativeDist.absolutePath)
ext.setProperty("konan.home", kotlinNativeDist.absolutePath)
}
compileTestKotlin { compileTestKotlin {
kotlinOptions { kotlinOptions {
+71 -31
View File
@@ -6,51 +6,44 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.util.Properties 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 { buildscript {
val rootBuildDirectory by extra(project.file("../..")) val rootBuildDirectory by extra(project.file("../.."))
apply(from = rootBuildDirectory.resolve("kotlin-native/gradle/loadRootProperties.gradle")) apply(from = rootBuildDirectory.resolve("kotlin-native/gradle/loadRootProperties.gradle"))
dependencies { 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 { repositories {
maven("https://cache-redirector.jetbrains.com/maven-central") maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-dependencies")
mavenCentral() mavenCentral()
gradlePluginPortal() gradlePluginPortal()
} }
plugins {
groovy
kotlin("jvm")
`kotlin-dsl`
}
dependencies { dependencies {
api(gradleApi()) api(gradleApi())
api(kotlinStdlib()) api("org.jetbrains.kotlin:kotlin-stdlib:${project.bootstrapKotlinVersion}")
implementation(commonDependency("org.jetbrains.kotlin:kotlin-reflect")) { isTransitive = false } 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-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() 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) versionProperties.load(propInput)
} }
implementation(commonDependency("com.google.code.gson:gson")) implementation("com.google.code.gson:gson:2.8.9")
configurations.all { configurations.all {
resolutionStrategy.eachDependency { resolutionStrategy.eachDependency {
if (requested.group == "com.google.code.gson" && requested.name == "gson") { 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("org.jetbrains.kotlin:kotlin-util-klib:${project.bootstrapKotlinVersion}")
implementation(commonDependency("org.jetbrains.kotlinx:kotlinx-metadata-klib:$metadataVersion")) 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 val compileKotlin: KotlinCompile by tasks
@@ -73,11 +72,12 @@ val compileGroovy: GroovyCompile by tasks
compileKotlin.apply { compileKotlin.apply {
kotlinOptions { kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs += listOf( freeCompilerArgs += listOf(
"-Xskip-prerelease-check", "-Xskip-prerelease-check",
"-Xsuppress-version-warnings", "-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) classpath += project.files(compileKotlin.destinationDirectory)
dependsOn(compileKotlin) 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.GradleException
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.internal.file.FileOperations import org.gradle.api.internal.file.FileOperations
import org.gradle.api.internal.project.ProjectInternal
import org.gradle.api.model.ObjectFactory import org.gradle.api.model.ObjectFactory
import org.gradle.process.ExecOperations import org.gradle.process.ExecOperations
import org.gradle.process.ExecResult import org.gradle.process.ExecResult
import org.gradle.process.ExecSpec import org.gradle.process.ExecSpec
import org.jetbrains.kotlin.konan.target.* 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 java.io.File
import javax.inject.Inject import javax.inject.Inject
@@ -7,13 +7,11 @@ package org.jetbrains.kotlin
import groovy.lang.Closure import groovy.lang.Closure
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.Task import org.gradle.api.Task
import org.gradle.api.tasks.* import org.gradle.api.tasks.*
import org.jetbrains.kotlin.konan.target.* import org.jetbrains.kotlin.konan.target.*
import java.io.File import java.io.File
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.Files
/** /**
* Gradle task that wraps FileCheck LLVM utility. * 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.Task
import org.gradle.api.tasks.Input import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Nested
/** /**
* An interface that any test that works with ExecutorService * 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. * 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. * 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>? 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 * Depending on the test task implementation this action is done before the build task
* or as its `doFirst` action. * or as its `doFirst` action.
*/ */
@get:Input @get:Nested
var doBeforeBuild: Action<in Task>? var doBeforeBuild: Action<in Task>?
/** /**
@@ -16,7 +16,6 @@ import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.gradle.process.ExecSpec import org.gradle.process.ExecSpec
import org.jetbrains.kotlin.konan.exec.Command import org.jetbrains.kotlin.konan.exec.Command
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.Family import org.jetbrains.kotlin.konan.target.Family
import org.jetbrains.kotlin.konan.target.LinkerOutputKind import org.jetbrains.kotlin.konan.target.LinkerOutputKind
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
@@ -1,6 +1,5 @@
package org.jetbrains.kotlin package org.jetbrains.kotlin
import com.google.gson.*
import com.google.gson.annotations.* import com.google.gson.annotations.*
@@ -9,7 +9,6 @@ import java.nio.file.Path
import java.nio.file.Paths import java.nio.file.Paths
import java.util.regex.Matcher import java.util.regex.Matcher
import java.util.regex.Pattern import java.util.regex.Pattern
import java.io.File
private const val MODULE_DELIMITER = ",\\s*" private const val MODULE_DELIMITER = ",\\s*"
// These patterns are copies from // These patterns are copies from
@@ -18,8 +18,6 @@ import org.jetbrains.kotlin.konan.properties.saveProperties
import org.jetbrains.kotlin.konan.target.* import org.jetbrains.kotlin.konan.target.*
import java.io.File import java.io.File
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import java.net.HttpURLConnection
import java.net.URL
import java.nio.file.Path import java.nio.file.Path
import org.jetbrains.kotlin.konan.file.File as KFile import org.jetbrains.kotlin.konan.file.File as KFile
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.cpp
import org.gradle.api.Plugin import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.AttributeDisambiguationRule import org.gradle.api.attributes.AttributeDisambiguationRule
import org.gradle.api.attributes.MultipleCandidatesDetails import org.gradle.api.attributes.MultipleCandidatesDetails
import org.jetbrains.kotlin.bitcode.CompileToBitcodePlugin 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.api.tasks.TaskProvider
import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.getByType
import org.jetbrains.kotlin.bitcode.CompileToBitcodeExtension import org.jetbrains.kotlin.bitcode.CompileToBitcodeExtension
import org.jetbrains.kotlin.bitcode.CompileToBitcodePlugin
import org.jetbrains.kotlin.resolve import org.jetbrains.kotlin.resolve
import java.io.File import java.io.File
import java.net.URL 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)
}
}
}
+2
View File
@@ -50,6 +50,8 @@ if (isMac()) {
checkXcodeVersion(project) checkXcodeVersion(project)
} }
apply plugin: "kotlin.native.build-tools-conventions"
ext { ext {
distDir = UtilsKt.getKotlinNativeDist(project) distDir = UtilsKt.getKotlinNativeDist(project)
dependenciesDir = DependencyProcessor.defaultDependenciesRoot dependenciesDir = DependencyProcessor.defaultDependenciesRoot
+1
View File
@@ -4,6 +4,7 @@
*/ */
plugins { plugins {
id("kotlin.native.build-tools-conventions")
id("compile-to-bitcode") id("compile-to-bitcode")
} }
@@ -11,7 +11,8 @@ extra["org.jetbrains.kotlin.native.home"] = konanHome
plugins { plugins {
kotlin("multiplatform") kotlin("multiplatform")
konan id("kotlin.native.build-tools-conventions")
id("konan")
} }
kotlin { kotlin {
+2 -2
View File
@@ -6,13 +6,13 @@ import org.jetbrains.kotlin.UtilsKt
buildscript { buildscript {
apply from: "$rootDir/kotlin-native/gradle/kotlinGradlePlugin.gradle" apply from: "$rootDir/kotlin-native/gradle/kotlinGradlePlugin.gradle"
ext.useCustomDist = UtilsKt.getUseCustomDist(project)
} }
apply plugin: 'kotlin' apply plugin: 'kotlin'
apply plugin: 'konan' apply plugin: 'konan'
ext.useCustomDist = UtilsKt.getUseCustomDist(project)
konanArtifacts { konanArtifacts {
def testFiles = fileTree('src/test/testData') { def testFiles = fileTree('src/test/testData') {
include "*.kt" include "*.kt"
+6 -6
View File
@@ -13,13 +13,13 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import org.jetbrains.gradle.plugins.tools.lib
import org.jetbrains.kotlin.*
import org.jetbrains.kotlin.konan.target.Family.*
import java.io.ByteArrayOutputStream
plugins{ import org.jetbrains.kotlin.tools.lib
`native` import org.jetbrains.kotlin.*
plugins {
id("kotlin.native.build-tools-conventions")
id("native")
} }
val libclangextEnabled = org.jetbrains.kotlin.konan.target.HostManager.hostIsMac val libclangextEnabled = org.jetbrains.kotlin.konan.target.HostManager.hostIsMac
extra["isEnabled"] = libclangextEnabled extra["isEnabled"] = libclangextEnabled
+3 -2
View File
@@ -14,14 +14,15 @@
* limitations under the License. * limitations under the License.
*/ */
import org.jetbrains.gradle.plugins.tools.lib import org.jetbrains.kotlin.tools.lib
import org.jetbrains.kotlin.* import org.jetbrains.kotlin.*
import org.jetbrains.kotlin.konan.target.ClangArgs import org.jetbrains.kotlin.konan.target.ClangArgs
import org.jetbrains.kotlin.konan.target.Family.* import org.jetbrains.kotlin.konan.target.Family.*
import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.HostManager
plugins { plugins {
`native` id("kotlin.native.build-tools-conventions")
id("native")
} }
native { native {
@@ -105,11 +105,11 @@ gradlePlugin {
} }
create("compileToBitcode") { create("compileToBitcode") {
id = "compile-to-bitcode" id = "compile-to-bitcode"
implementationClass = "org.jetbrains.kotlin.bitcode.CompileToBitcodePlugin" implementationClass = "CompileToBitcodePlugin"
} }
create("runtimeTesting") { create("runtimeTesting") {
id = "runtime-testing" id = "runtime-testing"
implementationClass = "org.jetbrains.kotlin.testing.native.RuntimeTestingPlugin" implementationClass = "RuntimeTestingPlugin"
} }
} }
} }
@@ -18,11 +18,10 @@ import org.gradle.nativeplatform.TargetMachine
import org.gradle.nativeplatform.TargetMachineFactory import org.gradle.nativeplatform.TargetMachineFactory
import org.gradle.nativeplatform.platform.NativePlatform import org.gradle.nativeplatform.platform.NativePlatform
import org.gradle.nativeplatform.platform.internal.* import org.gradle.nativeplatform.platform.internal.*
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.konan.util.visibleName import org.jetbrains.kotlin.konan.util.visibleName
interface KotlinNativePlatform: NativePlatform { interface KotlinNativePlatform : NativePlatform {
val target: KonanTarget val target: KonanTarget
} }
@@ -38,19 +37,18 @@ fun KonanTarget.getGradleCPU(): ArchitectureInternal = architecture.visibleName.
Architectures.forInput(it) Architectures.forInput(it)
} }
fun KonanTarget.toTargetMachine(objectFactory: ObjectFactory): TargetMachine = object: TargetMachine { fun KonanTarget.toTargetMachine(objectFactory: ObjectFactory): TargetMachine = object : TargetMachine {
override fun getOperatingSystemFamily(): OperatingSystemFamily = override fun getOperatingSystemFamily(): OperatingSystemFamily =
getGradleOSFamily(objectFactory) getGradleOSFamily(objectFactory)
override fun getArchitecture(): MachineArchitecture = override fun getArchitecture(): MachineArchitecture =
objectFactory.named(MachineArchitecture::class.java, this@toTargetMachine.architecture.visibleName) objectFactory.named(MachineArchitecture::class.java, this@toTargetMachine.architecture.visibleName)
} }
class DefaultKotlinNativePlatform(name: String, override val target: KonanTarget): class DefaultKotlinNativePlatform(name: String, override val target: KonanTarget) :
DefaultNativePlatform(name, target.getGradleOS(), target.getGradleCPU()), DefaultNativePlatform(name, target.getGradleOS(), target.getGradleCPU()),
KotlinNativePlatform KotlinNativePlatform {
{ constructor(target: KonanTarget) : this(target.visibleName, target)
constructor(target: KonanTarget): this(target.visibleName, target)
// TODO: Extend ImmutableDefaultNativePlatform and get rid of these methods after switch to Gradle 4.8 // TODO: Extend ImmutableDefaultNativePlatform and get rid of these methods after switch to Gradle 4.8
private fun notImplemented(): Nothing = throw NotImplementedError("Not Implemented in Kotlin/Native plugin") private fun notImplemented(): Nothing = throw NotImplementedError("Not Implemented in Kotlin/Native plugin")
@@ -62,50 +60,36 @@ class DefaultKotlinNativePlatform(name: String, override val target: KonanTarget
// NativeVariantIdentity constructor was changed in Gradle 5.1 // NativeVariantIdentity constructor was changed in Gradle 5.1
// So we have to use reflection to create instance of this class in earlier versions. // So we have to use reflection to create instance of this class in earlier versions.
internal fun compatibleVariantIdentity( internal fun compatibleVariantIdentity(
project: Project, project: Project,
name: String, name: String,
baseName: Provider<String>, baseName: Provider<String>,
group: Provider<String>, group: Provider<String>,
version: Provider<String>, version: Provider<String>,
debuggable: Boolean, debuggable: Boolean,
optimized: Boolean, optimized: Boolean,
target: KonanTarget, target: KonanTarget,
linkUsage: UsageContext?, linkUsage: UsageContext?,
runtimeUsage: UsageContext? runtimeUsage: UsageContext?
): NativeVariantIdentity = ): NativeVariantIdentity =
if (isGradleVersionAtLeast(5, 1)) {
val targetMachineFactory = (project as ProjectInternal).services.get(TargetMachineFactory::class.java)
NativeVariantIdentity(
name,
baseName,
group,
version,
debuggable,
optimized,
targetMachineFactory.os(target.family.name),
linkUsage,
runtimeUsage
)
} else {
NativeVariantIdentity::class.java.getConstructor( NativeVariantIdentity::class.java.getConstructor(
String::class.java, String::class.java,
Provider::class.java, Provider::class.java,
Provider::class.java, Provider::class.java,
Provider::class.java, Provider::class.java,
Boolean::class.javaPrimitiveType, Boolean::class.javaPrimitiveType,
Boolean::class.javaPrimitiveType, Boolean::class.javaPrimitiveType,
OperatingSystemFamily::class.java, OperatingSystemFamily::class.java,
UsageContext::class.java, UsageContext::class.java,
UsageContext::class.java UsageContext::class.java
).newInstance( ).newInstance(
name, name,
baseName, baseName,
group, group,
version, version,
debuggable, debuggable,
optimized, optimized,
target.getGradleOSFamily(project.objects), target.getGradleOSFamily(project.objects),
linkUsage, linkUsage,
runtimeUsage runtimeUsage
) )
}
@@ -342,7 +342,7 @@ class KonanPlugin @Inject constructor(private val registry: ToolingModelBuilderR
// If the JDK that was set is not available get the JDK 11 as a default // If the JDK that was set is not available get the JDK 11 as a default
service.launcherFor(object : Action<JavaToolchainSpec> { service.launcherFor(object : Action<JavaToolchainSpec> {
override fun execute(toolchainSpec: JavaToolchainSpec) { override fun execute(toolchainSpec: JavaToolchainSpec) {
toolchainSpec.languageVersion.set(JavaLanguageVersion.of(JdkMajorVersion.JDK_11_0.majorVersion)) toolchainSpec.languageVersion.set(JavaLanguageVersion.of(11)) // FIXME: not resolved from buildSrc JdkMajorVersion.JDK_11_0.majorVersion))
} }
}).get() }).get()
} }
+1 -1
View File
@@ -788,6 +788,7 @@ project(':kotlin-scripting-ide-common').projectDir = "$rootDir/plugins/scripting
// Uncomment to use locally built protobuf-relocated // Uncomment to use locally built protobuf-relocated
// includeBuild("dependencies/protobuf") // includeBuild("dependencies/protobuf")
if (buildProperties.isKotlinNativeEnabled) { if (buildProperties.isKotlinNativeEnabled) {
includeBuild("kotlin-native/build-tools")
include ':kotlin-native:dependencies' include ':kotlin-native:dependencies'
include ':kotlin-native:endorsedLibraries:kotlinx.cli' include ':kotlin-native:endorsedLibraries:kotlinx.cli'
include ':kotlin-native:endorsedLibraries' include ':kotlin-native:endorsedLibraries'
@@ -810,7 +811,6 @@ if (buildProperties.isKotlinNativeEnabled) {
include ':kotlin-native:backend.native:tests' include ':kotlin-native:backend.native:tests'
include ":kotlin-native-compiler-embeddable" include ":kotlin-native-compiler-embeddable"
project(":kotlin-native-compiler-embeddable").projectDir = "$rootDir/kotlin-native/prepare/kotlin-native-embeddable-compiler" as File project(":kotlin-native-compiler-embeddable").projectDir = "$rootDir/kotlin-native/prepare/kotlin-native-embeddable-compiler" as File
include ':kotlin-native:build-tools'
include ':kotlin-native-shared' include ':kotlin-native-shared'
project(":kotlin-native-shared").projectDir = "$rootDir/kotlin-native/shared" as File project(":kotlin-native-shared").projectDir = "$rootDir/kotlin-native/shared" as File
} }