diff --git a/kotlin-native/build-tools/src/main/groovy/org/jetbrains/kotlin/NativeInteropPlugin.groovy b/kotlin-native/build-tools/src/main/groovy/org/jetbrains/kotlin/NativeInteropPlugin.groovy index c00413fc11f..d7c4a53452b 100644 --- a/kotlin-native/build-tools/src/main/groovy/org/jetbrains/kotlin/NativeInteropPlugin.groovy +++ b/kotlin-native/build-tools/src/main/groovy/org/jetbrains/kotlin/NativeInteropPlugin.groovy @@ -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" diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt index 46c005c174e..8b90bb3a98d 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt @@ -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 -> { diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanBaseTasks.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanBaseTasks.kt index 0ab5ddf2e28..29b9b529831 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanBaseTasks.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanBaseTasks.kt @@ -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") { diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanBuildingTask.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanBuildingTask.kt index b34117ee98e..f4c3c454828 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanBuildingTask.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanBuildingTask.kt @@ -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() - val konanHome - @Input get() = project.konanHome - @TaskAction abstract fun run() diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt index a4cd0d6ccd0..cd4812570d8 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt @@ -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 = project.objects.property(File::class.java).apply { - set(project.provider { project.kotlinNativeDist }) - } + val compilerDistributionPath: Property = project.objects.property(File::class.java).convention(project.kotlinNativeDist) @get:Input var cachedLibraries: Map = emptyMap() diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCompileTask.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCompileTask.kt index a24c7248304..cb87d3930b1 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCompileTask.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCompileTask.kt @@ -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() + private val defaultFiles = project.konanDefaultSrcFiles val srcFiles: Collection - @Internal get() = srcFiles_.takeIf { !it.isEmpty() } ?: listOf(project.konanDefaultSrcFiles) + @Internal get() { + return srcFiles_.takeIf { !it.isEmpty() } ?: listOf(defaultFiles) + } val allSources: Collection @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().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 } diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanInteropTask.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanInteropTask.kt index 40ee9036bb4..0347558bedf 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanInteropTask.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanInteropTask.kt @@ -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) } diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/tools/NativePlugin.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/tools/NativePlugin.kt index 2fef0da8dd1..e820969a847 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/tools/NativePlugin.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/tools/NativePlugin.kt @@ -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 { } } -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()) } diff --git a/kotlin-native/platformLibs/build.gradle.kts b/kotlin-native/platformLibs/build.gradle.kts index 4f282bb8177..8d21f593a7e 100644 --- a/kotlin-native/platformLibs/build.gradle.kts +++ b/kotlin-native/platformLibs/build.gradle.kts @@ -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}") diff --git a/kotlin-native/runtime/build.gradle.kts b/kotlin-native/runtime/build.gradle.kts index 8768d75e61d..82e63617a67 100644 --- a/kotlin-native/runtime/build.gradle.kts +++ b/kotlin-native/runtime/build.gradle.kts @@ -635,6 +635,8 @@ val stdlibTask = tasks.register("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 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"