Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion kotlin-native/Interop/Runtime/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ native {
val lib = if (isWindows) "lib" else "a"
val cflags = listOf(
"-I${nativeDependencies.libffiPath}/include",
*hostPlatform.clangForJni.hostCompilerArgsForJni,
*jniHostCompilerArgs,
*reproducibilityCompilerFlags,
)
suffixes {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import org.gradle.api.Project

open class PlatformManagerPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.pluginManager.apply("java-base")
project.extensions.add("platformManager", project.objects.platformManagerProvider(project).platformManager.get())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,23 @@ package org.jetbrains.kotlin

import org.gradle.api.Project
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Provider
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.jvm.toolchain.JavaLanguageVersion
import org.gradle.jvm.toolchain.JavaToolchainService
import org.gradle.kotlin.dsl.findByType
import org.gradle.kotlin.dsl.newInstance
import org.jetbrains.kotlin.konan.target.Distribution
import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.PlatformManager
import org.jetbrains.kotlin.nativeDistribution.NativeDistribution
import org.jetbrains.kotlin.nativeDistribution.asNativeDistribution
import org.jetbrains.kotlin.nativeDistribution.asProperties
import org.jetbrains.kotlin.nativeDistribution.llvmDistributionSource
import org.jetbrains.kotlin.nativeDistribution.nativeProtoDistribution
Expand All @@ -44,7 +50,13 @@ open class PlatformManagerProvider @Inject constructor(
protected val konanProperties = project.nativeProtoDistribution.konanProperties

@get:Input
val konanPropertiesOverride: Map<String, String> = project.llvmDistributionSource.asProperties
val konanPropertiesOverride: Provider<Map<String, String>> = project.provider {
val jdkHome = project.extensions.getByType(JavaToolchainService::class.java).launcherFor {
languageVersion.set(JavaLanguageVersion.of(11))
}.get().metadata.installationPath.asFile.absolutePath
project.llvmDistributionSource.asProperties +
mapOf("konan.jdk.home" to jdkHome)
}

/**
* [PlatformManager] may depend on the current host, so the current host must be an input
Expand All @@ -61,14 +73,14 @@ open class PlatformManagerProvider @Inject constructor(
protected val konanDataDir = providerFactory.gradleProperty("konan.data.dir")

@get:Internal("dependencies are: konanProperties and konanDataDir")
val platformManager = distributionRoot.map {
val platformManager: Provider<PlatformManager> = distributionRoot.asNativeDistribution().zip(konanPropertiesOverride) { dist: NativeDistribution, overrides: Map<String, String> ->
PlatformManager(Distribution(
konanHome = it.asFile.absolutePath,
konanHome = dist.root.asFile.absolutePath,
onlyDefaultProfiles = true,
propertyOverrides = konanPropertiesOverride,
propertyOverrides = overrides,
konanDataDir = konanDataDir.orNull,
))
}
}

fun ObjectFactory.platformManagerProvider(project: Project) = newInstance<PlatformManagerProvider>(project)
fun ObjectFactory.platformManagerProvider(project: Project) = newInstance<PlatformManagerProvider>(project)
Original file line number Diff line number Diff line change
Expand Up @@ -267,8 +267,7 @@ open class NativeInteropPlugin : Plugin<Project> {
ignoreWarningFlags +
"-Werror" +
sortedIncludeFlags +
hostPlatform.clangForJni.hostCompilerArgsForJni

jniHostCompilerArgs
flags(*cflags.toTypedArray(), "-c", "-o", ruleOut(), ruleInFirst())
}
(".cpp" to ".$obj") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import org.gradle.api.Project
import org.gradle.api.file.FileCollection
import org.gradle.api.plugins.BasePlugin
import org.gradle.api.tasks.*
import org.gradle.jvm.toolchain.JavaLanguageVersion
import org.gradle.jvm.toolchain.JavaToolchainService
import org.gradle.kotlin.dsl.*
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.gradle.process.ExecOperations
Expand Down Expand Up @@ -196,16 +198,25 @@ open class NativeToolsExtension(val project: Project) {
val llvmDir by nativeDependenciesExtension::llvmPath
val hostPlatform by nativeDependenciesExtension::hostPlatform

// This is copied from `ClangArgs`
private val jdkDir: File
get() = File(System.getProperty("java.home")).canonicalFile.let { home ->
if (home.resolve("include").exists()) {
home
} else {
home.parentFile.also {
check(it.resolve("include").exists())
}
get() = project.extensions.getByType(JavaToolchainService::class.java).launcherFor {
languageVersion.set(JavaLanguageVersion.of(11))
}.get().metadata.installationPath.asFile

val jniIncludeFlags: Array<String>
get() = arrayOf(
"-I${jdkDir.absolutePath}/include",
"-I${jdkDir.absolutePath}/include/${org.jetbrains.kotlin.konan.target.HostManager.jniHostPlatformIncludeDir}"
)

val jniHostCompilerArgs: Array<String>
get() {
val fromPlatform = hostPlatform.clangForJni.hostCompilerArgsForJni
val firstPath = fromPlatform.firstOrNull { it.startsWith("-I") }?.removePrefix("-I")
if (firstPath != null && File(firstPath).resolve("jni.h").exists()) {
return fromPlatform
}
return jniIncludeFlags
}

private val reproducibilityRootsMap: Map<File, String>
Expand Down
2 changes: 1 addition & 1 deletion kotlin-native/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ if (PlatformInfo.isMac()) {
}

apply plugin: "kotlin.native.build-tools-conventions"
apply plugin: "platform-manager"
apply plugin: "java"
apply plugin: "platform-manager"

allprojects {
repositories {
Expand Down
1 change: 1 addition & 0 deletions kotlin-native/libclangext/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.tools.ToolExecutionTask
plugins {
id("kotlin.native.build-tools-conventions")
id("native")
id("jvm-toolchains")
}

val library = lib("clangext")
Expand Down
1 change: 1 addition & 0 deletions kotlin-native/libllvmext/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ plugins {
id("kotlin.native.build-tools-conventions")
id("native")
id("native-dependencies")
id("jvm-toolchains")
}

val library = lib("llvmext")
Expand Down
1 change: 1 addition & 0 deletions kotlin-native/llvmDebugInfoC/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.tools.ToolExecutionTask

plugins {
id("native")
id("jvm-toolchains")
}

val library = lib("debugInfo")
Expand Down
1 change: 1 addition & 0 deletions kotlin-native/tools/minidump-analyzer/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import org.jetbrains.kotlin.tools.ToolExecutionTask

plugins {
id("native")
id("jvm-toolchains")
}

val executable = "minidump-analyzer.exe"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,13 +239,16 @@ sealed class ClangArgs(
* Should be used when compiling library for JNI.
* For example, it is used for Kotlin/Native's Clang and LLVM libraries.
*/
class Jni(configurables: Configurables) : ClangArgs(configurables, forJni = true) {
class Jni(private val configurables: Configurables) : ClangArgs(configurables, forJni = true) {
private val jdkDir by lazy {
val home = File.javaHome.absoluteFile
if (home.child("include").exists)
home.absolutePath
val home = configurables.hostString("konan.jdk.home")?.let { File(it) }
?: System.getenv("JAVA_HOME")?.let { File(it) }
?: File.javaHome
val absoluteHome = home.absoluteFile
if (absoluteHome.child("include").exists)
absoluteHome.absolutePath
else
home.parentFile.absolutePath
absoluteHome.parentFile.absolutePath
}

val hostCompilerArgsForJni: Array<String> by lazy {
Expand Down