apply plugin: "java" sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { mavenCentral() } dependencies { testImplementation "junit:junit:4.12" } sourceSets { annotations { java.srcDirs = ["src/annotations"] java.outputDir = file("${buildDir}/annotations") } main { java.srcDirs = ["src/main"] java.outputDir = file("${buildDir}/main") compileClasspath += sourceSets.annotations.output } examples { java.srcDirs = ["src/examples"] java.outputDir = file("${buildDir}/examples") compileClasspath += sourceSets.main.output } classes { java.srcDirs = ["src/classes"] java.outputDir = file("${buildDir}/classes") compileClasspath += sourceSets.main.output + sourceSets.annotations.output } peers { java.srcDirs = ["src/peers"] java.outputDir = file("${buildDir}/peers") compileClasspath += sourceSets.main.output + sourceSets.annotations.output } test { java.srcDirs = ["src/tests"] java.outputDir = file("${buildDir}/tests") compileClasspath += sourceSets.annotations.output + sourceSets.classes.output + sourceSets.peers.output runtimeClasspath += compileClasspath } } clean { group = "JPF Build" } task generateVersion { description = "Generates the .version file with the current revision hash" group = "JPF Build Properties" doLast { def revision = "git rev-parse HEAD".execute().text new File(".version").withWriter("utf-8") { writer -> writer.writeLine revision } } } task buildInfo { group = "JPF Build Properties" description = "Creates build info properties." doLast { // Must fail if there are uncommitted changes def status = "git status --short".execute().text.trim() if (!status.isEmpty()) { throw new GradleException("There are uncomitted changes:\n " + status) } Properties info = new Properties() def revision = "git rev-parse --short HEAD".execute().text.trim() def userName = ["git", "log", "-1", "--format=%an <%ae>"].execute().text.trim() def date = "git log -1 --format=%ci".execute().text.trim() info.setProperty("revision", revision) info.setProperty("date", date) info.setProperty("author", userName) info.setProperty("os.arch", System.getProperty("os.arch")) info.setProperty("os.name", System.getProperty("os.name")) info.setProperty("user.country", System.getProperty("user.country")) info.setProperty("java.version", System.getProperty("java.version")) def writer = new File("build.properties").newWriter("utf-8") info.store(writer, "JPF core build info") writer.close() } } task compile(type: Copy) { group = "JPF Build" description = "Compiles all JPF core sources." // These are automatic generated tasks from the Java Gradle Plugin. // Gradle is able to infer the ordering of the source sets // due to the compileClasspath attribute dependsOn compileTestJava, compileExamplesJava, generateVersion // Copies build.properties file to the build directory from "build.properties" into sourceSets.main.java.outputDir.path + "/gov/nasa/jpf" // Copies .version file to the build directory from ".version" into sourceSets.main.java.outputDir.path + "/gov/nasa/jpf" } task srcDist(type: Zip) { group = "JPF Build" description = "Builds the source distribution" baseName = project.name version = "git rev-parse --short HEAD".execute().text.trim() classifier = "src" extension = "zip" destinationDir = buildDir includeEmptyDirs = false from projectDir include "build.gradle" include "settings.gradle" include "gradlew" include "gradlew.bat" include "gradle/**/*" include "nbproject/**/*" include "eclipse/**/*" include "src/**/*" include "bin/**/*" include "jpf.properties" include "build.properties" include "LICENSE-2.0.txt" include "README.md" } task dist(type: Zip) { group = "JPF Build" description = "Builds binary distribution" baseName = project.name version = "git rev-parse --short HEAD".execute().text.trim() extension = "zip" destinationDir = buildDir includeEmptyDirs = false from projectDir include "jpf.properties" include "build.properties" include "bin/**/*" include "lib/**/*" include "${buildDir.name}/**/*.jar" } task jpfClassesJar(type: Jar) { archiveName = "jpf-classes.jar" destinationDir = file("${buildDir}") description = "Creates the ${archiveName} file." group = "JPF Jars" dependsOn compile from sourceSets.classes.java.outputDir from sourceSets.annotations.java.outputDir from(sourceSets.main.java.outputDir) { include "gov/nasa/jpf/JPFShell.class" include "gov/nasa/jpf/vm/Verify.class" include "gov/nasa/jpf/util/TypeRef.class" include "gov/nasa/jpf/util/test/TestJPF.class" include "gov/nasa/jpf/util/test/TestMultiProcessJPF.class" include "gov/nasa/jpf/util/test/TestJPFHelper.class" } } task jpfJar(type: Jar) { archiveName = "jpf.jar" destinationDir = file("${buildDir}") description = "Creates the ${archiveName} file." group = "JPF Jars" dependsOn compile from sourceSets.main.java.outputDir from sourceSets.peers.java.outputDir from sourceSets.annotations.java.outputDir from(sourceSets.classes.java.outputDir) { include "org/junit/*.class" } manifest { attributes( "Built-By": System.getProperty("user.name"), "Implementation-Vendor": "NASA Ames Research Center", "Implementation-Title": "Java Pathfinder core system", "Implementation-Version": "1234" //FIXME ) } } task annotationsJar(type: Jar) { archiveName = "jpf-annotations.jar" destinationDir = file("${buildDir}") description = "Creates the ${archiveName} file." group = "JPF Jars" dependsOn compile from sourceSets.annotations.java.outputDir } task classloaderSpecificTestsJar(type: Jar) { archiveName = "classloader_specific_tests.jar" destinationDir = file("${buildDir}") description = "Creates the ${archiveName} file." group = "JPF Jars" dependsOn compile from(sourceSets.test.java.outputDir) { include "classloader_specific_tests/*.class" } } task runJpfJar(type: Jar) { archiveName = "RunJPF.jar" destinationDir = file("${buildDir}") description = "Creates the ${archiveName} file." group = "JPF Jars" dependsOn compile from(sourceSets.main.java.outputDir) { include "gov/nasa/jpf/tool/Run.class" include "gov/nasa/jpf/tool/RunJPF.class" include "gov/nasa/jpf/Config.class" include "gov/nasa/jpf/ConfigChangeListener.class" include "gov/nasa/jpf/Config\$MissingRequiredKeyException.class" include "gov/nasa/jpf/JPFClassLoader.class" include "gov/nasa/jpf/JPFShell.class" include "gov/nasa/jpf/JPFException.class" include "gov/nasa/jpf/JPFConfigException.class" include "gov/nasa/jpf/JPFTargetException.class" include "gov/nasa/jpf/util/JPFSiteUtils.class" include "gov/nasa/jpf/util/FileUtils.class" include "gov/nasa/jpf/util/StringMatcher.class" include "gov/nasa/jpf/util/Pair.class" } manifest { attributes( "Built-By": System.getProperty("user.name"), "Implementation-Vendor": "NASA Ames Research Center", "Implementation-Title": "Java Pathfinder core launch system", "Implementation-Version": "1234", //FIXME "Main-Class": "gov.nasa.jpf.tool.RunJPF" ) } } task runTestJar(type: Jar) { archiveName = "RunTest.jar" destinationDir = file("${buildDir}") description = "Creates the ${archiveName} file." group = "JPF Jars" dependsOn compile from(sourceSets.main.java.outputDir) { include "gov/nasa/jpf/tool/Run.class" include "gov/nasa/jpf/tool/RunTest.class" include "gov/nasa/jpf/tool/RunTest\$Failed.class" include "gov/nasa/jpf/Config.class" include "gov/nasa/jpf/ConfigChangeListener.class" include "gov/nasa/jpf/Config\$MissingRequiredKeyException.class" include "gov/nasa/jpf/JPFClassLoader.class" include "gov/nasa/jpf/JPFException.class" include "gov/nasa/jpf/JPFConfigException.class" include "gov/nasa/jpf/util/JPFSiteUtils.class" include "gov/nasa/jpf/util/FileUtils.class" include "gov/nasa/jpf/util/StringMatcher.class" include "gov/nasa/jpf/util/DevNullPrintStream.class" } manifest { attributes( "Built-By": System.getProperty("user.name"), "Implementation-Vendor": "NASA Ames Research Center", "Implementation-Title": "Java Pathfinder test launch system", "Implementation-Version": "1234", // FIXME "Main-Class": "gov.nasa.jpf.tool.RunTest" ) } } task buildJars { group = "JPF Build" description = "Generates the core JPF jar files." dependsOn classloaderSpecificTestsJar, annotationsJar, jpfClassesJar, jpfJar, runJpfJar, runTestJar } test { group = "JPF Build" description = "Runs core regression tests." dependsOn buildJars enableAssertions = true forkEvery = 1 maxHeapSize = "1024m" include "**/*Test.class" exclude "**/SplitInputStreamTest.class" exclude "**/JPF_*.class" testLogging { events "passed", "skipped", "failed" } afterSuite { testDescriptor, result -> if (!testDescriptor.parent) { println "Test Execution: ${result.resultType}" def summaryFields = ["${result.testCount} tests", "${result.successfulTestCount} passed", "${result.failedTestCount} failed", "${result.skippedTestCount} skipped"] println "Summary: " + summaryFields.join(", ") } } } defaultTasks "buildJars"