aboutsummaryrefslogtreecommitdiffstats
path: root/build.gradle
diff options
context:
space:
mode:
Diffstat (limited to 'build.gradle')
-rw-r--r--build.gradle223
1 files changed, 223 insertions, 0 deletions
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 00000000..12bd408a
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,223 @@
+// Global settings
+project.ext {
+ // Source JRE used for compilation, etc
+ if (!project.hasProperty('jre')) {
+ jre = System.getProperty('java.home')
+ }
+ os = Os.current()
+ arch = Arch.current()
+
+ if (!project.hasProperty('targetJre')) {
+ targetJre = jre
+ }
+}
+
+def targetJreFile = file(targetJre)
+def jreFile = file(jre)
+
+// HotSpot itself
+project('hotspot') {
+ task clean(type: InvokeMake) {
+ args 'clean'
+ }
+
+ task prepareJvm {
+ onlyIf { jreFile != targetJreFile }
+ doLast {
+ ant.copy(todir: targetJreFile) {
+ fileset(dir: jreFile)
+ }
+ ant.chmod(file: new File(targetJreFile, 'bin/java'), perm: '0755')
+ }
+ }
+
+ task clone(description: 'Clone HotSpot repository') {
+ onlyIf { !file('hotspot').exists() }
+ doLast {
+ exec {
+ workingDir '..'
+ executable 'hg'
+ args 'clone', hotspotRepository
+ }
+ }
+ }
+
+ task patch(description: 'Patch HotSpot sources', dependsOn: clone) << {
+ exec {
+ executable 'hg'
+ args 'pull'
+ }
+ exec {
+ executable 'hg'
+ args 'update', '-C', '-r', hotspotTag
+ }
+ new ByteArrayOutputStream().withStream { os ->
+ exec {
+ workingDir 'hotspot'
+ executable 'hg'
+ args 'status'
+ standardOutput os
+ }
+ def str = os.toString()
+ def matcher = str =~ /(?m)^\?\s+(.*)$/
+ matcher.each {
+ ant.delete(file: new File(file('hotspot'), it[1]))
+ }
+ }
+ ant.patch(patchfile: "../patches/dcevm-${hotspotTag}.patch", strip: 1)
+ }
+
+ task compileFastdebug(type: InvokeMake) {
+ args 'STRIP_POLICY=no_strip'
+ args 'ZIP_DEBUGINFO_FILES=0'
+ args 'ENABLE_FULL_DEBUG_SYMBOLS=1'
+ args 'fastdebug'
+ }
+
+ task compileProduct(type: InvokeMake) {
+ args 'ENABLE_FULL_DEBUG_SYMBOLS=0'
+ args 'product'
+ }
+
+ compileFastdebug.mustRunAfter patch
+ compileProduct.mustRunAfter patch
+
+ // Install given kind of DCEVM into destination JRE
+ ['Product', 'Fastdebug'].each { k ->
+ task("install${k}", dependsOn: [prepareJvm, "compile${k}"]) << {
+ def installPath = new File(new File(targetJreFile, arch == Arch.X86 ? os.installPath32 : os.installPath64), jvmName)
+
+ logger.info("Installing DCEVM runtime into JRE with JVM name '${jvmName}' and kind '${k.toLowerCase()}' at ${installPath}")
+ ant.copy(todir: installPath, overwrite: true) {
+ fileset(dir: "build/${os.buildPath}/${os.buildPath}_${arch.buildArch}_${compiler}/${k.toLowerCase()}",
+ includes: 'libjvm.so,libjsig.so,jvm.dll,jsig.dll,libjvm.dylib,libjsig.dylib')
+ }
+ }
+ }
+}
+
+// Java projects for testing DCEVM
+def setup(prjs, closure) {
+ prjs.each { prj ->
+ project(prj, closure)
+ }
+}
+
+setup(['agent', 'framework', 'tests-java7', 'tests-java8'], {
+ apply plugin: 'java'
+ apply plugin: 'idea'
+
+ repositories {
+ mavenCentral()
+ }
+})
+
+project('agent') {
+ jar {
+ manifest {
+ from "src/main/java/META-INF/MANIFEST.MF"
+ }
+ }
+}
+
+project('framework') {
+ dependencies {
+ compile project(':agent')
+ compile group: 'asm', name: 'asm-all', version: '3.3.+'
+ compile files(System.getProperty("java.home") + '/../lib/tools.jar')
+ }
+}
+
+project('tests-java8') {
+ sourceCompatibility = 1.8
+ targetCompatibility = 1.8
+}
+
+setup(['tests-java7', 'tests-java8'], {
+ dependencies {
+ compile project(':framework')
+ testCompile group: 'junit', name: 'junit', version: '4.11'
+ }
+
+ test {
+ executable new File(targetJreFile, 'bin/java')
+
+ jvmArgs "-XXaltjvm=${jvmName}"
+ jvmArgs '-javaagent:../agent/build/libs/agent.jar'
+ if (arch == Arch.X86_64) {
+ jvmArgs(project.oops == "compressed" ? '-XX:+UseCompressedOops' : "-XX:-UseCompressedOops")
+ }
+ jvmArgs "-XX:TraceRedefineClasses=${traceRedefinition}"
+
+ ignoreFailures = true
+ outputs.upToDateWhen { false }
+ }
+
+ test.dependsOn project(':hotspot').tasks[kind == 'fastdebug' ? 'installFastdebug' : 'installProduct']
+})
+
+
+enum Arch {
+ X86(["i386", "i486", "i586", "x86"], 'i486', 32),
+ X86_64(["x86_64", "x64", "amd64"], 'amd64', 64)
+
+ final List<String> names
+ final String buildArch
+ final int bits
+
+ Arch(List<String> names, String buildArch, int bits) {
+ this.names = names
+ this.buildArch = buildArch
+ this.bits = bits
+ }
+
+ static Arch find(String token) {
+ Arch res = values().find({ v -> v.names.contains(token) })
+ return res
+ }
+
+ static Arch current() {
+ return find(System.getProperty("os.arch"))
+ }
+}
+
+enum Os {
+ MAC('bsd', 'lib', 'lib'),
+ WINDOWS('windows', 'bin', 'bin'),
+ UNIX('linux', 'lib/i386', 'lib/amd64')
+
+ final String buildPath;
+ final String installPath32;
+ final String installPath64;
+
+ Os(String buildPath, String installPath32, String installPath64) {
+ this.buildPath = buildPath
+ this.installPath32 = installPath32
+ this.installPath64 = installPath64
+ }
+
+ static Os current() {
+ return values().find { os -> org.apache.tools.ant.taskdefs.condition.Os.isFamily(os.name().toLowerCase()) }
+ }
+}
+
+// Helper task to run make targets against hotspot
+class InvokeMake extends org.gradle.api.tasks.Exec {
+ InvokeMake() {
+ logging.captureStandardOutput LogLevel.INFO
+ if (project.rootProject.os != Os.WINDOWS) {
+ commandLine 'make', '-C', 'make'
+ } else {
+ // Using launcher script
+ commandLine 'cmd', '/c', '..\\build.cmd'
+ environment ARCH: project.rootProject.arch == Arch.X86 ? 'x86' : 'x64'
+ }
+ args 'OPENJDK=true'
+ args "HOTSPOT_BUILD_VERSION=dcevmlight-${project.rootProject.buildNumber}"
+ args "ARCH_DATA_MODEL=${project.rootProject.arch.bits}"
+ args "ALT_BOOTDIR=${project.rootProject.jre.replace('\\', '/')}/.."
+ // Replacing backslashes is essential for Windows!
+ args 'COMPILER_WARNINGS_FATAL=false' // Clang is very serious about warnings
+ args 'HOTSPOT_BUILD_JOBS=4'
+ }
+}