Make native tasks CC compatible

This allows running with CC&native:
./gradlew assemble
./gradlew :kotlin-native:bundle
./gradlew :native:native.tests:test

Required for KTI-1553
This commit is contained in:
cristiangarcia
2024-02-27 23:36:33 +01:00
committed by Space Team
parent 584d98cd72
commit 57edc413a3
10 changed files with 49 additions and 32 deletions
@@ -203,6 +203,7 @@ class NamedNativeInteropConfig implements Named {
}
genTask.configure {
notCompatibleWithConfigurationCache("This task uses Task.project at execution time")
dependsOn project.extensions.nativeDependencies.hostPlatformDependency
dependsOn project.extensions.nativeDependencies.llvmDependency
dependsOn ":kotlin-native:Interop:Indexer:nativelibs"
@@ -224,7 +224,6 @@ internal fun dumpProperties(task: Task) {
println("languageVersion : $languageVersion")
println("apiVersion : $apiVersion")
println("konanVersion : ${KotlinVersion.CURRENT}")
println("konanHome : $konanHome")
println()
}
is KonanInteropTask -> with(task) {
@@ -244,7 +243,6 @@ internal fun dumpProperties(task: Task) {
println("headers : ${headers.dump()}")
println("linkFiles : ${linkFiles.dump()}")
println("konanVersion : ${KotlinVersion.CURRENT}")
println("konanHome : $konanHome")
println()
}
else -> {
@@ -12,6 +12,7 @@ import org.gradle.api.Project
import org.gradle.api.artifacts.*
import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.Usage
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.internal.component.DefaultSoftwareComponentVariant
import org.gradle.api.internal.tasks.DefaultTaskDependency
import org.gradle.api.tasks.*
@@ -60,8 +61,10 @@ abstract class KonanArtifactTask: KonanTargetableTask(), KonanArtifactSpec {
@Internal lateinit var destinationDir: File
@Internal lateinit var artifactName: String
@Internal lateinit var platformConfiguration: Configuration
@Internal lateinit var configuration: Configuration
@get:InputFiles
@get:PathSensitive(PathSensitivity.RELATIVE)
abstract val platformConfigurationFiles: ConfigurableFileCollection
protected val artifactFullName: String
@Internal get() = "$artifactPrefix$artifactName$artifactSuffix"
@@ -79,7 +82,9 @@ abstract class KonanArtifactTask: KonanTargetableTask(), KonanArtifactSpec {
super.init(target)
this.destinationDir = destinationDir
this.artifactName = artifactName
val configuration: Configuration
configuration = project.configurations.maybeCreate("artifact$artifactName")
val platformConfiguration: Configuration
platformConfiguration = project.configurations.create("artifact${artifactName}_${target.name}")
platformConfiguration.extendsFrom(configuration)
platformConfiguration.attributes{
@@ -89,6 +94,7 @@ abstract class KonanArtifactTask: KonanTargetableTask(), KonanArtifactSpec {
attribute(CppBinary.DEBUGGABLE_ATTRIBUTE, false)
attribute(Attribute.of("org.gradle.native.kotlin.platform", String::class.java), target.name)
}
platformConfigurationFiles.setFrom(platformConfiguration)
val artifactNameWithoutSuffix = artifact.name.removeSuffix(artifactSuffix)
project.pluginManager.withPlugin("maven-publish") {
@@ -9,14 +9,11 @@ import org.gradle.api.tasks.Console
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.jetbrains.kotlin.gradle.plugin.konan.*
import org.jetbrains.kotlin.konan.target.KonanTarget
import java.io.File
import org.jetbrains.kotlin.dependsOnDist
import org.jetbrains.kotlin.gradle.plugin.konan.KonanBuildingConfig
import org.jetbrains.kotlin.gradle.plugin.konan.KonanBuildingSpec
import org.jetbrains.kotlin.gradle.plugin.konan.KonanToolRunner
import org.jetbrains.kotlin.gradle.plugin.konan.konanHome
/** Base class for both interop and compiler tasks. */
abstract class KonanBuildingTask: KonanArtifactWithLibrariesTask(), KonanBuildingSpec {
@@ -31,12 +28,9 @@ abstract class KonanBuildingTask: KonanArtifactWithLibrariesTask(), KonanBuildin
@Console
var dumpParameters: Boolean = false
@Input
@get:Input
val extraOpts = mutableListOf<String>()
val konanHome
@Input get() = project.konanHome
@TaskAction
abstract fun run()
@@ -77,9 +77,7 @@ abstract class KonanCacheTask : DefaultTask() {
@get:Input
/** Path to a compiler distribution that is used to build this cache. */
val compilerDistributionPath: Property<File> = project.objects.property(File::class.java).apply {
set(project.provider { project.kotlinNativeDist })
}
val compilerDistributionPath: Property<File> = project.objects.property(File::class.java).convention(project.kotlinNativeDist)
@get:Input
var cachedLibraries: Map<File, File> = emptyMap()
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.gradle.plugin.tasks
import org.gradle.api.file.FileCollection
import org.gradle.api.file.ProjectLayout
import org.gradle.api.tasks.*
import org.gradle.api.tasks.Optional
import org.gradle.process.CommandLineArgumentProvider
@@ -13,11 +14,12 @@ import org.jetbrains.kotlin.gradle.plugin.konan.*
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
import java.io.File
import java.util.*
import javax.inject.Inject
/**
* A task compiling the target executable/library using Kotlin/Native compiler
*/
abstract class KonanCompileTask: KonanBuildingTask(), KonanCompileSpec {
abstract class KonanCompileTask @Inject constructor(private val layout: ProjectLayout): KonanBuildingTask(), KonanCompileSpec {
@get:Internal
override val toolRunner = KonanCliCompilerRunner(project, project.konanExtension.jvmArgs)
@@ -46,8 +48,11 @@ abstract class KonanCompileTask: KonanBuildingTask(), KonanCompileSpec {
// Other compilation parameters -------------------------------------------
private val srcFiles_ = mutableSetOf<FileCollection>()
private val defaultFiles = project.konanDefaultSrcFiles
val srcFiles: Collection<FileCollection>
@Internal get() = srcFiles_.takeIf { !it.isEmpty() } ?: listOf(project.konanDefaultSrcFiles)
@Internal get() {
return srcFiles_.takeIf { !it.isEmpty() } ?: listOf(defaultFiles)
}
val allSources: Collection<FileCollection>
@InputFiles @PathSensitive(PathSensitivity.RELATIVE) get() = listOf(srcFiles, commonSrcFiles).flatten()
@@ -76,10 +81,15 @@ abstract class KonanCompileTask: KonanBuildingTask(), KonanCompileSpec {
@Console var measureTime = false
private val konanBuildRoot = project.konanBuildRoot
@Internal
val konanExtension = project.konanExtension
val languageVersion : String?
@Optional @Input get() = project.konanExtension.languageVersion
@Optional @Input get() = konanExtension.languageVersion
val apiVersion : String?
@Optional @Input get() = project.konanExtension.apiVersion
@Optional @Input get() = konanExtension.apiVersion
@Input var buildNumber = project.properties.get("kotlinVersion") ?: error("kotlinVersion property is not specified in the project")
@@ -94,7 +104,7 @@ abstract class KonanCompileTask: KonanBuildingTask(), KonanCompileSpec {
protected fun directoryToKt(dir: Any) = project.fileTree(dir).apply {
include("**/*.kt")
exclude { it.file.startsWith(project.layout.buildDirectory.get().asFile) }
exclude { it.file.startsWith(layout.buildDirectory.get().asFile) }
}
// Command line ------------------------------------------------------------
@@ -175,8 +185,8 @@ abstract class KonanCompileTask: KonanBuildingTask(), KonanCompileSpec {
/** Args passed to the compiler at both stages of the two-stage compilation and during the singe-stage compilation. */
protected open fun buildCommonArgs() = mutableListOf<String>().apply {
if (platformConfiguration.files.isNotEmpty()) {
platformConfiguration.files.filter { it.name.endsWith(".klib") }.forEach {
if (platformConfigurationFiles.files.isNotEmpty()) {
platformConfigurationFiles.files.filter { it.name.endsWith(".klib") }.forEach {
// The library's directory is added in libraries.repos.
addArg("-library", it.absolutePath)
}
@@ -328,7 +338,7 @@ abstract class KonanCompileTask: KonanBuildingTask(), KonanCompileSpec {
}
if (enableTwoStageCompilation) {
logger.info("Start two-stage compilation")
val intermediateDir = project.konanBuildRoot
val intermediateDir = konanBuildRoot
.resolve("intermediate")
.targetSubdir(konanTarget)
.apply { mkdirs() }
@@ -345,12 +355,12 @@ abstract class KonanCompileTask: KonanBuildingTask(), KonanCompileSpec {
}
}
abstract class KonanCompileNativeBinary: KonanCompileTask() {
abstract class KonanCompileNativeBinary @Inject constructor(layout: ProjectLayout) : KonanCompileTask(layout) {
@Input
override var enableTwoStageCompilation: Boolean = false
}
open class KonanCompileProgramTask: KonanCompileNativeBinary() {
abstract class KonanCompileProgramTask @Inject constructor(layout: ProjectLayout): KonanCompileNativeBinary(layout) {
override val produce: CompilerOutputKind get() = CompilerOutputKind.PROGRAM
@Internal
@@ -363,14 +373,14 @@ open class KonanCompileProgramTask: KonanCompileNativeBinary() {
}
}
open class KonanCompileDynamicTask: KonanCompileNativeBinary() {
abstract class KonanCompileDynamicTask @Inject constructor(layout: ProjectLayout): KonanCompileNativeBinary(layout) {
override val produce: CompilerOutputKind get() = CompilerOutputKind.DYNAMIC
val headerFile: File
@OutputFile get() = destinationDir.resolve("$artifactPrefix${artifactName}_api.h")
}
open class KonanCompileFrameworkTask: KonanCompileNativeBinary() {
abstract class KonanCompileFrameworkTask @Inject constructor(layout: ProjectLayout): KonanCompileNativeBinary(layout) {
override val produce: CompilerOutputKind get() = CompilerOutputKind.FRAMEWORK
override val artifact
@@ -378,7 +388,11 @@ open class KonanCompileFrameworkTask: KonanCompileNativeBinary() {
}
@CacheableTask
open class KonanCompileLibraryTask: KonanCompileTask() {
abstract class KonanCompileLibraryTask @Inject constructor(layout: ProjectLayout) : KonanCompileTask(layout) {
init {
this.notCompatibleWithConfigurationCache("project references stored")
}
override val artifact: File
@Internal get() = destinationDir.resolve(artifactFullName)
@@ -399,6 +413,6 @@ open class KonanCompileLibraryTask: KonanCompileTask() {
override val enableTwoStageCompilation: Boolean = false
}
open class KonanCompileBitcodeTask: KonanCompileNativeBinary() {
abstract class KonanCompileBitcodeTask @Inject constructor(layout: ProjectLayout): KonanCompileNativeBinary(layout) {
override val produce: CompilerOutputKind get() = CompilerOutputKind.BITCODE
}
@@ -21,13 +21,12 @@ import org.jetbrains.kotlin.gradle.plugin.konan.konanExtension
import java.io.File
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject
import kotlin.run
/**
* A task executing cinterop tool with the given args and compiling the stubs produced by this tool.
*/
open class KonanInteropTask @Inject constructor(@Internal val workerExecutor: WorkerExecutor) : KonanBuildingTask(), KonanInteropSpec {
abstract class KonanInteropTask @Inject constructor(private val workerExecutor: WorkerExecutor) : KonanBuildingTask(), KonanInteropSpec {
private val interopRunner = KonanCliInteropRunner(project, project.konanExtension.jvmArgs)
@@ -36,6 +35,7 @@ open class KonanInteropTask @Inject constructor(@Internal val workerExecutor: Wo
override fun init(config: KonanBuildingConfig<*>, destinationDir: File, artifactName: String, target: KonanTarget) {
super.init(config, destinationDir, artifactName, target)
this.notCompatibleWithConfigurationCache("Unsupported inputs")
this.defFile = project.konanDefaultDefFile(artifactName)
}
@@ -13,11 +13,13 @@ import org.gradle.api.plugins.BasePlugin
import org.gradle.api.tasks.*
import org.gradle.kotlin.dsl.*
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.gradle.process.ExecOperations
import org.jetbrains.kotlin.dependencies.NativeDependenciesExtension
import org.jetbrains.kotlin.dependencies.NativeDependenciesPlugin
import org.jetbrains.kotlin.konan.target.HostManager.Companion.hostIsMac
import org.jetbrains.kotlin.konan.target.HostManager.Companion.hostIsMingw
import java.io.File
import javax.inject.Inject
import kotlin.collections.List
import kotlin.collections.MutableMap
import kotlin.collections.addAll
@@ -41,7 +43,7 @@ open class NativePlugin : Plugin<Project> {
}
}
abstract class ToolExecutionTask : DefaultTask() {
abstract class ToolExecutionTask @Inject constructor(private val execOperations: ExecOperations): DefaultTask() {
@get:OutputFile
abstract var output: File
@@ -57,7 +59,7 @@ abstract class ToolExecutionTask : DefaultTask() {
@TaskAction
fun action() {
if (output.exists()) output.delete()
project.exec {
execOperations.exec {
executable(cmd)
args(*this@ToolExecutionTask.args.toTypedArray())
}
@@ -91,6 +91,7 @@ konanTargetList.forEach { target ->
if (target in cacheableTargets) {
val cacheTask = tasks.register("${libName}Cache", KonanCacheTask::class.java) {
notCompatibleWithConfigurationCache("project used in execution time")
this.target = targetName
originalKlib.fileProvider(libTask.map {
it.artifactDirectory ?: error("Artifact wasn't set for ${it.name}")
+3
View File
@@ -635,6 +635,8 @@ val stdlibTask = tasks.register<Copy>("nativeStdlib") {
from(stdlibBuildTask.map { it.outputs.files })
into(project.layout.buildDirectory.dir("nativeStdlib"))
val targetList = targetList
val kotlinVersion = kotlinVersion
eachFile {
if (name == "manifest") {
// Stdlib is a common library that doesn't depend on anything target-specific.
@@ -660,6 +662,7 @@ val cacheableTargetNames: List<String> by project
cacheableTargetNames.forEach { targetName ->
tasks.register("${targetName}StdlibCache", KonanCacheTask::class.java) {
notCompatibleWithConfigurationCache("project used in execution time")
target = targetName
originalKlib.fileProvider(stdlibTask.map { it.destinationDir })
klibUniqName = "stdlib"