From f87ae58f7c96acc6da89f9780fa5f2415828277d Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Tue, 11 Jul 2017 19:58:49 +0700 Subject: [PATCH] gradle-plugin: Fix incremental build The patch makes the plugin to set default input directories (src/main/kotlin and src/main/c_interop) at task construction rather than setting them during compiler command line building. It allows gradle to perform up-to-date checks correctly. --- tools/kotlin-native-gradle-plugin/build.gradle | 2 +- .../kotlin/gradle/plugin/KonanCompileTask.kt | 6 +----- .../kotlin/gradle/plugin/KonanInteropTask.kt | 10 +++------- .../kotlin/gradle/plugin/KonanPlugin.kt | 16 ++++++++++++++-- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/tools/kotlin-native-gradle-plugin/build.gradle b/tools/kotlin-native-gradle-plugin/build.gradle index 08c071e27fd..dd58a9d4c23 100644 --- a/tools/kotlin-native-gradle-plugin/build.gradle +++ b/tools/kotlin-native-gradle-plugin/build.gradle @@ -133,4 +133,4 @@ bintray { override = project.hasProperty("override") } publications = ['gradlePlugin'] -} \ No newline at end of file +} diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanCompileTask.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanCompileTask.kt index dce8a40b978..0d54db130e7 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanCompileTask.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanCompileTask.kt @@ -160,11 +160,7 @@ open class KonanCompileTask: KonanTargetableTask() { addKey("-opt", enableOptimization) addKey("-ea", enableAssertions) - (if (inputFiles.isEmpty()) { - project.fileTree("${project.projectDir.canonicalPath}/src/main/kotlin") - } else { - inputFiles.flatMap { it.files } - }).filter { it.name.endsWith(".kt") }.mapTo(this) { it.canonicalPath } + inputFiles.flatMap { it.files }.filter { it.name.endsWith(".kt") }.mapTo(this) { it.canonicalPath } } @TaskAction diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanInteropTask.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanInteropTask.kt index c2d153387ec..c5c4a4cf77a 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanInteropTask.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanInteropTask.kt @@ -58,8 +58,6 @@ open class KonanInteropTask: KonanTargetableTask() { get() = listOf("-Dkonan.home=${project.konanHome}", "-Djava.library.path=${project.konanHome}/konan/nativelib") internal val INTEROP_CLASSPATH: String get() = "${project.konanHome}/konan/lib/" - internal val C_INTEROP_DIR_PATH: String - get() = "${project.projectDir}/src/main/c_interop" // Output directories ----------------------------------------------------- @@ -124,9 +122,7 @@ open class KonanInteropTask: KonanTargetableTask() { manifest ?.let {addArg("-manifest", it)} addArgIfNotNull("-target", target) - val defFilePath = defFile?.canonicalPath ?: - project.file("$C_INTEROP_DIR_PATH/$libName.def").takeIf { it.exists() }?.canonicalPath - addArgIfNotNull("-def", defFilePath) + addArgIfNotNull("-def", defFile?.canonicalPath) addArg("-pkg", pkg ?: libName) addArgIfNotNull("-linker", linker) @@ -159,8 +155,8 @@ open class KonanInteropConfig( // Task to process the library and generate stubs val generateStubsTask: KonanInteropTask = project.tasks.create( "gen${name.capitalize()}InteropStubs", - KonanInteropTask::class.java - ) { it.init(name) + KonanInteropTask::class.java) { + it.init(name) it.manifest = "${it.stubsDir.path}/manifest.properties" } // Config and task to compile *.kt stubs into a library diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanPlugin.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanPlugin.kt index e82ef41cc96..eef64108c2d 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanPlugin.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanPlugin.kt @@ -48,6 +48,10 @@ internal val Project.konanInteropStubsOutputDir get() = "${konanBuildRoot}/int internal val Project.konanInteropCompiledStubsDir get() = "${konanBuildRoot}/interopCompiledStubs" internal val Project.konanInteropLibsOutputDir get() = "${konanBuildRoot}/nativelibs" +internal val Project.konanDefaultSrcDir get() = file("${projectDir.canonicalPath}/src/main/kotlin") +internal fun Project.konanDefaultDefFile(interopName: String) + = file("${projectDir.canonicalPath}/src/main/c_interop/$interopName.def") + internal val Project.konanArtifactsContainer: KonanArtifactsContainer get() = extensions.getByName(KonanPlugin.COMPILER_EXTENSION_NAME) as KonanArtifactsContainer internal val Project.konanInteropContainer: KonanInteropContainer @@ -90,7 +94,11 @@ class KonanArtifactsContainer(val project: ProjectInternal): AbstractNamedDomain project.gradle.services.get(Instantiator::class.java)) { override fun doCreate(name: String): KonanCompileConfig = - KonanCompileConfig(name, project) + KonanCompileConfig(name, project).apply { + project.konanDefaultSrcDir?.takeIf { it.exists() }?.let { + inputDir(it.canonicalPath) + } + } } class KonanInteropContainer(val project: ProjectInternal): AbstractNamedDomainObjectContainer( @@ -98,7 +106,11 @@ class KonanInteropContainer(val project: ProjectInternal): AbstractNamedDomainOb project.gradle.services.get(Instantiator::class.java)) { override fun doCreate(name: String): KonanInteropConfig = - KonanInteropConfig(name, project) + KonanInteropConfig(name, project).apply { + project.konanDefaultDefFile(name).takeIf { it.exists() }?.let { + defFile(it.canonicalFile) + } + } } // Useful extensions and functions ---------------------------------------