Move strip-kotlin-annotations script to buildSrc
... and invoke it directly in kotlin-reflect's build file, instead of running another instance of compiler to evaluate a script. Also only strip kotlin.Metadata, since it's the only annotation with heavy metadata on Kotlin-generated class files
This commit is contained in:
@@ -64,8 +64,6 @@ allprojects {
|
|||||||
extra["kotlin_root"] = rootDir
|
extra["kotlin_root"] = rootDir
|
||||||
|
|
||||||
val bootstrapCompileCfg = configurations.create("bootstrapCompile")
|
val bootstrapCompileCfg = configurations.create("bootstrapCompile")
|
||||||
val scriptCompileCfg = configurations.create("scriptCompile").extendsFrom(bootstrapCompileCfg)
|
|
||||||
val scriptRuntimeCfg = configurations.create("scriptRuntime").extendsFrom(scriptCompileCfg)
|
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
for (repo in (rootProject.extra["repos"] as List<String>)) {
|
for (repo in (rootProject.extra["repos"] as List<String>)) {
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ dependencies {
|
|||||||
// TODO: adding the dep to the plugin breaks the build unexpectedly, resolve and uncomment
|
// TODO: adding the dep to the plugin breaks the build unexpectedly, resolve and uncomment
|
||||||
// compile("org.jetbrains.kotlin:kotlin-gradle-plugin:${rootProject.extra["bootstrap_kotlin_version"]}")
|
// compile("org.jetbrains.kotlin:kotlin-gradle-plugin:${rootProject.extra["bootstrap_kotlin_version"]}")
|
||||||
compile("com.github.jengelman.gradle.plugins:shadow:${property("versions.shadow")}")
|
compile("com.github.jengelman.gradle.plugins:shadow:${property("versions.shadow")}")
|
||||||
|
compile("org.ow2.asm:asm-all:6.0_BETA")
|
||||||
}
|
}
|
||||||
|
|
||||||
samWithReceiver {
|
samWithReceiver {
|
||||||
|
|||||||
+13
-37
@@ -1,20 +1,7 @@
|
|||||||
/*
|
@file:Suppress("unused") // usages in build scripts are not tracked properly
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import org.jetbrains.org.objectweb.asm.*
|
import org.gradle.api.logging.Logger
|
||||||
|
import org.objectweb.asm.*
|
||||||
import java.io.BufferedOutputStream
|
import java.io.BufferedOutputStream
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
@@ -22,24 +9,13 @@ import java.util.jar.JarFile
|
|||||||
import java.util.zip.ZipOutputStream
|
import java.util.zip.ZipOutputStream
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes metadata annotations from Kotlin classes
|
* Removes @kotlin.Metadata annotations from compiled Kotlin classes
|
||||||
*/
|
*/
|
||||||
|
fun stripMetadata(logger: Logger, classNamePattern: String, inFile: File, outFile: File) {
|
||||||
fun main(args: Array<String>) {
|
val classRegex = classNamePattern.toRegex()
|
||||||
if (args.size != 4) {
|
|
||||||
error("Usage: kotlinc -script strip-kotlin-annotations.kts <annotation-internal-name-regex> <class-internal-name-regex> <path-to-in-jar> <path-to-out-jar>")
|
|
||||||
}
|
|
||||||
|
|
||||||
val annotationRegex = args[0].toRegex()
|
|
||||||
val classRegex = args[1].toRegex()
|
|
||||||
val inFile = File(args[2])
|
|
||||||
val outFile = File(args[3])
|
|
||||||
|
|
||||||
assert(inFile.exists()) { "Input file not found at $inFile" }
|
assert(inFile.exists()) { "Input file not found at $inFile" }
|
||||||
|
|
||||||
println("Stripping annotations from all classes in $inFile")
|
|
||||||
println("Input file size: ${inFile.length()} bytes")
|
|
||||||
|
|
||||||
fun transform(entryName: String, bytes: ByteArray): ByteArray {
|
fun transform(entryName: String, bytes: ByteArray): ByteArray {
|
||||||
if (!entryName.endsWith(".class")) return bytes
|
if (!entryName.endsWith(".class")) return bytes
|
||||||
if (!classRegex.matches(entryName.removeSuffix(".class"))) return bytes
|
if (!classRegex.matches(entryName.removeSuffix(".class"))) return bytes
|
||||||
@@ -48,7 +24,7 @@ fun main(args: Array<String>) {
|
|||||||
val classWriter = ClassWriter(0)
|
val classWriter = ClassWriter(0)
|
||||||
val classVisitor = object : ClassVisitor(Opcodes.ASM5, classWriter) {
|
val classVisitor = object : ClassVisitor(Opcodes.ASM5, classWriter) {
|
||||||
override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? {
|
override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? {
|
||||||
if (annotationRegex.matches(Type.getType(desc).getInternalName())) {
|
if (Type.getType(desc).internalName == "kotlin/Metadata") {
|
||||||
changed = true
|
changed = true
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
@@ -61,8 +37,7 @@ fun main(args: Array<String>) {
|
|||||||
return classWriter.toByteArray()
|
return classWriter.toByteArray()
|
||||||
}
|
}
|
||||||
|
|
||||||
ZipOutputStream(BufferedOutputStream(FileOutputStream(outFile))).use {
|
ZipOutputStream(BufferedOutputStream(FileOutputStream(outFile))).use { outJar ->
|
||||||
outJar ->
|
|
||||||
JarFile(inFile).use { inJar ->
|
JarFile(inFile).use { inJar ->
|
||||||
for (entry in inJar.entries()) {
|
for (entry in inJar.entries()) {
|
||||||
val inBytes = inJar.getInputStream(entry).readBytes()
|
val inBytes = inJar.getInputStream(entry).readBytes()
|
||||||
@@ -80,8 +55,9 @@ fun main(args: Array<String>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
println("Output written to $outFile")
|
logger.info("Stripping @kotlin.Metadata annotations from all classes in $inFile")
|
||||||
println("Output file size: ${outFile.length()} bytes")
|
logger.info("Class name pattern: $classNamePattern")
|
||||||
|
logger.info("Input file size: ${inFile.length()} bytes")
|
||||||
|
logger.info("Output written to $outFile")
|
||||||
|
logger.info("Output file size: ${outFile.length()} bytes")
|
||||||
}
|
}
|
||||||
|
|
||||||
main(args)
|
|
||||||
@@ -28,6 +28,7 @@ class CodeConformanceTest : TestCase() {
|
|||||||
private val SOURCES_FILE_PATTERN = Pattern.compile("(.+\\.java|.+\\.kt|.+\\.js)")
|
private val SOURCES_FILE_PATTERN = Pattern.compile("(.+\\.java|.+\\.kt|.+\\.js)")
|
||||||
private val EXCLUDED_FILES_AND_DIRS = listOf(
|
private val EXCLUDED_FILES_AND_DIRS = listOf(
|
||||||
"android.tests.dependencies",
|
"android.tests.dependencies",
|
||||||
|
"buildSrc",
|
||||||
"core/reflection.jvm/src/kotlin/reflect/jvm/internal/pcollections",
|
"core/reflection.jvm/src/kotlin/reflect/jvm/internal/pcollections",
|
||||||
"libraries/kotlin.test/js/it/.gradle",
|
"libraries/kotlin.test/js/it/.gradle",
|
||||||
"libraries/kotlin.test/js/it/node_modules",
|
"libraries/kotlin.test/js/it/node_modules",
|
||||||
|
|||||||
@@ -4,9 +4,7 @@
|
|||||||
|
|
||||||
},
|
},
|
||||||
"configurations": [
|
"configurations": [
|
||||||
"bootstrapCompile",
|
"bootstrapCompile"
|
||||||
"scriptCompile",
|
|
||||||
"scriptRuntime"
|
|
||||||
],
|
],
|
||||||
"extensions": {
|
"extensions": {
|
||||||
"ext": "org.gradle.api.plugins.ExtraPropertiesExtension",
|
"ext": "org.gradle.api.plugins.ExtraPropertiesExtension",
|
||||||
|
|||||||
@@ -206,22 +206,3 @@ ext.createPreprocessorTask = { Project project, def name, def sourceDir, def tar
|
|||||||
args = [sourceDir, targetDir, profile]
|
args = [sourceDir, targetDir, profile]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ext.createScriptTask = { Project project, def name, Closure<JavaExec> configureClosure = null ->
|
|
||||||
JavaExec task = project.tasks.create(name, JavaExec)
|
|
||||||
return project.configure(task) {
|
|
||||||
// dependsOn(rootProject.prepareBootstrap)
|
|
||||||
classpath = rootProject.configurations.scriptCompile
|
|
||||||
main = "org.jetbrains.kotlin.cli.jvm.K2JVMCompiler"
|
|
||||||
args = [
|
|
||||||
"-script",
|
|
||||||
"-version",
|
|
||||||
"-no-stdlib",
|
|
||||||
"-cp", rootProject.configurations.scriptRuntime.asPath]
|
|
||||||
|
|
||||||
if (configureClosure != null) {
|
|
||||||
configureClosure.delegate = it
|
|
||||||
configureClosure.call()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -89,11 +89,11 @@ task reflectShadowJar(type: ShadowJar) {
|
|||||||
version = null
|
version = null
|
||||||
manifestAttributes(manifest, project, 'Main')
|
manifestAttributes(manifest, project, 'Main')
|
||||||
|
|
||||||
from (sourceSets.main.output)
|
from(sourceSets.main.output)
|
||||||
from ("${core}/descriptors.jvm/src") {
|
from(project(":core:descriptors.jvm").sourceSets.main.resources) {
|
||||||
include 'META-INF/services/**'
|
include 'META-INF/services/**'
|
||||||
}
|
}
|
||||||
from ("${core}/deserialization/src") {
|
from(project(":core:deserialization").sourceSets.main.resources) {
|
||||||
include 'META-INF/services/**'
|
include 'META-INF/services/**'
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,19 +103,15 @@ task reflectShadowJar(type: ShadowJar) {
|
|||||||
mergeServiceFiles()
|
mergeServiceFiles()
|
||||||
}
|
}
|
||||||
|
|
||||||
createScriptTask(project, "stripMetadata") {
|
task stripMetadata {
|
||||||
dependsOn reflectShadowJar
|
dependsOn reflectShadowJar
|
||||||
def inputJar = reflectShadowJar.archivePath
|
def inputJar = reflectShadowJar.archivePath
|
||||||
def outputJar = "${libsDir}/kotlin-reflect-stripped.jar"
|
def outputJar = new File("${libsDir}/kotlin-reflect-stripped.jar")
|
||||||
inputs.file(inputJar)
|
inputs.file(inputJar)
|
||||||
outputs.file(outputJar)
|
outputs.file(outputJar)
|
||||||
args += [
|
doLast {
|
||||||
"${rootDir}/generators/infrastructure/strip-kotlin-annotations.kts",
|
StripMetadataKt.stripMetadata(logger, "kotlin/reflect/jvm/internal/impl/.*", inputJar, outputJar)
|
||||||
"kotlin/Metadata",
|
}
|
||||||
"kotlin/reflect/jvm/internal/impl/.*",
|
|
||||||
inputJar,
|
|
||||||
outputJar
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def mainArchiveName = "${archivesBaseName}-${project.version}.jar"
|
def mainArchiveName = "${archivesBaseName}-${project.version}.jar"
|
||||||
|
|||||||
Reference in New Issue
Block a user