From 74ab5c21a8f86f2cba7be3a64a71a6351bbe1c54 Mon Sep 17 00:00:00 2001 From: Alexander Likhachev Date: Mon, 15 Feb 2021 14:59:47 +0300 Subject: [PATCH] [Build] Fix configuration cache issues (part 4) Make :kotlin-stdlib-js:prepareComparableSource, :kotlin-stdlib-js:prepareBuiltinsSources, :kotlin-stdlib-js:compileJs, :kotlin-stdlib-js:compileJs, :prepare:build.version:writeBuildNumber, :kotlin-compiler:distKotlinc compatible with configuration cache Relates to #KT-44611 --- libraries/stdlib/js-v1/build.gradle | 64 ++++++++++++++++---------- prepare/build.version/build.gradle.kts | 1 + prepare/compiler/build.gradle.kts | 22 ++++++--- 3 files changed, 56 insertions(+), 31 deletions(-) diff --git a/libraries/stdlib/js-v1/build.gradle b/libraries/stdlib/js-v1/build.gradle index 50ed921b74a..9e846b15707 100644 --- a/libraries/stdlib/js-v1/build.gradle +++ b/libraries/stdlib/js-v1/build.gradle @@ -33,8 +33,9 @@ def jsTestSrcDir = "test" def jsCommonTestSrcDir = "${jsCommonDir}/test" def jsSrcJsDir = "${jsSrcDir}/js" -def jsOutputFile = "${buildDir}/classes/kotlin.js" -def jsOutputMetaFile = "${buildDir}/classes/kotlin.meta.js" +def jsOutputFileName = "${buildDir}/classes/kotlin.js" +def jsOutputMapFileName = "${jsOutputFileName}.map" +def jsOutputMetaFileName = "${buildDir}/classes/kotlin.meta.js" def kotlinTestJsOutputFile = "${project(':kotlin-test:kotlin-test-js').buildDir}/classes/main/kotlin-test.js" @@ -74,8 +75,11 @@ dependencies { } task prepareComparableSource(type: Copy) { + def fs = services.get(FileSystemOperations) doFirst { - delete builtinsSrcDir2 + fs.delete { + delete builtinsSrcDir2 + } } from("${builtinsDir}/native/kotlin") { include "Comparable.kt" @@ -84,8 +88,11 @@ task prepareComparableSource(type: Copy) { } task prepareBuiltinsSources(type: Copy) { + def fs = services.get(FileSystemOperations) doFirst { - delete builtinsSrcDir + fs.delete { + delete builtinsSrcDir + } } from("${builtinsDir}/native/kotlin") { include "Iterator.kt" @@ -167,9 +174,9 @@ task compileJs(type: NoDebugJavaExec) { inputs.dir(jsSrcDir).withPathSensitivity(PathSensitivity.RELATIVE) inputs.dir(jsCommonSrcDir).withPathSensitivity(PathSensitivity.RELATIVE) - outputs.file(jsOutputFile) - outputs.file("${jsOutputFile}.map") - outputs.file(jsOutputMetaFile) + outputs.file(jsOutputFileName) + outputs.file(jsOutputMapFileName) + outputs.file(jsOutputMetaFileName) outputs.cacheIf { true } def inputFiles = fileTree(jsSrcJsDir) { @@ -177,33 +184,42 @@ task compileJs(type: NoDebugJavaExec) { } main = "org.jetbrains.kotlin.cli.js.internal.JSStdlibLinker" + + // local variables for configuration cache work + def rootDir = rootDir + def projectDir = projectDir + + def compileBuiltinsKotlin2JsFiles = compileBuiltinsKotlin2Js.outputs.files + def compileKotlin2JsFiles = compileKotlin2Js.outputs.files doFirst { - args = [jsOutputFile, rootDir, "$jsSrcDir/wrapper.js"] + inputFiles.collect { it.path }.sort() + - (compileBuiltinsKotlin2Js.outputs.files.collect { it.path }.sort() + - compileKotlin2Js.outputs.files.collect { it.path }.sort()).findAll { - it.endsWith(".js") && !it.endsWith(".meta.js") - } + args = [jsOutputFileName, rootDir, "$jsSrcDir/wrapper.js"] + inputFiles.collect { it.path }.sort() + + (compileBuiltinsKotlin2JsFiles.collect { it.path }.sort() + + compileKotlin2JsFiles.collect { it.path }.sort()).findAll { + it.endsWith(".js") && !it.endsWith(".meta.js") + } } classpath = configurations.kotlinCompilerClasspath + def sourceMapFile = file(jsOutputMapFileName) + def jsOutputMetaFile = file(jsOutputMetaFileName) + def compileMetaFile = file(compileKotlin2Js.outputFile.path.replaceAll('\\.js$', '.meta.js')) doLast { ant.replaceregexp( - file: jsOutputFile, + file: jsOutputFileName, match: "module.exports,\\s*require\\([^)]+\\)", replace: "", byline: "true", encoding: "UTF-8") ant.replaceregexp( - file: jsOutputFile, + file: jsOutputFileName, match: "function\\s*\\(_,\\s*Kotlin\\)", replace: "function()", byline: "true", encoding: "UTF-8") ant.replaceregexp( - file: jsOutputFile, + file: jsOutputFileName, match: "return\\s+_;", replace: "", byline: "true", encoding: "UTF-8") - def sourceMapFile = file("${jsOutputFile}.map") def sourceMap = new groovy.json.JsonSlurper().parseText(sourceMapFile.text) def sourceMapBasePaths = [ @@ -216,17 +232,17 @@ task compileJs(type: NoDebugJavaExec) { if (prefixToRemove != null) sourcePath.substring(prefixToRemove.length()) else sourcePath } - def sourceMapSourcesBaseDirs = [jsSrcDir, jsCommonSrcDir, jsSrcJsDir, builtinsSrcDir, commonSrcDir, commonSrcDir2, projectDir, unsignedCommonSrcDir] + def sourceMapSourcesBaseDirs = ["$projectDir/$jsSrcDir", jsCommonSrcDir, "$projectDir/$jsSrcJsDir", builtinsSrcDir, commonSrcDir, commonSrcDir2, projectDir, unsignedCommonSrcDir] sourceMap.sourcesContent = sourceMap.sources.collect { sourceName -> - def text = sourceMapSourcesBaseDirs.collect { file("$it/$sourceName") }.find { it.exists() }?.text + def text = sourceMapSourcesBaseDirs.collect { new File("$it/$sourceName") }.find { it.exists() }?.text if (text == null) logger.warn("Sources missing for file $sourceName") text } sourceMapFile.text = groovy.json.JsonOutput.toJson(sourceMap) - file(jsOutputMetaFile).text = file(compileKotlin2Js.outputFile.path.replaceAll('\\.js$', '.meta.js')).text + jsOutputMetaFile.text = compileMetaFile.text } } @@ -238,7 +254,7 @@ jar { } task libraryJarWithoutIr(type: Jar, dependsOn: compileJs) { - classifier = null + archiveClassifier = null manifestAttributes(manifest, project, 'Main') destinationDirectory = file("$buildDir/lib/dist") @@ -251,9 +267,9 @@ task libraryJarWithoutIr(type: Jar, dependsOn: compileJs) { includeEmptyDirs false duplicatesStrategy DuplicatesStrategy.EXCLUDE - from jsOutputFile - from jsOutputMetaFile - from "${jsOutputFile}.map" + from jsOutputFileName + from jsOutputMetaFileName + from "${jsOutputFileName}.map" from sourceSets.main.output filesMatching("*.*") { it.mode = 0b110100100 } // KTI-401 } @@ -357,7 +373,7 @@ task runMocha(type: NodeTask, dependsOn: [testClasses, installMocha, ':kotlin-te execOverrides { it.ignoreExitValue = rootProject.ignoreTestFailures - it.environment('NODE_PATH', [file(jsOutputFile).parent, file(kotlinTestJsOutputFile).parent].join(File.pathSeparator)) + it.environment('NODE_PATH', [file(jsOutputFileName).parent, file(kotlinTestJsOutputFile).parent].join(File.pathSeparator)) it.workingDir = buildDir } } diff --git a/prepare/build.version/build.gradle.kts b/prepare/build.version/build.gradle.kts index 1844cb13507..f0b9a6aa3a5 100644 --- a/prepare/build.version/build.gradle.kts +++ b/prepare/build.version/build.gradle.kts @@ -9,6 +9,7 @@ val kotlinVersion: String by rootProject.extra val writeBuildNumber by tasks.registering { val versionFile = File(buildVersionFilePath) + val buildNumber = buildNumber inputs.property("version", buildNumber) outputs.file(versionFile) doLast { diff --git a/prepare/compiler/build.gradle.kts b/prepare/compiler/build.gradle.kts index 7c8c6eb99ab..2e7b7e61a56 100644 --- a/prepare/compiler/build.gradle.kts +++ b/prepare/compiler/build.gradle.kts @@ -333,24 +333,32 @@ val distKotlinc = distTask("distKotlinc") { from(buildNumber) + val binFiles = files("$rootDir/compiler/cli/bin") into("bin") { - from(files("$rootDir/compiler/cli/bin")) + from(binFiles) } + val licenseFiles = files("$rootDir/license") into("license") { - from(files("$rootDir/license")) + from(licenseFiles) } + val compilerBaseName = compilerBaseName + val jarFiles = files(jar) + val librariesFiles = files(libraries) + val librariesStripVersionFiles = files(librariesStripVersion) + val sourcesFiles = files(sources) + val compilerPluginsFiles = files(compilerPlugins) into("lib") { - from(jar) { rename { "$compilerBaseName.jar" } } - from(libraries) - from(librariesStripVersion) { + from(jarFiles) { rename { "$compilerBaseName.jar" } } + from(librariesFiles) + from(librariesStripVersionFiles) { rename { it.replace(Regex("-\\d.*\\.jar\$"), ".jar") } } - from(sources) - from(compilerPlugins) { + from(sourcesFiles) + from(compilerPluginsFiles) { rename { it.removePrefix("kotlin-") } } }