build.gradle.kts 4.9 KB
Newer Older
1 2 3 4 5 6

import java.io.File
import proguard.gradle.ProGuardTask
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.api.file.DuplicatesStrategy

7 8
description = "Kotlin Compiler"

9 10 11 12 13 14 15 16 17 18 19
buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath("com.github.jengelman.gradle.plugins:shadow:1.2.3")
        classpath("net.sf.proguard:proguard-gradle:5.3.1")
    }
}

20 21 22
plugins {
    `java-base`
}
23 24 25 26

// Set to false to disable proguard run on kotlin-compiler.jar. Speeds up the build
val shrink = true
val compilerManifestClassPath =
27
        "kotlin-runtime.jar kotlin-reflect.jar kotlin-script-runtime.jar"
28

29 30 31 32 33 34
val fatJarContents by configurations.creating
val fatSourcesJarContents by configurations.creating
val proguardLibraryJars by configurations.creating
val fatJar by configurations.creating
val compilerJar by configurations.creating
val archives by configurations
35

36
val compilerBaseName = name
37 38 39

val outputJar = File(buildDir, "libs", "$compilerBaseName.jar")

40
val jreHome = System.getProperty("java.home")
41

42 43 44 45 46 47 48 49 50 51 52 53 54 55
val compilerModules: Array<String> by rootProject.extra

val packagesToRelocate =
        listOf("com.intellij",
                "com.google",
                "com.sampullara",
                "org.apache",
                "org.jdom",
                "org.picocontainer",
                "jline",
                "gnu",
                "javax.inject",
                "org.fusesource")

56 57 58
val ideaCoreSdkJars: Array<String> by rootProject.extra
val coreSdkJarsSimple = ideaCoreSdkJars.filterNot { it == "jdom" || it == "log4j" }.toTypedArray()

59
fun firstFromJavaHomeThatExists(vararg paths: String): File =
60 61
        paths.mapNotNull { File(jreHome, it).takeIf { it.exists() } }.firstOrNull()
                ?: throw GradleException("Cannot find under '$jreHome' neither of: ${paths.joinToString()}")
62 63 64 65 66 67

compilerModules.forEach { evaluationDependsOn(it) }

val compiledModulesSources = compilerModules.map {
    project(it).the<JavaPluginConvention>().sourceSets.getByName("main").allSource
}
68 69

dependencies {
70 71 72 73 74 75 76 77
    compilerModules.forEach {
        fatJarContents(project(it)) { isTransitive = false }
    }
    compiledModulesSources.forEach {
        fatSourcesJarContents(it)
    }

    fatJarContents(project(":core:builtins", configuration = "builtins"))
78 79
    fatJarContents(ideaSdkCoreDeps(*coreSdkJarsSimple))
    fatJarContents(ideaSdkDeps("jna-platform"))
80 81 82 83 84 85 86 87 88 89 90
    fatJarContents(commonDep("javax.inject"))
    fatJarContents(commonDep("org.jline", "jline"))
    fatJarContents(protobufFull())
    fatJarContents(commonDep("com.github.spullara.cli-parser", "cli-parser"))
    fatJarContents(commonDep("com.google.code.findbugs", "jsr305"))
    fatJarContents(commonDep("io.javaslang", "javaslang"))
    fatJarContents(preloadedDeps("json-org"))

    proguardLibraryJars(files(firstFromJavaHomeThatExists("lib/rt.jar", "../Classes/classes.jar"),
            firstFromJavaHomeThatExists("lib/jsse.jar", "../Classes/jsse.jar"),
            firstFromJavaHomeThatExists("../lib/tools.jar", "../Classes/tools.jar")))
91 92 93
    proguardLibraryJars(projectDist(":kotlin-stdlib"))
    proguardLibraryJars(projectDist(":kotlin-script-runtime"))
    proguardLibraryJars(projectDist(":kotlin-reflect"))
94
    proguardLibraryJars(preloadedDeps("kotlinx-coroutines-core"))
95 96
}

97 98
val packCompiler by task<ShadowJar> {
    configurations = listOf(fatJar)
99 100 101
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    destinationDir = File(buildDir, "libs")
    dependsOn(protobufFullTask)
102 103 104

    setupPublicJar("before-proguard", "")
    from(fatJarContents)
105 106 107
    ideaSdkDeps("jps-model.jar", subdir = "jps").forEach { from(it) { exclude("META-INF/services/**") } }
    ideaSdkDeps("oromatcher").forEach { from(it) { exclude("META-INF/jb/** META-INF/LICENSE") } }
    ideaSdkCoreDeps("jdom", "log4j").forEach { from(it) { exclude("META-INF/jb/** META-INF/LICENSE") } }
108 109 110 111 112

    manifest.attributes.put("Class-Path", compilerManifestClassPath)
    manifest.attributes.put("Main-Class", "org.jetbrains.kotlin.cli.jvm.K2JVMCompiler")
}

113 114
val proguard by task<ProGuardTask> {
    dependsOn(packCompiler)
115 116
    configuration("$rootDir/compiler/compiler.pro")

117 118 119
    val outputJar = File(buildDir, "libs", "$compilerBaseName-after-proguard.jar")

    inputs.files(packCompiler.outputs.files.singleFile)
120 121 122 123
    outputs.file(outputJar)

    // TODO: remove after dropping compatibility with ant build
    doFirst {
124
        System.setProperty("kotlin-compiler-jar-before-shrink", packCompiler.outputs.files.singleFile.canonicalPath)
125 126 127
        System.setProperty("kotlin-compiler-jar", outputJar.canonicalPath)
    }

128
    libraryjars(proguardLibraryJars)
129 130 131
    printconfiguration("$buildDir/compiler.pro.dump")
}

132 133 134
dist(targetName = compilerBaseName + ".jar",
     fromTask = if (shrink) proguard
                else packCompiler)
135

136 137
runtimeJarArtifactBy(proguard, proguard.outputs.files.singleFile) {
    name = compilerBaseName
138 139
    classifier = ""
}
140 141 142 143
sourcesJar {
    from(fatSourcesJarContents)
}
javadocJar()
144

145
publish()