apply plugin: 'java'

import org.gradle.internal.os.OperatingSystem

repositories {
    mavenCentral()
}

configurations {
    antClasspath
}

def test_jvm = {
    if (OperatingSystem.current().isMacOsX()) {
        file('../../build/macosx-x86_64-normal-server-release/images/j2sdk-bundle/jdk1.8.0.jdk/Contents/Home/bin/java').absolutePath
    } else if (OperatingSystem.current().isLinux()) {
        file('../../build/linux-x86_64-normal-server-release/images/j2sdk-image/bin/java').absolutePath
    } else {
        file('../../build/windows-x86_64-normal-server-release/images/j2sdk-image/bin/java.exe').absolutePath
    }
}

dependencies {
    antClasspath 'ant-contrib:ant-contrib:20020829', 'org.apache.ant:ant-junit:1.8.1'
    testCompile('junit:junit:4.12'){
        exclude group: 'org.hamcrest'
    }
    testCompile 'org.hamcrest:hamcrest-library:1.3'
}


// add additional jars to the AntBuilder classpath for use within the imported build.
ClassLoader antClassLoader = org.apache.tools.ant.Project.class.classLoader
configurations.antClasspath.each { File f ->
    antClassLoader.addURL(f.toURI().toURL())
}

ant.importBuild('../../jdk/idea/java/tests/perf_tests.xml') { antTargetName ->
    'jdk-perf-' + antTargetName
}

ant.properties.test_jvm = test_jvm()

println ant.properties.test_jvm

if (OperatingSystem.current().isMacOsX())
    sourceSets.main.java.srcDirs =
        ["../../jdk/src/share/classes",
         "../../jdk/src/macosx/classes",
        ]
else if (OperatingSystem.current().isLinux())
    sourceSets.main.java.srcDirs =
        ["../../jdk/src/share/classes",
         "../../jdk/src/solaris/classes"
        ]
else
    sourceSets.main.java.srcDirs =
        ["../../jdk/src/share/classes",
         "../../jdk/src/windows/classes",
        ]

sourceSets.test.java.srcDirs = ["../../jdk/idea/java/tests/src"]

def buildDir = project.buildscript.sourceFile.parentFile.parentFile.parentFile

task make_images << {
    def pb = new ProcessBuilder().command("make", "-C", buildDir.absolutePath,
            " COMPILER_WARNINGS_FATAL=false", "images")
    def proc = pb.redirectErrorStream(true).start()
    proc.inputStream.eachLine {println it}
    assert proc.waitFor() == 0
}

task make_clean << {
    def pb = new ProcessBuilder().command("make", "-C", buildDir.absolutePath,
            " COMPILER_WARNINGS_FATAL=false", "clean")
    def proc = pb.redirectErrorStream(true).start()
    proc.inputStream.eachLine {println it}
    assert proc.waitFor() == 0
}

tasks.compileJava.enabled = false
tasks.compileTestJava.dependsOn.clear()
classes.dependsOn.clear()
classes.dependsOn tasks.make_images, tasks.compileTestJava
tasks.cleanClasses.dependsOn tasks.make_clean
