From 1dfca08269a89059972c2eca30f80589a3e7c340 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov <41585329+ddolovov@users.noreply.github.com> Date: Tue, 2 Apr 2019 18:58:33 +0700 Subject: [PATCH] Pack stdlib sources into K/N bundle (#2838) --- backend.native/build.gradle | 54 +++---------- build.gradle | 52 +++++++++--- .../org/jetbrains/kotlin/CopyCommonSources.kt | 79 +++++++++++++++++++ 3 files changed, 129 insertions(+), 56 deletions(-) create mode 100644 buildSrc/plugins/src/main/kotlin/org/jetbrains/kotlin/CopyCommonSources.kt diff --git a/backend.native/build.gradle b/backend.native/build.gradle index 1d559423c64..117e6ed17f0 100644 --- a/backend.native/build.gradle +++ b/backend.native/build.gradle @@ -1,3 +1,4 @@ +import org.jetbrains.kotlin.CopyCommonSources import org.jetbrains.kotlin.konan.target.HostManager /* @@ -112,10 +113,8 @@ configurations { kotlin_reflect_jar kotlin_script_runtime_jar kotlin_native_shared_jar - kotlin_common_stdlib_src - kotlin_test_common_src - kotlin_test_annotations_common_src trove4j_jar + kotlinCommonSources cli_bcRuntime { extendsFrom compilerRuntime @@ -134,9 +133,10 @@ dependencies { kotlin_reflect_jar "$kotlinReflectModule@jar" kotlin_script_runtime_jar "$kotlinScriptRuntimeModule@jar" kotlin_native_shared_jar "$kotlinNativeSharedModule@jar" - kotlin_common_stdlib_src kotlinCommonStdlibModule - kotlin_test_common_src kotlinTestCommonModule - kotlin_test_annotations_common_src kotlinTestAnnotationsCommonModule + + [kotlinCommonStdlibModule, kotlinTestCommonModule, kotlinTestAnnotationsCommonModule].each { + kotlinCommonSources(it) { transitive = false } + } compilerCompile "com.google.protobuf:protobuf-java:${protobufVersion}" @@ -165,23 +165,9 @@ task stdlib(dependsOn: "${hostName}Stdlib") def commonSrc = file('build/stdlib') -task unzipStdlibSources(type: Copy) { - dependsOn configurations.kotlin_common_stdlib_src - dependsOn configurations.kotlin_test_common_src - dependsOn configurations.kotlin_test_annotations_common_src - - def jarFiles = configurations.kotlin_common_stdlib_src.files + - configurations.kotlin_test_common_src.files + - configurations.kotlin_test_annotations_common_src.files - - jarFiles.forEach { jarFile -> - from(zipTree(jarFile)) { - include 'generated/**/*.kt' - include 'kotlin/**/*.kt' - include 'kotlin.test/*.kt' - } - } - destinationDir commonSrc +task unzipStdlibSources(type: CopyCommonSources) { + outputDir commonSrc + sourcePaths configurations.kotlinCommonSources.files } final List stdLibSrc = [ @@ -192,28 +178,6 @@ final List stdLibSrc = [ project(':runtime').file('src/launcher/kotlin') ] -task zipStdLibSources(type: Zip, dependsOn: unzipStdlibSources) { - from stdLibSrc, { - into "native" - } - - from commonSrc, { - into "common" - } - - archiveName 'kotlin-stdlib-native-sources.zip' - destinationDir buildDir -} - -task teamcityPublishStdLibSources { - dependsOn zipStdLibSources - if (System.getenv("TEAMCITY_BUILD_PROPERTIES_FILE") != null) { - doLast { - println " ##teamcity[publishArtifacts '${tasks.zipStdLibSources.archivePath}'] " - } - } -} - // These files are built before the 'dist' is complete, // so we provide custom values for // konan.home, --runtime, -Djava.library.path etc diff --git a/build.gradle b/build.gradle index 9ed24261392..457f9ea5dad 100644 --- a/build.gradle +++ b/build.gradle @@ -13,11 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import groovy.io.FileType import org.jetbrains.kotlin.konan.target.* -import org.jetbrains.kotlin.konan.properties.* import org.jetbrains.kotlin.konan.util.* import org.jetbrains.kotlin.CopySamples +import org.jetbrains.kotlin.CopyCommonSources import org.jetbrains.kotlin.konan.* buildscript { @@ -191,6 +190,18 @@ class PlatformInfo { } } +configurations { + ftpAntTask + kotlinCommonSources +} + +dependencies { + ftpAntTask 'org.apache.ant:ant-commons-net:1.9.9' + [kotlinCommonStdlibModule, kotlinTestCommonModule, kotlinTestAnnotationsCommonModule].each { + kotlinCommonSources(it) { transitive = false } + } +} + task versionJar { dependsOn gradle.includedBuild('kotlin-native-version').task(':jar') } @@ -219,6 +230,32 @@ task build { dependsOn ':dist', ':distPlatformLibs' } +task distCommonSources(type: CopyCommonSources) { + outputDir "$distDir/sources" + sourcePaths configurations.kotlinCommonSources.files + zipSources true +} + +task distNativeSources(type: Zip) { + destinationDirectory = file("$distDir/sources") + archiveFileName = "kotlin-stdlib-native-sources.zip" + + includeEmptyDirs = false + include('**/*.kt') + + from(project(':runtime').file('src/main/kotlin')) + from(project(':Interop:Runtime').file('src/main/kotlin')) + from(project(':Interop:Runtime').file('src/native/kotlin')) + from(project(':Interop:JsRuntime').file('src/main/kotlin')) { + into('kotlinx/wasm/jsinterop') + } +} + +task distSources { + dependsOn(distCommonSources) + dependsOn(distNativeSources) +} + task distCompiler(type: Copy) { dependsOn ':backend.native:jar' dependsOn ':utilities:jar' @@ -319,7 +356,6 @@ task listDist(type: Exec) { task distRuntime(type: Copy) { dependsOn "${hostName}CrossDistRuntime" dependsOn('commonDistRuntime') - dependsOn(':backend.native:teamcityPublishStdLibSources') } def stdlib = 'klib/common/stdlib' @@ -393,17 +429,10 @@ task crossDist { dependsOn 'crossDistRuntime', 'distCompiler' } -configurations { - ftpAntTask -} - -dependencies { - ftpAntTask 'org.apache.ant:ant-commons-net:1.9.9' -} - task bundle(type: (isWindows()) ? Zip : Tar) { dependsOn('crossDistPlatformLibs') dependsOn('crossDist') + dependsOn('distSources') def simpleOsName = HostManager.simpleOsName() baseName = "kotlin-native-$simpleOsName-$konanVersionFull" from("$project.rootDir/dist") { @@ -441,6 +470,7 @@ task bundle(type: (isWindows()) ? Zip : Tar) { task 'tc-dist'(type: (isWindows()) ? Zip : Tar) { dependsOn('distPlatformLibs') dependsOn('dist') + dependsOn('distSources') def simpleOsName = HostManager.simpleOsName() baseName = "kotlin-native-dist-$simpleOsName-$konanVersionFull" from("$project.rootDir/dist") { diff --git a/buildSrc/plugins/src/main/kotlin/org/jetbrains/kotlin/CopyCommonSources.kt b/buildSrc/plugins/src/main/kotlin/org/jetbrains/kotlin/CopyCommonSources.kt new file mode 100644 index 00000000000..b6ca78c7926 --- /dev/null +++ b/buildSrc/plugins/src/main/kotlin/org/jetbrains/kotlin/CopyCommonSources.kt @@ -0,0 +1,79 @@ +package org.jetbrains.kotlin + +import org.gradle.api.DefaultTask +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction +import java.io.File + +open class CopyCommonSources : DefaultTask() { + @Input + var zipSources: Boolean = false + + @InputFiles + var sourcePaths: ConfigurableFileCollection = project.files() + + @OutputDirectory + var outputDir: File = project.buildDir.resolve("sources") + + fun zipSources(needToZip: Boolean) { + zipSources = needToZip + } + + fun outputDir(path: Any) { + outputDir = project.file(path) + } + + fun sourcePaths(paths: Any) { + sourcePaths = project.files(paths) + } + + @TaskAction + fun copySources() { + if (zipSources) copyAndZip() else copyPlain() + } + + private fun copyPlain() { + for (sourcePath in sourcePaths) { + sourcePath.copyFilteredTo(outputDir) + } + } + + private fun copyAndZip() { + for (sourcePath in sourcePaths) { + val filePrefix = sourcePath.name.replace(Regex("-\\d+.*"), "") + val targetFileName = "$filePrefix-sources.zip" + + val tempDir = project.buildDir.resolve(name).resolve(filePrefix).also { + it.deleteRecursively() + it.mkdirs() + } + + sourcePath.copyFilteredTo(tempDir) + + project.ant.invokeMethod( + "zip", + mapOf( + "destfile" to outputDir.resolve(targetFileName).absolutePath, + "basedir" to tempDir.absolutePath + ) + ) + } + } + + private fun File.copyFilteredTo(destinationDir: File) { + val fileTree = if (isFile) project.zipTree(this) else project.fileTree(this) + + project.copy { + it.from(fileTree) + it.includeEmptyDirs = false + it.include("generated/**/*.kt") + it.include("kotlin/**/*.kt") + it.include("kotlin.test/*.kt") + it.into(destinationDir) + } + } +} +