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:
committed by
Space Team
parent
584d98cd72
commit
57edc413a3
+1
@@ -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"
|
||||
|
||||
-2
@@ -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 -> {
|
||||
|
||||
+8
-2
@@ -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") {
|
||||
|
||||
+1
-7
@@ -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()
|
||||
|
||||
|
||||
+1
-3
@@ -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()
|
||||
|
||||
+28
-14
@@ -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
|
||||
}
|
||||
|
||||
+2
-2
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
+4
-2
@@ -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}")
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user