X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=build.gradle;h=23326433529b8e8309b6a7a87397806e9fecf288;hb=829eaee2c94fddaf65647191646b291d66f7ad0a;hp=ec8267ad048050d47d98c4ebbc7cadceeef30779;hpb=c6153fe9672b467fe579dfc4e8b7a827586d2d36;p=jalview.git diff --git a/build.gradle b/build.gradle index ec8267a..2332643 100644 --- a/build.gradle +++ b/build.gradle @@ -1,16 +1,22 @@ import org.apache.tools.ant.filters.ReplaceTokens +//import org.apache.tools.ant.filters.ReplaceRegexp import org.gradle.internal.os.OperatingSystem +import org.gradle.plugins.ide.eclipse.model.* +import groovy.transform.ExternalizeMethods + buildscript { dependencies { - //classpath files("$gradlePluginsDir/gradle-macappbundle-2.3.0-patched-2.3.0.jar") + classpath 'org.openclover:clover:4.3.1' + classpath 'org.apache.commons:commons-compress:1.18' } } plugins { id 'java' id 'application' + id 'eclipse' id 'com.github.johnrengelman.shadow' version '4.0.3' id 'com.install4j.gradle' version '7.0.9' } @@ -18,31 +24,232 @@ plugins { repositories { jcenter() mavenCentral() + mavenLocal() flatDir { dirs gradlePluginsDir } } mainClassName = launcherClass +def cloverInstrDir = file("$buildDir/$cloverSourcesInstrDir") +def classes = "$jalviewDir/$classesDir" + +if (clover.equals("true")) { + use_clover = true + classes = "$buildDir/$cloverClassesDir" +} else { + use_clover = false + classes = "$jalviewDir/$classesDir" +} + +// configure classpath/args for j8/j11 compilation + +def jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath() +def libDir +def libDistDir +def compile_source_compatibility +def compile_target_compatibility + +ext { + getdownWebsiteDir = jalviewDir + '/' + getdown_website_dir + '/' + JAVA_VERSION + getdownDir = "" + reportRsyncCmd = false + buildDist = true + buildProperties = buildPropertiesFile + switch (CHANNEL) { + + case "BUILD": + // TODO: get bamboo build artifact URL for getdown artifacts + getdown_app_dir = getdown_app_dir_alt + buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile + break + + case "RELEASE": + getdown_channel_name = CHANNEL.toLowerCase() + getdownDir = getdown_channel_name + "/" + JAVA_VERSION + getdown_app_base = getdown_channel_base + "/" + getdownDir + getdown_app_dir = getdown_app_dir_release + buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile + reportRsyncCommand = true + break + + case "ARCHIVE": + getdown_channel_name = CHANNEL.toLowerCase()+"/"+JALVIEW_VERSION + getdownDir = getdown_channel_name + "/" + JAVA_VERSION + getdown_app_base = getdown_channel_base + "/" + getdownDir + getdown_app_dir = getdown_app_dir_alt + if (!file(ARCHIVEDIR+"/"+packageDir).exists()) { + print "Must provide an ARCHIVEDIR value to produce an archive distribution" + exit + } else { + packageDir = ARCHIVEDIR + "/" + packageDir + buildProperties = ARCHIVEDIR +"/" + classesDir + "/" + buildPropertiesFile + buildDist = false + } + reportRsyncCommand = true + break + + case "ARCHIVELOCAL": + getdown_channel_name = "archive" + "/" + JALVIEW_VERSION + getdownDir = getdown_channel_name + "/" + JAVA_VERSION + getdown_app_base = file(getdownWebsiteDir).toURI().toString() + getdown_app_dir = getdown_app_dir_alt + if (!file(ARCHIVEDIR+"/"+packageDir).exists()) { + print "Must provide an ARCHIVEDIR value to produce an archive distribution" + exit + } else { + packageDir = ARCHIVEDIR + "/" + packageDir + buildProperties = ARCHIVEDIR +"/" + classesDir + "/" + buildPropertiesFile + buildDist = false + } + reportRsyncCommand = true + break + + case "DEVELOP": + getdown_channel_name = CHANNEL.toLowerCase() + getdownDir = getdown_channel_name + "/" + JAVA_VERSION + getdown_app_base = getdown_channel_base + "/" + getdownDir + getdown_app_dir = getdown_app_dir_alt + buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile + reportRsyncCommand = true + break + + case "TEST-RELEASE": + getdown_channel_name = CHANNEL.toLowerCase() + getdownDir = getdown_channel_name + "/" + JAVA_VERSION + getdown_app_base = getdown_channel_base + "/" + getdownDir + getdown_app_dir = getdown_app_dir_alt + buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile + reportRsyncCommand = true + break + + case ~/^SCRATCH(|-[-\w]*)$/: + getdown_channel_name = CHANNEL + getdownDir = getdown_channel_name + "/" + JAVA_VERSION + getdown_app_base = getdown_channel_base + "/" + getdownDir + getdown_app_dir = getdown_app_dir_alt + buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile + reportRsyncCommand = true + break + + case "LOCAL": + getdown_app_base = file(getdownWebsiteDir).toURI().toString() + getdown_app_dir = getdown_app_dir_alt + buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile + break + + default: // something wrong specified + print("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]") + exit + break + + } + + println("Using a "+CHANNEL+" profile. appbase="+getdown_app_base) + getdownAppDir = getdownWebsiteDir + '/' + getdown_app_dir + //getdownJ11libDir = getdownWebsiteDir + '/' + getdown_j11lib_dir + getdownResourceDir = getdownWebsiteDir + '/' + getdown_resource_dir + getdownInstallDir = getdownWebsiteDir + '/' + getdown_install_dir + getdownLauncher = jalviewDir + '/' + getdown_launcher + getdownFilesDir = jalviewDir + '/' + getdown_files_dir + '/' + JAVA_VERSION + '/' + getdownFilesInstallDir = getdownFilesDir+"/"+getdown_install_dir + /* compile without modules -- using classpath libraries + modules_compileClasspath = fileTree(dir: "$jalviewDir/$j11modDir", include: ["*.jar"]) + modules_runtimeClasspath = modules_compileClasspath + */ + gitHash = "" + gitBranch = "" +} + +def JAVA_INTEGER_VERSION +def additional_compiler_args = [] +// these are getdown.txt properties defined dependent on the JAVA_VERSION +def getdown_alt_java_min_version +def getdown_alt_java_max_version +// this property is assigned below and expanded to multiple lines in the getdown task +def getdown_alt_multi_java_location +// this property is for the Java library used in eclipse +def eclipse_java_runtime_name +if (JAVA_VERSION.equals("1.8")) { + JAVA_INTEGER_VERSION = "8" + //libDir = j8libDir + libDir = j11libDir + libDistDir = j8libDir + compile_source_compatibility = 1.8 + compile_target_compatibility = 1.8 + getdown_alt_java_min_version = getdown_alt_java8_min_version + getdown_alt_java_max_version = getdown_alt_java8_max_version + getdown_alt_multi_java_location = getdown_alt_java8_txt_multi_java_location + eclipse_java_runtime_name = "JavaSE-1.8" +} else if (JAVA_VERSION.equals("11")) { + JAVA_INTEGER_VERSION = "11" + libDir = j11libDir + libDistDir = j11libDir + compile_source_compatibility = 11 + compile_target_compatibility = 11 + getdown_alt_java_min_version = getdown_alt_java11_min_version + getdown_alt_java_max_version = getdown_alt_java11_max_version + getdown_alt_multi_java_location = getdown_alt_java11_txt_multi_java_location + eclipse_java_runtime_name = "JavaSE-11" + /* compile without modules -- using classpath libraries + additional_compiler_args += [ + '--module-path', ext.modules_compileClasspath.asPath, + '--add-modules', j11modules + ] + */ +} else if (JAVA_VERSION.equals("12") || JAVA_VERSION.equals("13")) { + JAVA_INTEGER_VERSION = JAVA_VERSION + libDir = j11libDir + libDistDir = j11libDir + compile_source_compatibility = JAVA_VERSION + compile_target_compatibility = JAVA_VERSION + getdown_alt_java_min_version = getdown_alt_java11_min_version + getdown_alt_java_max_version = getdown_alt_java11_max_version + getdown_alt_multi_java_location = getdown_alt_java11_txt_multi_java_location + eclipse_java_runtime_name = "JavaSE-11" + /* compile without modules -- using classpath libraries + additional_compiler_args += [ + '--module-path', ext.modules_compileClasspath.asPath, + '--add-modules', j11modules + ] + */ +} else { + throw new GradleException("JAVA_VERSION=$JAVA_VERSION not currently supported by Jalview") +} sourceSets { main { java { srcDirs "$jalviewDir/$sourceDir" - outputDir = file("$jalviewDir/$classesDir") + outputDir = file("$classes") } resources { srcDirs "$jalviewDir/$resourceDir" - srcDirs "$jalviewDir/$libDir" } jar.destinationDir = file("$jalviewDir/$packageDir") compileClasspath = files(sourceSets.main.java.outputDir) compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"]) - //compileClasspath += fileTree(dir: "$jalviewDir/$j11libDir", include: ["*.jar"]) + + runtimeClasspath = compileClasspath + } + clover { + java { + srcDirs = [ cloverInstrDir ] + outputDir = file("${buildDir}/${cloverClassesDir}") + } + + resources { + srcDirs = sourceSets.main.resources.srcDirs + } + compileClasspath = configurations.cloverRuntime + files( sourceSets.clover.java.outputDir ) + compileClasspath += files(sourceSets.main.java.outputDir) + compileClasspath += sourceSets.main.compileClasspath + compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]) + compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"]) runtimeClasspath = compileClasspath } @@ -57,126 +264,403 @@ sourceSets { srcDirs = sourceSets.main.resources.srcDirs } - compileClasspath = sourceSets.main.compileClasspath - compileClasspath += files( sourceSets.test.java.outputDir ) + compileClasspath = files( sourceSets.test.java.outputDir ) + + if (use_clover) { + compileClasspath += sourceSets.clover.compileClasspath + } else { + compileClasspath += files(sourceSets.main.java.outputDir) + } + compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]) + compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"]) runtimeClasspath = compileClasspath } +} - modules { - compileClasspath = fileTree(dir: "$jalviewDir/$j11libDir", include: ["*.jar"]) +// clover bits +dependencies { + if (use_clover) { + cloverCompile 'org.openclover:clover:4.3.1' + testCompile 'org.openclover:clover:4.3.1' + } +} - runtimeClasspath = compileClasspath +configurations { + cloverRuntime + cloverRuntime.extendsFrom cloverCompile +} + +eclipse { + project { + name = "Jalview with gradle build" + + natures 'org.eclipse.jdt.core.javanature', + 'org.eclipse.jdt.groovy.core.groovyNature', + 'org.eclipse.buildship.core.gradleprojectnature' + + buildCommand 'org.eclipse.jdt.core.javabuilder' + buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder' + } + + classpath { + //defaultOutputDir = sourceSets.main.java.outputDir + def removeThese = [] + configurations.each{ if (it.isCanBeResolved()) { + removeThese += it + } + } + + minusConfigurations += removeThese + plusConfigurations = [ ] + file { + + whenMerged { cp -> + def removeTheseToo = [] + HashMap addedSrcPath = new HashMap<>(); + cp.entries.each { entry -> + if (entry.kind == 'src') { + if (addedSrcPath.getAt(entry.path) || !(entry.path == "src" || entry.path == "test")) { + removeTheseToo += entry + } else { + addedSrcPath.putAt(entry.path, true) + } + } + } + cp.entries.removeAll(removeTheseToo) + + print ("CP="+cp.inspect()) + + cp.entries += new Output("bin/main") + cp.entries += new Library(fileReference(helpParentDir)) + cp.entries += new Library(fileReference(resourceDir)) + + HashMap addedLibPath = new HashMap<>(); + + // changing from sourcesets.main.classpath to specific Java version lib + //sourceSets.main.compileClasspath.each{ + fileTree("$jalviewDir/$libDistDir").include("**/*.jar").include("*.jar").each { + //don't want to add outputDir as eclipse is using its own output dir in bin/main + if (it.isDirectory() || ! it.exists()) { + // don't add dirs to classpath + return + } + def itPath = it.toString() + if (itPath.startsWith(jalviewDirAbsolutePath+"/")) { + itPath = itPath.substring(jalviewDirAbsolutePath.length()+1) + } + if (addedLibPath.get(itPath)) { + //println("Not adding duplicate entry "+itPath) + } else { + //println("Adding entry "+itPath) + cp.entries += new Library(fileReference(itPath)) + addedLibPath.put(itPath, true) + } + } + + // changing from sourcesets.main.classpath to specific Java version lib + //sourceSets.test.compileClasspath.each{ + fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]).each { + //if ((it.isDirectory() || ! it.exists()) && ! (it.equals(sourceSets.main.java.outputDir))) { + //no longer want to add outputDir as eclipse is using its own output dir in bin/main + if (it.isDirectory() || ! it.exists()) { + // don't add dirs to classpath + return false // groovy "break" in .each loop + } + def itPath = it.toString() + if (itPath.startsWith(jalviewDirAbsolutePath+"/")) { + itPath = itPath.substring(jalviewDirAbsolutePath.length()+1) + } + if (addedLibPath.get(itPath)) { + // don't duplicate + } else { + def lib = new Library(fileReference(itPath)) + // this doesn't work... yet. Adding test=true attribute using withXml below + //def attrs = new Node(null, 'attributes', ["test":"true"]) + //lib.appendNode(attrs) // + cp.entries += lib + addedLibPath.put(itPath, true) + } + } + } + + // withXml changes ignored by buildship, these add the "test=true" attribute + withXml { + def node = it.asNode() + + def srcTestAttributes + node.children().each{ cpe -> + def attributes = cpe.attributes() + if (attributes.get("kind") == "src" && attributes.get("path") == "test") { + srcTestAttributes = cpe.find { a -> a.name() == "attributes" } + return + } + } + def addTestAttribute = true + srcTestAttributes.each{a -> + if (a.name() == "attribute" && a.attributes().getAt("name") == "test") { + addTestAttribute = false + } + } + if (addTestAttribute) { + srcTestAttributes.append(new Node(null, "attribute", [name:"test", value:"true"])) + } + + node.children().each{ cpe -> + def attributes = cpe.attributes() + if (attributes.get("kind") == "lib" && attributes.get("path").startsWith("utils/")) { + cpe.appendNode('attributes') + .appendNode('attribute', [name:"test", value:"true"]) + } + } + } // withXML + } // file + + containers 'org.eclipse.buildship.core.gradleclasspathcontainer' + } // classpath + + jdt { + // for the IDE, use java 11 compatibility + sourceCompatibility = compile_source_compatibility + targetCompatibility = compile_target_compatibility + javaRuntimeName = eclipse_java_runtime_name + + file { + withProperties { props -> + def jalview_prefs = new Properties() + def ins = new FileInputStream(jalviewDirAbsolutePath+"/"+eclipse_extra_jdt_prefs_file) + jalview_prefs.load(ins) + ins.close() + jalview_prefs.forEach { t, v -> + if (props.getAt(t) == null) { + props.putAt(t, v) + } + } + } + } } + //synchronizationTasks eclipseClasspath + //autoBuildTasks eclipseClasspath } -compileJava { +task cloverInstr() { + // only instrument source, we build test classes as normal + inputs.files files (sourceSets.main.allJava) // , fileTree(dir:"$jalviewDir/$testSourceDir", include: ["**/*.java"])) + outputs.dir cloverInstrDir doFirst { - if (JAVA_VERSION.equals("1.8")) { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 - } else if (JAVA_VERSION.equals("11")) { - sourceCompatibility = 11 - targetCompatibility = 11 - - options.compilerArgs = [ - '--module-path', sourceSets.modules.compileClasspath.asPath, - '--add-modules', j11modules - ] + delete cloverInstrDir + def argsList = ["--initstring", "${buildDir}/clover/clover.db", + "-d", "${buildDir}/${cloverSourcesInstrDir}"] + argsList.addAll(inputs.files.files.collect({ file -> + file.absolutePath + })) + String[] args = argsList.toArray() + println("About to instrument "+args.length +" files") + com.atlassian.clover.CloverInstr.mainImpl(args) + } +} + + +task cloverReport { + group = "Verification" + description = "Createst the Clover report" + inputs.dir "${buildDir}/clover" + outputs.dir "${reportsDir}/clover" + onlyIf { + file("${buildDir}/clover/clover.db").exists() } + doFirst { + def argsList = ["--initstring", "${buildDir}/clover/clover.db", + "-o", "${reportsDir}/clover"] + String[] args = argsList.toArray() + com.atlassian.clover.reporters.html.HtmlReporter.runReport(args) + + // and generate ${reportsDir}/clover/clover.xml + args = ["--initstring", "${buildDir}/clover/clover.db", + "-o", "${reportsDir}/clover/clover.xml"].toArray() + com.atlassian.clover.reporters.xml.XMLReporter.runReport(args) + } +} + +// end clover bits + + +compileJava { + + doFirst { + sourceCompatibility = compile_source_compatibility + targetCompatibility = compile_target_compatibility + options.compilerArgs = additional_compiler_args + print ("Setting target compatibility to "+targetCompatibility+"\n") } } +compileTestJava { + if (use_clover) { + dependsOn compileCloverJava + classpath += configurations.cloverRuntime + } else { + classpath += sourceSets.main.runtimeClasspath + } + doFirst { + sourceCompatibility = compile_source_compatibility + targetCompatibility = compile_target_compatibility + options.compilerArgs = additional_compiler_args + print ("Setting target compatibility to "+targetCompatibility+"\n") + } +} + + +compileCloverJava { + + doFirst { + sourceCompatibility = compile_source_compatibility + targetCompatibility = compile_target_compatibility + options.compilerArgs += additional_compiler_args + print ("Setting target compatibility to "+targetCompatibility+"\n") + } + classpath += configurations.cloverRuntime +} + clean { delete sourceSets.main.java.outputDir } cleanTest { delete sourceSets.test.java.outputDir + delete cloverInstrDir } +// format is a string like date.format("dd MMMM yyyy") def getDate(format) { def date = new Date() - //return date.format("dd MMMM yyyy") return date.format(format) } -def getGitHash() { - def stdout = new ByteArrayOutputStream() +task setGitVals { + def hashStdOut = new ByteArrayOutputStream() exec { commandLine "git", "rev-parse", "--short", "HEAD" - standardOutput = stdout - workingDir = jalviewDir + standardOutput = hashStdOut + ignoreExitValue true } - return stdout.toString().trim() -} -def getGitBranch() { - def stdout = new ByteArrayOutputStream() + def branchStdOut = new ByteArrayOutputStream() exec { commandLine "git", "rev-parse", "--abbrev-ref", "HEAD" - standardOutput = stdout - workingDir = jalviewDir + standardOutput = branchStdOut + ignoreExitValue true } - return stdout.toString().trim() + + project.ext.gitHash = hashStdOut.toString().trim() + project.ext.gitBranch = branchStdOut.toString().trim() + + outputs.upToDateWhen { false } } task createBuildProperties(type: WriteProperties) { + dependsOn setGitVals inputs.dir("$jalviewDir/$sourceDir") + inputs.dir("$classes") inputs.dir("$jalviewDir/$resourceDir") - outputFile "$jalviewDir/$classesDir/$buildPropertiesFile" - /* taking time/date specific comment out to allow better incremental builds */ - //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss") - comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd") - property "BUILD_DATE", getDate("dd MMMM yyyy") + outputFile (buildProperties) + // taking time specific comment out to allow better incremental builds + comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss") + //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd") + property "BUILD_DATE", getDate("HH:mm:ss dd MMMM yyyy") property "VERSION", JALVIEW_VERSION - property "INSTALLATION", INSTALLATION+" git-commit:"+getGitHash()+" ["+getGitBranch()+"]" + property "INSTALLATION", INSTALLATION+" git-commit:"+project.ext.gitHash+" ["+project.ext.gitBranch+"]" outputs.file(outputFile) - outputs.dir("$jalviewDir/$classesDir") +} + +def buildingHTML = "$jalviewDir/$docDir/building.html" +task deleteBuildingHTML(type: Delete) { + delete buildingHTML +} + +task convertBuildingMD(type: Exec) { + dependsOn deleteBuildingHTML + def buildingMD = "$jalviewDir/$docDir/building.md" + def css = "$jalviewDir/$docDir/github.css" + + def pandoc = null + pandoc_exec.split(",").each { + if (file(it.trim()).exists()) { + pandoc = it.trim() + return true + } + } + + def hostname = "hostname".execute().text.trim() + if ((pandoc == null || ! file(pandoc).exists()) && hostname.equals("jv-bamboo")) { + pandoc = System.getProperty("user.home")+"/buildtools/pandoc/bin/pandoc" + } + + doFirst { + if (pandoc != null && file(pandoc).exists()) { + commandLine pandoc, '-s', '-o', buildingHTML, '--metadata', 'pagetitle="Building Jalview from Source"', '--toc', '-H', css, buildingMD + } else { + println("Cannot find pandoc. Skipping convert building.md to HTML") + throw new StopExecutionException() + } + } + + ignoreExitValue true + + inputs.file(buildingMD) + inputs.file(css) + outputs.file(buildingHTML) +} +clean { + delete buildingHTML } task syncDocs(type: Sync) { - def syncDir = "$jalviewDir/$classesDir/$docDir" + dependsOn convertBuildingMD + def syncDir = "$classes/$docDir" from fileTree("$jalviewDir/$docDir") into syncDir } -def helpFile = "$jalviewDir/$classesDir/$helpDir/help.jhm" -task syncHelp(type: Sync) { - inputs.files("$jalviewDir/$helpDir") - outputs.files(helpFile) - - def syncDir = "$jalviewDir/$classesDir/$helpDir" - from fileTree("$jalviewDir/$helpDir") - into syncDir -} +def helpFile = "$classes/$helpDir/help.jhm" task copyHelp(type: Copy) { - def inputDir = "$jalviewDir/$helpDir" - def outputDir = "$jalviewDir/$classesDir/$helpDir" - from inputDir + def inputDir = "$jalviewDir/$helpParentDir/$helpDir" + def outputDir = "$classes/$helpDir" + from(inputDir) { + exclude '**/*.gif' + exclude '**/*.jpg' + exclude '**/*.png' + filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': JALVIEW_VERSION]) + } + from(inputDir) { + include '**/*.gif' + include '**/*.jpg' + include '**/*.png' + } into outputDir - filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': "USING_FILTER"]) + inputs.dir(inputDir) outputs.files(helpFile) outputs.dir(outputDir) } task syncLib(type: Sync) { - def syncDir = "$jalviewDir/$classesDir/$libDir" - from fileTree("$jalviewDir/$libDir") + def syncDir = "$classes/$libDistDir" + from fileTree("$jalviewDir/$libDistDir") into syncDir } task syncResources(type: Sync) { from "$jalviewDir/$resourceDir" include "**/*.*" - into "$jalviewDir/$classesDir" + exclude "install4j" + into "$classes" preserve { include "**" } @@ -188,28 +672,44 @@ task prepare { dependsOn copyHelp } + //testReportDirName = "test-reports" // note that test workingDir will be $jalviewDir test { dependsOn prepare dependsOn compileJava - useTestNG { + if (use_clover) { + dependsOn cloverInstr + } + + if (use_clover) { + print("Running tests " + (use_clover?"WITH":"WITHOUT") + " clover [clover="+use_clover+"]\n") + } + + useTestNG() { includeGroups testngGroups + preserveOrder true + useDefaultListeners=true } + workingDir = jalviewDir //systemProperties 'clover.jar' System.properties.clover.jar + sourceCompatibility = compile_source_compatibility + targetCompatibility = compile_target_compatibility + jvmArgs += additional_compiler_args + print ("Setting target compatibility to "+targetCompatibility+"\n") } task buildIndices(type: JavaExec) { dependsOn copyHelp classpath = sourceSets.main.compileClasspath main = "com.sun.java.help.search.Indexer" - workingDir = "$jalviewDir/$classesDir/$helpDir" + workingDir = "$classes/$helpDir" def argDir = "html" args = [ argDir ] inputs.dir("$workingDir/$argDir") - outputs.dir("$jalviewDir/$classesDir/doc") - outputs.dir("$jalviewDir/$classesDir/help") + outputs.dir("$classes/doc") + outputs.dir("$classes/help") outputs.file("$workingDir/JavaHelpSearch/DOCS") outputs.file("$workingDir/JavaHelpSearch/DOCS.TAB") outputs.file("$workingDir/JavaHelpSearch/OFFSETS") @@ -224,24 +724,35 @@ task compileLinkCheck(type: JavaCompile) { destinationDir = file("$jalviewDir/$utilsDir") source = fileTree(dir: "$jalviewDir/$utilsDir", include: ["HelpLinksChecker.java", "BufferedLineReader.java"]) + inputs.file("$jalviewDir/$utilsDir/HelpLinksChecker.java") + inputs.file("$jalviewDir/$utilsDir/HelpLinksChecker.java") outputs.file("$jalviewDir/$utilsDir/HelpLinksChecker.class") outputs.file("$jalviewDir/$utilsDir/BufferedLineReader.class") } +def helplinkscheckertouchfile = file("$jalviewDir/$utilsDir/HelpLinksChecker.touch") task linkCheck(type: JavaExec) { dependsOn prepare, compileLinkCheck classpath = files("$jalviewDir/$utilsDir") main = "HelpLinksChecker" - workingDir = "$jalviewDir" - args = [ "$classesDir/$helpDir", "-nointernet" ] + workingDir = jalviewDir + def help = "$classes/$helpDir" + args = [ "$classes/$helpDir", "-nointernet" ] - doFirst { - standardOutput new FileOutputStream("$jalviewDir/$utilsDir/HelpLinksChecker.out") + doLast { + helplinkscheckertouchfile.createNewFile() } - outputs.file("$jalviewDir/$utilsDir/HelpLinksChecker.out") + inputs.dir("$classes/$helpDir") + outputs.file(helplinkscheckertouchfile) } +// import the pubhtmlhelp target +ant.properties.basedir = "$jalviewDir" +ant.properties.helpBuildDir = jalviewDirAbsolutePath+"/$classes/$helpDir" +ant.importBuild "$utilsDir/publishHelp.xml" + + task cleanPackageDir(type: Delete) { delete fileTree("$jalviewDir/$packageDir").include("*.jar") } @@ -267,18 +778,18 @@ jar { exclude "**/*.jar" exclude "**/*.jar.*" - inputs.dir("$jalviewDir/$classesDir") + inputs.dir("$classes") outputs.file("$jalviewDir/$packageDir/$archiveName") } task copyJars(type: Copy) { - from fileTree("$jalviewDir/$classesDir").include("**/*.jar").include("*.jar").files + from fileTree("$classes").include("**/*.jar").include("*.jar").files into "$jalviewDir/$packageDir" } // doing a Sync instead of Copy as Copy doesn't deal with "outputs" very well task syncJars(type: Sync) { - from fileTree("$jalviewDir/$libDir").include("**/*.jar").include("*.jar").files + from fileTree("$jalviewDir/$libDistDir").include("**/*.jar").include("*.jar").files into "$jalviewDir/$packageDir" preserve { include jar.archiveName @@ -286,6 +797,8 @@ task syncJars(type: Sync) { } task makeDist { + group = "build" + description = "Put all required libraries in dist" // order of "cleanPackageDir", "copyJars", "jar" important! jar.mustRunAfter cleanPackageDir syncJars.mustRunAfter cleanPackageDir @@ -302,62 +815,88 @@ task cleanDist { } shadowJar { - dependsOn makeDist - if (JAVA_VERSION.equals("11")) { - from ("$jalviewDir/$j11libDir") { - include("*.jar") - } + group = "distribution" + if (buildDist) { + dependsOn makeDist + } + from ("$jalviewDir/$libDistDir") { + include("*.jar") + } + manifest { + attributes 'Implementation-Version': JALVIEW_VERSION } mainClassName = shadowJarMainClass mergeServiceFiles() - classifier = "all" + classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION minimize() } -ext { - getdownWebsiteDir = jalviewDir + '/' + getdown_website_dir - getdownAppDir = getdownWebsiteDir + '/' + getdown_app_dir - getdownJ11libDir = getdownWebsiteDir + '/' + getdown_j11lib_dir - getdownResourceDir = getdownWebsiteDir + '/' + getdown_resource_dir - getdownLauncher = jalviewDir + '/' + getdown_launcher - getdownFilesDir = jalviewDir + '/' + getdown_files_dir -} - task getdownWebsite() { - dependsOn makeDist + group = "distribution" + description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer" + if (buildDist) { + dependsOn makeDist + } + + // clean the getdown website and files dir before creating getdown folders + delete project.ext.getdownWebsiteDir + delete project.ext.getdownFilesDir + def getdownWebsiteResourceFilenames = [] def getdownTextString = "" def getdownResourceDir = project.ext.getdownResourceDir def getdownAppDir = project.ext.getdownAppDir def getdownResourceFilenames = [] + doFirst { + copy { + from buildProperties + rename(buildPropertiesFile, getdown_build_properties) + into project.ext.getdownAppDir + } + getdownWebsiteResourceFilenames += getdown_app_dir+"/"+getdown_build_properties + // go through properties looking for getdown_txt_... def props = project.properties.sort { it.key } - if (JAVA_VERSION.equals("11")) { - props.put("getdown_txt_java_min_version", getdown_alt_java11_min_version) - } else { - props.put("getdown_txt_java_min_version", getdown_alt_java8_min_version) - } + if (getdown_alt_java_min_version.length() > 0) { + props.put("getdown_txt_java_min_version", getdown_alt_java_min_version) + } + if (getdown_alt_java_max_version.length() > 0) { + props.put("getdown_txt_java_max_version", getdown_alt_java_max_version) + } + props.put("getdown_txt_multi_java_location", getdown_alt_multi_java_location) + + props.put("getdown_txt_appbase", getdown_app_base) props.each{ prop, val -> if (prop.startsWith("getdown_txt_") && val != null) { - // file values rationalised - if (val.indexOf('/') > -1) { - def r = null - if (val.indexOf('/') == 0) { - // absolute path - r = file(val) - } else if (val.indexOf('/') > 0) { - // relative path (relative to jalviewDir) - r = file( jalviewDir + '/' + val ) + if (prop.startsWith("getdown_txt_multi_")) { + def key = prop.substring(18) + val.split(",").each{ v -> + def line = key + " = " + v + "\n" + getdownTextString += line } - if (r.exists()) { - val = getdown_resource_dir + '/' + r.getName() - getdownWebsiteResourceFilenames += val - getdownResourceFilenames += r.getPath() + } else { + // file values rationalised + if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) { + def r = null + if (val.indexOf('/') == 0) { + // absolute path + r = file(val) + } else if (val.indexOf('/') > 0) { + // relative path (relative to jalviewDir) + r = file( jalviewDir + '/' + val ) + } + if (r.exists()) { + val = getdown_resource_dir + '/' + r.getName() + getdownWebsiteResourceFilenames += val + getdownResourceFilenames += r.getPath() + } + } + if (! prop.startsWith("getdown_txt_resource")) { + def line = prop.substring(12) + " = " + val + "\n" + getdownTextString += line } } - def line = prop.substring(12) + " = " + val + "\n" - getdownTextString += line } } @@ -372,7 +911,7 @@ task getdownWebsite() { } def codeFiles = [] - makeDist.outputs.files.each{ f -> + fileTree(file(packageDir)).each{ f -> if (f.isDirectory()) { def files = fileTree(dir: f, include: ["*"]).getFiles() codeFiles += files @@ -389,27 +928,36 @@ task getdownWebsite() { } } + // NOT USING MODULES YET, EVERYTHING SHOULD BE IN dist + /* if (JAVA_VERSION.equals("11")) { - def j11libFiles = fileTree(dir: "$jalviewDir/$j11libDir", include: ["*.jar"]).getFiles() - j11libFiles.sort().each{f -> - def line = "code = " + getdown_j11lib_dir + '/' + f.getName() + "\n" - getdownTextString += line - copy { - from f.getPath() - into project.ext.getdownJ11libDir - } - } + def j11libFiles = fileTree(dir: "$jalviewDir/$j11libDir", include: ["*.jar"]).getFiles() + j11libFiles.sort().each{f -> + def line = "code = " + getdown_j11lib_dir + '/' + f.getName() + "\n" + getdownTextString += line + copy { + from f.getPath() + into project.ext.getdownJ11libDir + } + } } + */ - getdownTextString += "code = " + file(getdownLauncher).getName() + "\n" + // getdown-launcher.jar should not be in main application class path so the main application can move it when updated. Listed as a resource so it gets updated. + //getdownTextString += "class = " + file(getdownLauncher).getName() + "\n" + getdownTextString += "resource = " + getdown_launcher_new + "\n" getdownTextString += "class = " + mainClass + "\n" def getdown_txt = file(project.ext.getdownWebsiteDir + "/getdown.txt") getdown_txt.write(getdownTextString) + def launch_jvl = file(project.ext.getdownWebsiteDir + "/" + getdown_launch_jvl) + launch_jvl.write("appbase="+props.get("getdown_txt_appbase")) + copy { - from getdown_txt - into project.ext.getdownFilesDir + from getdownLauncher + rename(file(getdownLauncher).getName(), getdown_launcher_new) + into project.ext.getdownWebsiteDir } copy { @@ -417,36 +965,72 @@ task getdownWebsite() { into project.ext.getdownWebsiteDir } + if (! (CHANNEL.startsWith("ARCHIVE") || CHANNEL.startsWith("DEVELOP"))) { + copy { + from getdown_txt + from getdownLauncher + from getdownWebsiteDir+"/"+getdown_build_properties + into getdownInstallDir + } + + copy { + from getdownInstallDir + into getdownFilesInstallDir + } + } + copy { + from getdown_txt + from launch_jvl from getdownLauncher - into project.ext.getdownFilesDir + from getdownWebsiteDir+"/"+getdown_build_properties + into getdownFilesDir } copy { - from jalviewDir + '/' + project.getProperty('getdown_txt_ui.background_image') - from jalviewDir + '/' + project.getProperty('getdown_txt_ui.error_background') - from jalviewDir + '/' + project.getProperty('getdown_txt_ui.progress_image') - from jalviewDir + '/' + project.getProperty('getdown_txt_ui.icon') - from jalviewDir + '/' + project.getProperty('getdown_txt_ui.mac_dock_icon') - into project.ext.getdownFilesDir + '/' + getdown_resource_dir + from getdownResourceDir + into project.ext.getdownFilesDir + '/' + getdown_resource_dir } } - inputs.dir(jalviewDir + '/' + packageDir) + if (buildDist) { + inputs.dir(jalviewDir + '/' + packageDir) + } outputs.dir(project.ext.getdownWebsiteDir) outputs.dir(project.ext.getdownFilesDir) } task getdownDigest(type: JavaExec) { + group = "distribution" + description = "Digest the getdown website folder" dependsOn getdownWebsite - classpath = files(jalviewDir + '/' + getdown_core) + classpath = files(jalviewDir + '/' + getdown_core, jalviewDir+'/'+getdown_launcher) main = "com.threerings.getdown.tools.Digester" args project.ext.getdownWebsiteDir + inputs.dir(project.ext.getdownWebsiteDir) outputs.file(project.ext.getdownWebsiteDir + '/' + "digest2.txt") } task getdown() { + group = "distribution" + description = "Create the minimal and full getdown app folder for installers and website and create digest file" dependsOn getdownDigest + doLast { + if (reportRsyncCommand) { + def fromDir = getdownWebsiteDir + (getdownWebsiteDir.endsWith("/")?"":"/") + def toDir = getdown_rsync_dest + "/" + getdownDir + (getdownDir.endsWith("/")?"":"/") + println "LIKELY RSYNC COMMAND:" + println "mkdir -p '$toDir'\nrsync -avh --delete '$fromDir' '$toDir'" + if (RUNRSYNC == "true") { + exec { + commandLine "mkdir", "-p", toDir + } + exec { + commandLine "rsync", "-avh", "--delete", fromDir, toDir + } + } + } + } } clean { @@ -468,14 +1052,172 @@ install4j { install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j" } installDir = file(install4jHomeDir) + mediaTypes = Arrays.asList(install4jMediaTypes.split(",")) + if (install4jFaster.equals("true")) { + faster = true + } +} + +def install4jConf +def macosJavaVMDir +def macosJavaVMTgz +def windowsJavaVMDir +def windowsJavaVMTgz +def install4jDir = "$jalviewDir/$install4jResourceDir" +def install4jConfFile = "jalview-installers-java"+JAVA_VERSION+".install4j" +install4jConf = "$install4jDir/$install4jConfFile" + +task copyInstall4jTemplate(type: Copy) { + macosJavaVMDir = System.env.HOME+"/buildtools/jre/openjdk-java_vm/getdown/macos-jre"+JAVA_VERSION+"/jre" + macosJavaVMTgz = System.env.HOME+"/buildtools/jre/openjdk-java_vm/install4j/tgz/macos-jre"+JAVA_VERSION+".tar.gz" + windowsJavaVMDir = System.env.HOME+"/buildtools/jre/openjdk-java_vm/getdown/windows-jre"+JAVA_VERSION+"/jre" + windowsJavaVMTgz = System.env.HOME+"/buildtools/jre/openjdk-java_vm/install4j/tgz/windows-jre"+JAVA_VERSION+".tar.gz" + from (install4jDir) { + include install4jTemplate + rename (install4jTemplate, install4jConfFile) + filter(ReplaceTokens, beginToken: '', endToken: '', tokens: ['9999999999': JAVA_VERSION]) + filter(ReplaceTokens, beginToken: '$$', endToken: '$$', + tokens: [ + 'JAVA_VERSION': JAVA_VERSION, + 'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION, + 'VERSION': JALVIEW_VERSION, + 'MACOS_JAVA_VM_DIR': macosJavaVMDir, + 'MACOS_JAVA_VM_TGZ': macosJavaVMTgz, + 'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir, + 'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz, + 'INSTALL4JINFOPLISTFILEASSOCIATIONS': install4jInfoPlistFileAssociations, + 'COPYRIGHT_MESSAGE': install4jCopyrightMessage, + 'MACOS_BUNDLE_ID': install4jMacOSBundleId, + 'GETDOWN_RESOURCE_DIR': getdown_resource_dir, + 'GETDOWN_DIST_DIR': getdown_app_dir, + 'GETDOWN_ALT_DIR': getdown_app_dir_alt, + 'GETDOWN_INSTALL_DIR': getdown_install_dir + ] + ) + if (OSX_KEYPASS=="") { + filter(ReplaceTokens, beginToken: 'codeSigning macEnabled="', endToken: '"', tokens: ['true':'codeSigning macEnabled="false"']) + filter(ReplaceTokens, beginToken: 'runPostProcessor="true" ',endToken: 'Processor', tokens: ['post':'runPostProcessor="false" postProcessor']) + } + } + into install4jDir + outputs.files(install4jConf) + + doLast { + // include file associations in installer + def installerFileAssociationsXml = file("$install4jDir/$install4jInstallerFileAssociations").text + ant.replaceregexp( + byline: false, + flags: "s", + match: '', + replace: installerFileAssociationsXml, + file: install4jConf + ) + /* + // include uninstaller applescript app files in dmg + def installerDMGUninstallerXml = file("$install4jDir/$install4jDMGUninstallerAppFiles").text + ant.replaceregexp( + byline: false, + flags: "s", + match: '', + replace: installerDMGUninstallerXml, + file: install4jConf + ) + */ + } } task installers(type: com.install4j.gradle.Install4jTask) { + group = "distribution" + description = "Create the install4j installers" dependsOn getdown - projectFile = "$jalviewDir/$install4jResourceDir/$install4jConf" - variables = [majorVersion: version.substring(2, 11), build: 001] - destination = "$jalviewDir/$install4jBuildDir" + dependsOn copyInstall4jTemplate + projectFile = file(install4jConf) + println("Using projectFile "+projectFile) + variables = [majorVersion: version.substring(2, 11), build: 001, OSX_KEYSTORE: OSX_KEYSTORE, JSIGN_SH: JSIGN_SH] + destination = "$jalviewDir/$install4jBuildDir/$JAVA_VERSION" buildSelected = true + + if (OSX_KEYPASS) { + macKeystorePassword=OSX_KEYPASS + + } + inputs.dir(project.ext.getdownWebsiteDir) - outputs.dir("$jalviewDir/$install4jBuildDir") + inputs.file(install4jConf) + inputs.dir(macosJavaVMDir) + inputs.dir(windowsJavaVMDir) + outputs.dir("$jalviewDir/$install4jBuildDir/$JAVA_VERSION") + +} + +clean { + delete install4jConf +} + +task sourceDist (type: Tar) { + + def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_") + archiveFileName = project.name + "_" + VERSION_UNDERSCORES + ".tar.gz" + + compression Compression.GZIP + + from jalviewDir + into project.name + + + exclude (".*") + exclude ("**/.*") + exclude ("*.class") + exclude ("**/*.class") + include (eclipse_extra_jdt_prefs_file) + include ("AUTHORS") + include ("CITATION") + include ("FEATURETODO") + include ("JAVA-11-README") + include ("FEATURETODO") + include ("LICENSE") + include ("README") + include ("RELEASE") + include ("THIRDPARTYLIBS") + include ("build.gradle") + include ("gradle.properties") + include ("$sourceDir/*.java") + include ("$sourceDir/**/*.java") + include ("$sourceDir/**/*.cdr") + include ("$j8libDir/**/*.jar") + include ("$j11libDir/**/*.jar") + include ("$resourceDir/**/*") + include ("$helpDir/**/*") + include ("$schemaDir/**/*") + include ("$utilsDir/**/*") + include ("$docDir/**/*") + include ("$examplesDir/**/*") + include ("getdown/**/*") + //include ("jalview-jalopy.xml") + //include ("JalviewApplet.jpx") + //include ("JalviewX.jpx") + //include ("nbbuild.xml") + //include ("nbproject/genfiles.properties") + //include ("nbproject/project.properties") + //include ("nbproject/project.xml") + + exclude ("appletlib") + exclude ("**/*locales") + exclude ("*locales/**") + exclude ("utils/InstallAnywhere") + exclude (libDir) + exclude (getdown_files_dir) + exclude (getdown_website_dir) + + // exluding these as not using jars as modules yet + exclude ("$j11modDir/**/*.jar") + +} + +task helppages { + dependsOn copyHelp + dependsOn pubhtmlhelp + + inputs.dir("$classes/$helpDir") + outputs.file("build/distribution/help/helpTOC.html") }