Rewrite kotlin-reflect build script from Groovy to Kotlin

This commit is contained in:
Alexander Udalov
2017-11-22 11:11:59 +01:00
parent 885ddc49a2
commit a1f895bb1f
3 changed files with 164 additions and 109 deletions
+4
View File
@@ -1,5 +1,6 @@
@file:Suppress("unused") // usages in build scripts are not tracked properly @file:Suppress("unused") // usages in build scripts are not tracked properly
import groovy.lang.Closure
import org.gradle.api.* import org.gradle.api.*
import org.gradle.api.tasks.* import org.gradle.api.tasks.*
import org.gradle.kotlin.dsl.* import org.gradle.kotlin.dsl.*
@@ -11,6 +12,9 @@ import java.io.File
inline fun <reified T : Task> Project.task(noinline configuration: T.() -> Unit) = tasks.creating(T::class, configuration) inline fun <reified T : Task> Project.task(noinline configuration: T.() -> Unit) = tasks.creating(T::class, configuration)
fun Project.callGroovy(name: String, vararg args: Any?): Any? {
return (property(name) as Closure<*>).call(*args)
}
fun AbstractTask.dependsOnTaskIfExists(task: String, project: Project?, parentProject: Project?) { fun AbstractTask.dependsOnTaskIfExists(task: String, project: Project?, parentProject: Project?) {
val thisTask = this val thisTask = this
+60 -6
View File
@@ -521,7 +521,8 @@
":kotlin-annotation-processing": { ":kotlin-annotation-processing": {
"conventions": { "conventions": {
"base": "org.gradle.api.plugins.BasePluginConvention", "base": "org.gradle.api.plugins.BasePluginConvention",
"java": "org.gradle.api.plugins.JavaPluginConvention" "java": "org.gradle.api.plugins.JavaPluginConvention",
"maven": "org.gradle.api.plugins.MavenPluginConvention"
}, },
"configurations": [ "configurations": [
"apiElements", "apiElements",
@@ -539,6 +540,7 @@
"runtimeElements", "runtimeElements",
"runtimeJar", "runtimeJar",
"runtimeOnly", "runtimeOnly",
"signatures",
"testCompile", "testCompile",
"testCompileClasspath", "testCompileClasspath",
"testCompileOnly", "testCompileOnly",
@@ -553,7 +555,27 @@
"kotlin": "org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension", "kotlin": "org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension",
"kapt": "org.jetbrains.kotlin.gradle.plugin.KaptExtension", "kapt": "org.jetbrains.kotlin.gradle.plugin.KaptExtension",
"defaultArtifacts": "org.gradle.api.internal.plugins.DefaultArtifactPublicationSet", "defaultArtifacts": "org.gradle.api.internal.plugins.DefaultArtifactPublicationSet",
"reporting": "org.gradle.api.reporting.ReportingExtension" "reporting": "org.gradle.api.reporting.ReportingExtension",
"signing": "org.gradle.plugins.signing.SigningExtension"
}
},
":kotlin-annotation-processing-embeddable": {
"conventions": {
"base": "org.gradle.api.plugins.BasePluginConvention",
"maven": "org.gradle.api.plugins.MavenPluginConvention"
},
"configurations": [
"archives",
"compilerDummyJar",
"default",
"packedJars",
"runtimeJar",
"signatures"
],
"extensions": {
"ext": "org.gradle.api.plugins.ExtraPropertiesExtension",
"defaultArtifacts": "org.gradle.api.internal.plugins.DefaultArtifactPublicationSet",
"signing": "org.gradle.plugins.signing.SigningExtension"
} }
}, },
":kotlin-annotation-processing-gradle": { ":kotlin-annotation-processing-gradle": {
@@ -1263,8 +1285,6 @@
"default", "default",
"distJar", "distJar",
"implementation", "implementation",
"kapt",
"kaptTest",
"mainJar", "mainJar",
"proguardDeps", "proguardDeps",
"runtime", "runtime",
@@ -1285,13 +1305,46 @@
"extensions": { "extensions": {
"ext": "org.gradle.api.plugins.ExtraPropertiesExtension", "ext": "org.gradle.api.plugins.ExtraPropertiesExtension",
"shadow": "com.github.jengelman.gradle.plugins.shadow.ShadowExtension", "shadow": "com.github.jengelman.gradle.plugins.shadow.ShadowExtension",
"kotlin": "org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension",
"kapt": "org.jetbrains.kotlin.gradle.plugin.KaptExtension",
"defaultArtifacts": "org.gradle.api.internal.plugins.DefaultArtifactPublicationSet", "defaultArtifacts": "org.gradle.api.internal.plugins.DefaultArtifactPublicationSet",
"reporting": "org.gradle.api.reporting.ReportingExtension", "reporting": "org.gradle.api.reporting.ReportingExtension",
"signing": "org.gradle.plugins.signing.SigningExtension" "signing": "org.gradle.plugins.signing.SigningExtension"
} }
}, },
":kotlin-reflect-api": {
"conventions": {
"base": "org.gradle.api.plugins.BasePluginConvention",
"java": "org.gradle.api.plugins.JavaPluginConvention"
},
"configurations": [
"apiElements",
"archives",
"compile",
"compileClasspath",
"compileOnly",
"default",
"implementation",
"kapt",
"kaptTest",
"runtime",
"runtimeClasspath",
"runtimeElements",
"runtimeOnly",
"testCompile",
"testCompileClasspath",
"testCompileOnly",
"testImplementation",
"testRuntime",
"testRuntimeClasspath",
"testRuntimeOnly"
],
"extensions": {
"ext": "org.gradle.api.plugins.ExtraPropertiesExtension",
"kotlin": "org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension",
"kapt": "org.jetbrains.kotlin.gradle.plugin.KaptExtension",
"defaultArtifacts": "org.gradle.api.internal.plugins.DefaultArtifactPublicationSet",
"reporting": "org.gradle.api.reporting.ReportingExtension"
}
},
":kotlin-runner": { ":kotlin-runner": {
"conventions": { "conventions": {
"base": "org.gradle.api.plugins.BasePluginConvention", "base": "org.gradle.api.plugins.BasePluginConvention",
@@ -3904,6 +3957,7 @@
], ],
"extensions": { "extensions": {
"ext": "org.gradle.api.plugins.ExtraPropertiesExtension", "ext": "org.gradle.api.plugins.ExtraPropertiesExtension",
"idea": "org.gradle.plugins.ide.idea.model.IdeaModel",
"kotlin": "org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension", "kotlin": "org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension",
"kapt": "org.jetbrains.kotlin.gradle.plugin.KaptExtension", "kapt": "org.jetbrains.kotlin.gradle.plugin.KaptExtension",
"defaultArtifacts": "org.gradle.api.internal.plugins.DefaultArtifactPublicationSet", "defaultArtifacts": "org.gradle.api.internal.plugins.DefaultArtifactPublicationSet",
+100 -103
View File
@@ -1,177 +1,174 @@
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import proguard.gradle.ProGuardTask
description = 'Kotlin Full Reflection Library' description = "Kotlin Full Reflection Library"
buildscript { buildscript {
repositories { repositories {
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'net.sf.proguard:proguard-gradle:5.2.1' classpath("net.sf.proguard:proguard-gradle:5.2.1")
classpath "com.github.jengelman.gradle.plugins:shadow:${property("versions.shadow")}" classpath("com.github.jengelman.gradle.plugins:shadow:${property("versions.shadow")}")
} }
} }
apply plugin: 'com.github.johnrengelman.shadow' plugins { java }
apply plugin: 'java'
configureJavaOnlyJvm6Project(project) callGroovy("configureJavaOnlyJvm6Project", this)
configurePublishing(project) publish()
def core = "${rootDir}/core" val core = "$rootDir/core"
def annotationsSrc = "${buildDir}/annotations" val annotationsSrc = "$buildDir/annotations"
def relocatedCoreSrc = "${buildDir}/core-relocated" val relocatedCoreSrc = "$buildDir/core-relocated"
val libsDir = property("libsDir")
sourceSets { sourceSets {
main { "main" {
java { java.srcDir(annotationsSrc)
srcDir annotationsSrc
}
} }
} }
configurations { val proguardDeps by configurations.creating
proguardDeps val shadows by configurations.creating {
shadows { transitive = false } isTransitive = false
compileOnly.extendsFrom(shadows)
mainJar
} }
configurations.getByName("compileOnly").extendsFrom(shadows)
val mainJar by configurations.creating
dependencies { dependencies {
compile project(':kotlin-stdlib') compile(project(":kotlin-stdlib"))
proguardDeps project(':kotlin-stdlib') proguardDeps(project(":kotlin-stdlib"))
shadows project(':kotlin-reflect-api') shadows(project(":kotlin-reflect-api"))
shadows project(':core:descriptors') shadows(project(":core:descriptors"))
shadows project(':core:descriptors.jvm') shadows(project(":core:descriptors.jvm"))
shadows project(':core:deserialization') shadows(project(":core:deserialization"))
shadows project(':core:descriptors.runtime') shadows(project(":core:descriptors.runtime"))
shadows project(':core:util.runtime') shadows(project(":core:util.runtime"))
shadows 'javax.inject:javax.inject:1' shadows("javax.inject:javax.inject:1")
shadows project(path: ':custom-dependencies:protobuf-lite', configuration: 'default') shadows(project(":custom-dependencies:protobuf-lite", configuration = "default"))
} }
task copyAnnotations(type: Sync) { val copyAnnotations by task<Sync> {
// copy just two missing annotations // copy just two missing annotations
from("${core}/runtime.jvm/src") { from("$core/runtime.jvm/src") {
include "**/Mutable.java" include("**/Mutable.java")
include "**/ReadOnly.java" include("**/ReadOnly.java")
} }
into(annotationsSrc) into(annotationsSrc)
includeEmptyDirs false includeEmptyDirs = false
} }
tasks.getByName("compileJava").dependsOn(copyAnnotations)
compileJava { val reflectShadowJar by task<ShadowJar> {
dependsOn copyAnnotations classifier = "shadow"
// options.compilerArgs.addAll(["-Xlint:unchecked"])
}
task reflectShadowJar(type: ShadowJar) {
classifier = 'shadow'
version = null version = null
manifestAttributes(manifest, project, 'Main') callGroovy("manifestAttributes", manifest, project, "Main")
from(sourceSets.main.output) from(the<JavaPluginConvention>().sourceSets.getByName("main").output)
from(project(":core:descriptors.jvm").sourceSets.main.resources) { from(project(":core:descriptors.jvm").the<JavaPluginConvention>().sourceSets.getByName("main").resources) {
include 'META-INF/services/**' include("META-INF/services/**")
} }
from(project(":core:deserialization").sourceSets.main.resources) { from(project(":core:deserialization").the<JavaPluginConvention>().sourceSets.getByName("main").resources) {
include 'META-INF/services/**' include("META-INF/services/**")
} }
transform(new KotlinModuleShadowTransformer(logger)) transform(KotlinModuleShadowTransformer(logger))
configurations = [project.configurations.shadows] configurations = listOf(shadows)
relocate 'org.jetbrains.kotlin', 'kotlin.reflect.jvm.internal.impl' relocate("org.jetbrains.kotlin", "kotlin.reflect.jvm.internal.impl")
relocate 'javax.inject', 'kotlin.reflect.jvm.internal.impl.javax.inject' relocate("javax.inject", "kotlin.reflect.jvm.internal.impl.javax.inject")
mergeServiceFiles() mergeServiceFiles()
} }
task stripMetadata { val stripMetadata by tasks.creating {
dependsOn reflectShadowJar dependsOn("reflectShadowJar")
def inputJar = reflectShadowJar.archivePath val inputJar = reflectShadowJar.archivePath
def outputJar = new File("${libsDir}/kotlin-reflect-stripped.jar") val outputJar = File("$libsDir/kotlin-reflect-stripped.jar")
inputs.file(inputJar) inputs.file(inputJar)
outputs.file(outputJar) outputs.file(outputJar)
doLast { doLast {
StripMetadataKt.stripMetadata(logger, "kotlin/reflect/jvm/internal/impl/.*", inputJar, outputJar) stripMetadata(logger, "kotlin/reflect/jvm/internal/impl/.*", inputJar, outputJar)
} }
} }
def mainArchiveName = "${archivesBaseName}-${project.version}.jar" val mainArchiveName = "${property("archivesBaseName")}-$version.jar"
def outputJarPath = "${libsDir}/${mainArchiveName}" val outputJarPath = "$libsDir/$mainArchiveName"
def rtJar = ['jre/lib/rt.jar', '../Classes/classes.jar'].collect { new File(JDK_16, it) }.find { it.isFile() } val rtJar = listOf("jre/lib/rt.jar", "../Classes/classes.jar").map { File("${property("JDK_16")}/$it") }.first(File::isFile)
task proguard(type: proguard.gradle.ProGuardTask) { val proguard by task<ProGuardTask> {
dependsOn stripMetadata dependsOn(stripMetadata)
inputs.files(stripMetadata.outputs.files) inputs.files(stripMetadata.outputs.files)
outputs.file(outputJarPath) outputs.file(outputJarPath)
injars stripMetadata.outputs.files injars(stripMetadata.outputs.files)
outjars outputJarPath outjars(outputJarPath)
libraryjars configurations.proguardDeps libraryjars(proguardDeps)
libraryjars rtJar libraryjars(rtJar)
configuration "${core}/reflection.jvm/reflection.pro" configuration("$core/reflection.jvm/reflection.pro")
} }
val relocateCoreSources by task<Copy> {
task relocateCoreSources(type: Copy) {
def commonPackage = "org/jetbrains/kotlin"
doFirst { doFirst {
delete(relocatedCoreSrc) delete(relocatedCoreSrc)
} }
from "${core}/descriptors/src/${commonPackage}" from("$core/descriptors/src")
from "${core}/descriptors.jvm/src/${commonPackage}" from("$core/descriptors.jvm/src")
from "${core}/descriptors.runtime/src/${commonPackage}" from("$core/descriptors.runtime/src")
from "${core}/deserialization/src/${commonPackage}" from("$core/deserialization/src")
from "${core}/util.runtime/src/${commonPackage}" from("$core/util.runtime/src")
into "${relocatedCoreSrc}/kotlin/reflect/jvm/internal/impl" into(relocatedCoreSrc)
includeEmptyDirs = false
doLast { eachFile {
ant.replaceregexp( path = path.replace("org/jetbrains/kotlin", "kotlin/reflect/jvm/internal/impl")
match: 'org\\.jetbrains\\.kotlin', }
replace: 'kotlin.reflect.jvm.internal.impl',
flags: 'g' filter { line ->
) { line.replace("org.jetbrains.kotlin", "kotlin.reflect.jvm.internal.impl")
fileset(dir: relocatedCoreSrc)
}
} }
} }
jar.enabled false tasks.getByName("jar").enabled = false
task relocatedSourcesJar(type: Jar) { val relocatedSourcesJar by task<Jar> {
dependsOn relocateCoreSources dependsOn(relocateCoreSources)
classifier 'sources' classifier = "sources"
from relocatedCoreSrc from(relocatedCoreSrc)
from "${core}/reflection.jvm/src" from("$core/reflection.jvm/src")
} }
def artifactJar = [file: file(outputJarPath), builtBy: proguard, name: archivesBaseName] val result = proguard
task dexMethodCount(type: DexMethodCount) { val dexMethodCount by task<DexMethodCount> {
dependsOn(artifactJar.builtBy) dependsOn(result)
jarFile = artifactJar.file jarFile = File(outputJarPath)
ownPackages = ['kotlin.reflect'] ownPackages = listOf("kotlin.reflect")
} }
check.dependsOn(dexMethodCount) tasks.getByName("check").dependsOn(dexMethodCount)
artifacts { artifacts {
mainJar artifactJar val artifactJar = mapOf(
runtime artifactJar "file" to File(outputJarPath),
archives artifactJar "builtBy" to result,
archives relocatedSourcesJar "name" to property("archivesBaseName")
archives javadocJar )
add(mainJar.name, artifactJar)
add("runtime", artifactJar)
add("archives", artifactJar)
add("archives", relocatedSourcesJar)
} }
dist { javadocJar()
from(proguard)
dist(fromTask = result) {
from(relocatedSourcesJar) from(relocatedSourcesJar)
} }