X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=build.gradle;h=bf27433350f6539d70c9855d8dd801f5e4f7479d;hb=cc9e776268c8713dc69ee6efc09a5f9f4d4ae9cd;hp=e143b8085ce1ae02269a3a5ff04ca01d69db400b;hpb=19cb2eab37ddf738c73a8e5c6eed4e1091e610bf;p=jalview.git diff --git a/build.gradle b/build.gradle index e143b80..bf27433 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,13 @@ 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 org.gradle.plugins.ide.eclipse.model.Output +import org.gradle.plugins.ide.eclipse.model.Library import groovy.transform.ExternalizeMethods buildscript { dependencies { classpath 'org.openclover:clover:4.3.1' - classpath 'org.apache.commons:commons-compress:1.18' } } @@ -30,6 +28,10 @@ repositories { } } +dependencies { + compile 'org.apache.commons:commons-compress:1.18' +} + mainClassName = launcherClass def cloverInstrDir = file("$buildDir/$cloverSourcesInstrDir") def classes = "$jalviewDir/$classesDir" @@ -51,35 +53,142 @@ def compile_source_compatibility def compile_target_compatibility ext { - // where the getdown channel will be built. - // TODO: consider allowing this expression to be overridden by -P arg - getdownWebsiteDir = jalviewDir + '/' + getdown_website_dir + '/' + JAVA_VERSION - getdownAppDir = getdownWebsiteDir + '/' + getdown_app_dir - getdownJ11libDir = getdownWebsiteDir + '/' + getdown_j11lib_dir - getdownResourceDir = getdownWebsiteDir + '/' + getdown_resource_dir - getdownLauncher = jalviewDir + '/' + getdown_launcher - getdownFilesDir = jalviewDir + '/' + getdown_files_dir + '/' + JAVA_VERSION + '/' - getdown_app_base = getdown_channel_base+"/"+getdown_channel_name+"/"+JAVA_VERSION+"/" - modules_compileClasspath = fileTree(dir: "$jalviewDir/$j11modDir", include: ["*.jar"]) + getdownWebsiteDir = "${jalviewDir}/${getdown_website_dir}/${JAVA_VERSION}" + getdownDir = "" + reportRsyncCmd = false + buildDist = true + buildProperties = buildPropertiesFile + getdownLauncher = "${jalviewDir}/${getdown_lib_dir}/${getdown_launcher}" + switch (CHANNEL) { + + case "BUILD": + // TODO: get bamboo build artifact URL for getdown artifacts + getdown_channel_base = bamboo_channelbase + getdown_channel_name = "${bamboo_planKey}/${JAVA_VERSION}" + getdown_app_base = "${bamboo_channelbase}/${bamboo_planKey}${bamboo_getdown_channel_suffix}/${JAVA_VERSION}" + 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 + getdownLauncher = "${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}" + 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}" + getdownLauncher = "${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}" + break + + default: // something wrong specified + print("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]") + exit + break + + } + + getdownAppDir = "${getdownWebsiteDir}/${getdown_app_dir}" + //getdownJ11libDir = "${getdownWebsiteDir}/${getdown_j11lib_dir}" + getdownResourceDir = "${getdownWebsiteDir}/${getdown_resource_dir}" + getdownInstallDir = "${getdownWebsiteDir}/${getdown_install_dir}" + 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 = "" + + println("Using a ${CHANNEL} profile. appbase=${getdown_app_base}") } 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 @@ -87,35 +196,55 @@ if (JAVA_VERSION.equals("1.8")) { 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 + '--module-path', ext.modules_compileClasspath.asPath, + '--add-modules', j11modules ] + */ } else { - throw new GradleException("JAVA_VERSION=$JAVA_VERSION not currently supported by Jalview") + throw new GradleException("JAVA_VERSION=${JAVA_VERSION} not currently supported by Jalview") } sourceSets { main { java { - srcDirs "$jalviewDir/$sourceDir" - outputDir = file("$classes") + srcDirs "${jalviewDir}/${sourceDir}" + outputDir = file("${classes}") } resources { - srcDirs "$jalviewDir/$resourceDir" - srcDirs "$jalviewDir/$libDistDir" + srcDirs "${jalviewDir}/${resourceDir}" } - jar.destinationDir = file("$jalviewDir/$packageDir") + jar.destinationDir = file("${jalviewDir}/${packageDir}") compileClasspath = files(sourceSets.main.java.outputDir) - compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"]) + compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"]) runtimeClasspath = compileClasspath } + clover { java { srcDirs = [ cloverInstrDir ] @@ -128,16 +257,16 @@ sourceSets { 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"]) + compileClasspath += fileTree(dir: "${jalviewDir}/${utilsDir}", include: ["**/*.jar"]) + compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"]) runtimeClasspath = compileClasspath } test { java { - srcDirs "$jalviewDir/$testSourceDir" - outputDir = file("$jalviewDir/$testOutputDir") + srcDirs "${jalviewDir}/${testSourceDir}" + outputDir = file("${jalviewDir}/${testOutputDir}") } resources { @@ -151,10 +280,10 @@ sourceSets { } else { compileClasspath += files(sourceSets.main.java.outputDir) } - //compileClasspath += sourceSets.main.compileClasspath - //compileClasspath += files( sourceSets.main.resources.srcDirs) - compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]) - compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"]) + + compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"]) + compileClasspath += fileTree(dir: "${jalviewDir}/${utilsDir}/testnglibs", include: ["**/*.jar"]) + compileClasspath += fileTree(dir: "${jalviewDir}/${utilsDir}/testlibs", include: ["**/*.jar"]) runtimeClasspath = compileClasspath } @@ -175,11 +304,11 @@ configurations { eclipse { project { - name = "Jalview with gradle build" + name = eclipse_project_name natures 'org.eclipse.jdt.core.javanature', - 'org.eclipse.jdt.groovy.core.groovyNature', - 'org.eclipse.buildship.core.gradleprojectnature' + 'org.eclipse.jdt.groovy.core.groovyNature', + 'org.eclipse.buildship.core.gradleprojectnature' buildCommand 'org.eclipse.jdt.core.javabuilder' buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder' @@ -188,7 +317,8 @@ eclipse { classpath { //defaultOutputDir = sourceSets.main.java.outputDir def removeThese = [] - configurations.each{ if (it.isCanBeResolved()) { + configurations.each{ + if (it.isCanBeResolved()) { removeThese += it } } @@ -199,113 +329,90 @@ eclipse { whenMerged { cp -> def removeTheseToo = [] - HashMap addedSrcPath = new HashMap<>(); + HashMap alreadyAddedSrcPath = new HashMap<>(); cp.entries.each { entry -> if (entry.kind == 'src') { - if (addedSrcPath.getAt(entry.path) || !(entry.path == "src" || entry.path == "test")) { + if (alreadyAddedSrcPath.getAt(entry.path) || !(entry.path == sourceDir || entry.path == testSourceDir)) { removeTheseToo += entry } else { - addedSrcPath.putAt(entry.path, true) + alreadyAddedSrcPath.putAt(entry.path, true) } } } cp.entries.removeAll(removeTheseToo) - - cp.entries += new Output("bin/main") - cp.entries += new Library(fileReference(helpParentDir)) - cp.entries += new Library(fileReference(resourceDir)) - - HashMap addedLibPath = new HashMap<>(); - def allPaths = sourceSets.test.compileClasspath + sourceSets.main.compileClasspath - sourceSets.main.compileClasspath.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 (file("${jalviewDir}/${eclipse_bin_dir}/main").isDirectory()) { + cp.entries += new Output("${eclipse_bin_dir}/main") + } + if (file(helpParentDir).isDirectory()) { + cp.entries += new Library(fileReference(helpParentDir)) + } + if (file(resourceDir).isDirectory()) { + cp.entries += new Library(fileReference(resourceDir)) + } + + HashMap alreadyAddedLibPath = new HashMap<>(); + + sourceSets.main.compileClasspath.findAll { it.name.endsWith(".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+"/")) { + if (itPath.startsWith("${jalviewDirAbsolutePath}/")) { + // make relative path itPath = itPath.substring(jalviewDirAbsolutePath.length()+1) } - if (addedLibPath.get(itPath)) { + if (alreadyAddedLibPath.get(itPath)) { //println("Not adding duplicate entry "+itPath) } else { //println("Adding entry "+itPath) cp.entries += new Library(fileReference(itPath)) - addedLibPath.put(itPath, true) + alreadyAddedLibPath.put(itPath, true) } } - sourceSets.test.compileClasspath.each{ - //if ((it.isDirectory() || ! it.exists()) && ! (it.equals(sourceSets.main.java.outputDir))) { + //fileTree(dir: "$jalviewDir/$utilsDir", include: ["test*/*.jar"]).each { + sourceSets.test.compileClasspath.findAll { it.name.endsWith(".jar") }.each { //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 + return false // groovy "break" in .each closure } def itPath = it.toString() - if (itPath.startsWith(jalviewDirAbsolutePath+"/")) { + if (itPath.startsWith("${jalviewDirAbsolutePath}/")) { itPath = itPath.substring(jalviewDirAbsolutePath.length()+1) } - if (addedLibPath.get(itPath)) { + if (alreadyAddedLibPath.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) // + lib.entryAttributes["test"] = "true" 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 + alreadyAddedLibPath.put(itPath, true) } } - 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 + } // whenMerged + } // file containers 'org.eclipse.buildship.core.gradleclasspathcontainer' + } // classpath jdt { // for the IDE, use java 11 compatibility - sourceCompatibility = 11 - targetCompatibility = 11 - javaRuntimeName = "JavaSE-11" + sourceCompatibility = compile_source_compatibility + targetCompatibility = compile_target_compatibility + javaRuntimeName = eclipse_java_runtime_name + // add in jalview project specific properties/preferences into eclipse core preferences file { withProperties { props -> def jalview_prefs = new Properties() - def ins = new FileInputStream(jalviewDirAbsolutePath+"/"+eclipse_extra_jdt_prefs_file) + def ins = new FileInputStream("${jalviewDirAbsolutePath}/${eclipse_extra_jdt_prefs_file}") jalview_prefs.load(ins) ins.close() jalview_prefs.forEach { t, v -> @@ -315,11 +422,10 @@ eclipse { } } } - } - - //synchronizationTasks eclipseClasspath - //autoBuildTasks eclipseClasspath -} + + } // jdt + +} task cloverInstr() { // only instrument source, we build test classes as normal @@ -329,7 +435,7 @@ task cloverInstr() { doFirst { delete cloverInstrDir def argsList = ["--initstring", "${buildDir}/clover/clover.db", - "-d", "${buildDir}/${cloverSourcesInstrDir}"] + "-d", "${buildDir}/${cloverSourcesInstrDir}"] argsList.addAll(inputs.files.files.collect({ file -> file.absolutePath })) @@ -338,25 +444,25 @@ task cloverInstr() { 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() - } + 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"] + "-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() + "-o", "${reportsDir}/clover/clover.xml"].toArray() com.atlassian.clover.reporters.xml.XMLReporter.runReport(args) } } @@ -403,80 +509,130 @@ compileCloverJava { } clean { - delete sourceSets.main.java.outputDir + doFirst { + delete sourceSets.main.java.outputDir + } } cleanTest { - delete sourceSets.test.java.outputDir - delete cloverInstrDir + doFirst { + 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) } -task setGitHash(type: Exec) { - workingDir = jalviewDir - commandLine "git", "rev-parse", "--short", "HEAD" - standardOutput = new ByteArrayOutputStream() - project.ext.gitHash = { - return standardOutput.toString().trim() +task setGitVals { + def hashStdOut = new ByteArrayOutputStream() + exec { + commandLine "git", "rev-parse", "--short", "HEAD" + standardOutput = hashStdOut + ignoreExitValue true } -} -task setGitBranch(type: Exec) { - workingDir = jalviewDir - commandLine "git", "rev-parse", "--abbrev-ref", "HEAD" - standardOutput = new ByteArrayOutputStream() - project.ext.gitBranch = { - return standardOutput.toString().trim() + def branchStdOut = new ByteArrayOutputStream() + exec { + commandLine "git", "rev-parse", "--abbrev-ref", "HEAD" + standardOutput = branchStdOut + ignoreExitValue true } -} -task setGitVals { - dependsOn setGitHash - dependsOn setGitBranch + 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("$jalviewDir/$resourceDir") - outputFile "$classes/$buildPropertiesFile" + inputs.dir("${jalviewDir}/${sourceDir}") + inputs.dir("${classes}") + inputs.dir("${jalviewDir}/${resourceDir}") + 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("dd MMMM yyyy") + 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:"+project.ext.gitHash+" ["+project.ext.gitBranch+"]" outputs.file(outputFile) - outputs.dir("$classes") +} + +def buildingHTML = "${jalviewDir}/${docDir}/building.html" +task cleanBuildingHTML(type: Delete) { + doFirst { + delete buildingHTML + } +} + +task convertBuildingMD(type: Exec) { + dependsOn cleanBuildingHTML + 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 { + doFirst { + delete buildingHTML + } } task syncDocs(type: Sync) { - def syncDir = "$classes/$docDir" - from fileTree("$jalviewDir/$docDir") + dependsOn convertBuildingMD + def syncDir = "${classes}/${docDir}" + from fileTree("${jalviewDir}/${docDir}") into syncDir } -def helpFile = "$classes/$helpDir/help.jhm" +def helpFile = "${classes}/${helpDir}/help.jhm" task copyHelp(type: Copy) { - def inputDir = "$jalviewDir/$helpParentDir/$helpDir" - def outputDir = "$classes/$helpDir" + 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]) + exclude '**/*.jpg' + exclude '**/*.png' + filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': JALVIEW_VERSION,'Year-Rel': getDate("yyyy")]) } from(inputDir) { include '**/*.gif' - include '**/*.jpg' - include '**/*.png' + include '**/*.jpg' + include '**/*.png' } into outputDir @@ -486,16 +642,16 @@ task copyHelp(type: Copy) { } task syncLib(type: Sync) { - def syncDir = "$classes/$libDistDir" - from fileTree("$jalviewDir/$libDistDir") + def syncDir = "${classes}/${libDistDir}" + from fileTree("${jalviewDir}/${libDistDir}") into syncDir } task syncResources(type: Sync) { - from "$jalviewDir/$resourceDir" + from "${jalviewDir}/${resourceDir}" include "**/*.*" exclude "install4j" - into "$classes" + into "${classes}" preserve { include "**" } @@ -516,7 +672,9 @@ test { dependsOn cloverInstr } - print("Running tests " + (use_clover?"WITH":"WITHOUT") + " clover [clover="+use_clover+"]\n") + if (use_clover) { + print("Running tests " + (use_clover?"WITH":"WITHOUT") + " clover [clover="+use_clover+"]\n") + } useTestNG() { includeGroups testngGroups @@ -529,59 +687,67 @@ test { 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 = "$classes/$helpDir" + workingDir = "${classes}/${helpDir}" def argDir = "html" args = [ argDir ] - inputs.dir("$workingDir/$argDir") - - outputs.dir("$classes/doc") - outputs.dir("$classes/help") - outputs.file("$workingDir/JavaHelpSearch/DOCS") - outputs.file("$workingDir/JavaHelpSearch/DOCS.TAB") - outputs.file("$workingDir/JavaHelpSearch/OFFSETS") - outputs.file("$workingDir/JavaHelpSearch/POSITIONS") - outputs.file("$workingDir/JavaHelpSearch/SCHEMA") - outputs.file("$workingDir/JavaHelpSearch/TMAP") + inputs.dir("${workingDir}/${argDir}") + + outputs.dir("${classes}/doc") + outputs.dir("${classes}/help") + outputs.file("${workingDir}/JavaHelpSearch/DOCS") + outputs.file("${workingDir}/JavaHelpSearch/DOCS.TAB") + outputs.file("${workingDir}/JavaHelpSearch/OFFSETS") + outputs.file("${workingDir}/JavaHelpSearch/POSITIONS") + outputs.file("${workingDir}/JavaHelpSearch/SCHEMA") + outputs.file("${workingDir}/JavaHelpSearch/TMAP") } task compileLinkCheck(type: JavaCompile) { options.fork = true - classpath = files("$jalviewDir/$utilsDir") - 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") + classpath = files("${jalviewDir}/${utilsDir}") + 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 helplinkscheckeroutputfile = file("$jalviewDir/$utilsDir/HelpLinksChecker.out") +def helplinkscheckertouchfile = file("${jalviewDir}/${utilsDir}/HelpLinksChecker.touch") task linkCheck(type: JavaExec) { dependsOn prepare, compileLinkCheck - classpath = files("$jalviewDir/$utilsDir") + classpath = files("${jalviewDir}/${utilsDir}") main = "HelpLinksChecker" workingDir = jalviewDir - def help = "$classes/$helpDir" - args = [ "$classes/$helpDir", "-nointernet" ] + def help = "${classes}/${helpDir}" + args = [ "${classes}/${helpDir}", "-nointernet" ] - doFirst { - helplinkscheckeroutputfile.createNewFile() - standardOutput new FileOutputStream(helplinkscheckeroutputfile, false) + doLast { + helplinkscheckertouchfile.createNewFile() } - outputs.file(helplinkscheckeroutputfile) + 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") + doFirst { + delete fileTree(dir: "${jalviewDir}/${packageDir}", include: "*.jar") + } } jar { @@ -596,7 +762,7 @@ jar { "Codebase": application_codebase } - destinationDir = file("$jalviewDir/$packageDir") + destinationDir = file("${jalviewDir}/${packageDir}") archiveName = rootProject.name+".jar" exclude "cache*/**" @@ -605,19 +771,19 @@ jar { exclude "**/*.jar" exclude "**/*.jar.*" - inputs.dir("$classes") - outputs.file("$jalviewDir/$packageDir/$archiveName") + inputs.dir("${classes}") + outputs.file("${jalviewDir}/${packageDir}/${archiveName}") } task copyJars(type: Copy) { - from fileTree("$classes").include("**/*.jar").include("*.jar").files - into "$jalviewDir/$packageDir" + from fileTree(dir: "${classes}", 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/$libDistDir").include("**/*.jar").include("*.jar").files - into "$jalviewDir/$packageDir" + from fileTree(dir: "${jalviewDir}/${libDistDir}", include: "**/*.jar").files + into "${jalviewDir}/${packageDir}" preserve { include jar.archiveName } @@ -632,7 +798,7 @@ task makeDist { dependsOn cleanPackageDir dependsOn syncJars dependsOn jar - outputs.dir("$jalviewDir/$packageDir") + outputs.dir("${jalviewDir}/${packageDir}") } task cleanDist { @@ -643,68 +809,92 @@ task cleanDist { shadowJar { group = "distribution" - dependsOn makeDist - from ("$jalviewDir/$libDistDir") { + if (buildDist) { + dependsOn makeDist + } + from ("${jalviewDir}/${libDistDir}") { include("*.jar") } + manifest { + attributes 'Implementation-Version': JALVIEW_VERSION + } mainClassName = shadowJarMainClass mergeServiceFiles() - classifier = "all-"+JAVA_VERSION + classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION minimize() } task getdownWebsite() { 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" - dependsOn makeDist + if (buildDist) { + dependsOn makeDist + } + def getdownWebsiteResourceFilenames = [] def getdownTextString = "" def getdownResourceDir = project.ext.getdownResourceDir def getdownAppDir = project.ext.getdownAppDir def getdownResourceFilenames = [] + doFirst { + // clean the getdown website and files dir before creating getdown folders + delete project.ext.getdownWebsiteDir + delete project.ext.getdownFilesDir + + 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 } - props.put("getdown_txt_java_min_version", getdown_alt_java_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) - if (getdown_local == "true") { - getdown_app_base = file(getdownWebsiteDir).toURI().toString() - } props.put("getdown_txt_appbase", getdown_app_base) props.each{ prop, val -> if (prop.startsWith("getdown_txt_") && val != null) { if (prop.startsWith("getdown_txt_multi_")) { def key = prop.substring(18) val.split(",").each{ v -> - def line = key + " = " + v + "\n" + def line = "${key} = ${v}\n" getdownTextString += line } } else { // file values rationalised - if (val.indexOf('/') > -1) { + 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 ) + r = file( "${jalviewDir}/${val}" ) } if (r.exists()) { - val = getdown_resource_dir + '/' + r.getName() + val = "${getdown_resource_dir}/" + r.getName() getdownWebsiteResourceFilenames += val getdownResourceFilenames += r.getPath() } } - def line = prop.substring(12) + " = " + val + "\n" - getdownTextString += line + if (! prop.startsWith("getdown_txt_resource")) { + def line = prop.substring(12) + " = ${val}\n" + getdownTextString += line + } } } } getdownWebsiteResourceFilenames.each{ filename -> - getdownTextString += "resource = "+filename+"\n" + getdownTextString += "resource = ${filename}\n" } getdownResourceFilenames.each{ filename -> copy { @@ -714,7 +904,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 @@ -723,7 +913,8 @@ task getdownWebsite() { } } codeFiles.sort().each{f -> - def line = "code = " + getdown_app_dir + '/' + f.getName() + "\n" + def name = f.getName() + def line = "code = ${getdown_app_dir}/${name}\n" getdownTextString += line copy { from f.getPath() @@ -733,53 +924,82 @@ 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 - } - } - } + if (JAVA_VERSION.equals("11")) { + def j11libFiles = fileTree(dir: "${jalviewDir}/${j11libDir}", include: ["*.jar"]).getFiles() + j11libFiles.sort().each{f -> + def name = f.getName() + def line = "code = ${getdown_j11lib_dir}/${name}\n" + getdownTextString += line + copy { + from f.getPath() + into project.ext.getdownJ11libDir + } + } + } */ // 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 = " + file(getdownLauncher).getName() + "\n" - getdownTextString += "class = " + mainClass + "\n" + getdownTextString += "resource = ${getdown_launcher_new}\n" + getdownTextString += "class = ${mainClass}\n" - def getdown_txt = file(project.ext.getdownWebsiteDir + "/getdown.txt") + 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 { from getdownLauncher - into project.ext.getdownFilesDir + if (file(getdownLauncher).getName() != getdown_launcher) { + rename(file(getdownLauncher).getName(), getdown_launcher) + } + into project.ext.getdownWebsiteDir + } + + if (! (CHANNEL.startsWith("ARCHIVE") || CHANNEL.startsWith("DEVELOP"))) { + copy { + from getdown_txt + from getdownLauncher + from "${getdownWebsiteDir}/${getdown_build_properties}" + if (file(getdownLauncher).getName() != getdown_launcher) { + rename(file(getdownLauncher).getName(), getdown_launcher) + } + into getdownInstallDir + } + + copy { + from getdownInstallDir + into getdownFilesInstallDir + } } copy { + from getdown_txt + from launch_jvl from getdownLauncher - into project.ext.getdownWebsiteDir + from "${getdownWebsiteDir}/${getdown_build_properties}" + if (file(getdownLauncher).getName() != getdown_launcher) { + rename(file(getdownLauncher).getName(), getdown_launcher) + } + 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) } @@ -788,22 +1008,42 @@ task getdownDigest(type: JavaExec) { group = "distribution" description = "Digest the getdown website folder" dependsOn getdownWebsite - classpath = files(jalviewDir + '/' + getdown_core, jalviewDir+'/'+getdown_launcher) + doFirst { + classpath = files("${getdownWebsiteDir}/${getdown_launcher}") + } main = "com.threerings.getdown.tools.Digester" args project.ext.getdownWebsiteDir inputs.dir(project.ext.getdownWebsiteDir) - outputs.file(project.ext.getdownWebsiteDir + '/' + "digest2.txt") + 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 { - delete project.ext.getdownWebsiteDir - delete project.ext.getdownFilesDir + doFirst { + delete project.ext.getdownWebsiteDir + delete project.ext.getdownFilesDir + } } install4j { @@ -831,32 +1071,36 @@ def macosJavaVMDir def macosJavaVMTgz def windowsJavaVMDir def windowsJavaVMTgz -def install4jDir = "$jalviewDir/$install4jResourceDir" -def install4jConfFile = "jalview-installers-java"+JAVA_VERSION+".install4j" -install4jConf = "$install4jDir/$install4jConfFile" +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" + 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 - ] + 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"']) @@ -868,7 +1112,7 @@ task copyInstall4jTemplate(type: Copy) { doLast { // include file associations in installer - def installerFileAssociationsXml = file("$install4jDir/$install4jInstallerFileAssociations").text + def installerFileAssociationsXml = file("${install4jDir}/${install4jInstallerFileAssociations}").text ant.replaceregexp( byline: false, flags: "s", @@ -880,13 +1124,13 @@ task copyInstall4jTemplate(type: Copy) { // include uninstaller applescript app files in dmg def installerDMGUninstallerXml = file("$install4jDir/$install4jDMGUninstallerAppFiles").text ant.replaceregexp( - byline: false, - flags: "s", - match: '', - replace: installerDMGUninstallerXml, - file: install4jConf + byline: false, + flags: "s", + match: '', + replace: installerDMGUninstallerXml, + file: install4jConf ) - */ + */ } } @@ -896,23 +1140,571 @@ task installers(type: com.install4j.gradle.Install4jTask) { dependsOn getdown 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" + destination = "${jalviewDir}/${install4jBuildDir}/${JAVA_VERSION}" buildSelected = true if (OSX_KEYPASS) { macKeystorePassword=OSX_KEYPASS - } - + + doFirst { + println("Using projectFile "+projectFile) + } + inputs.dir(project.ext.getdownWebsiteDir) inputs.file(install4jConf) inputs.dir(macosJavaVMDir) inputs.dir(windowsJavaVMDir) - outputs.dir("$jalviewDir/$install4jBuildDir/$JAVA_VERSION") + outputs.dir("${jalviewDir}/${install4jBuildDir}/${JAVA_VERSION}") } clean { - delete install4jConf + doFirst { + delete install4jConf + } } + +task sourceDist (type: Tar) { + + def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_") + def outputFileName = "${project.name}_${VERSION_UNDERSCORES}.tar.gz" + // cater for buildship < 3.1 [3.0.1 is max version in eclipse 2018-09] + try { + archiveFileName = outputFileName + } catch (Exception e) { + archiveName = outputFileName + } + + compression Compression.GZIP + + into project.name + + def EXCLUDE_FILES=["build/*","bin/*","test-output/","test-reports","tests","clover*/*" + ,".*" + ,"benchmarking/*" + ,"**/.*" + ,"*.class" + ,"**/*.class","${j11modDir}/**/*.jar","appletlib","**/*locales" + ,"*locales/**", + ,"utils/InstallAnywhere"] + def PROCESS_FILES=[ "AUTHORS", + "CITATION", + "FEATURETODO", + "JAVA-11-README", + "FEATURETODO", + "LICENSE", + "**/README", + "RELEASE", + "THIRDPARTYLIBS","TESTNG", + "build.gradle", + "gradle.properties", + "**/*.java", + "**/*.html", + "**/*.xml", + "**/*.gradle", + "**/*.groovy", + "**/*.properties", + "**/*.perl", + "**/*.sh"] + + from(jalviewDir) { + exclude (EXCLUDE_FILES) + include (PROCESS_FILES) + filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': JALVIEW_VERSION,'Year-Rel': getDate("yyyy")]) + } + from(jalviewDir) { + exclude (EXCLUDE_FILES) + exclude (PROCESS_FILES) + exclude ("appletlib") + exclude ("**/*locales") + exclude ("*locales/**") + exclude ("utils/InstallAnywhere") + + exclude (getdown_files_dir) + exclude (getdown_website_dir) + + // exluding these as not using jars as modules yet + exclude ("${j11modDir}/**/*.jar") +} +// from (jalviewDir) { +// // explicit includes for stuff that seemed to not get included +// include(fileTree("test/**/*.")) +// exclude(EXCLUDE_FILES) +// exclude(PROCESS_FILES) +// } +} + +task helppages { + dependsOn copyHelp + dependsOn pubhtmlhelp + + inputs.dir("${classes}/${helpDir}") + outputs.dir("${helpOutputDir}") +} + +def jalviewjsBuildDir +def jalviewjsSiteDir +def jalviewjsTransferSiteDir +task jalviewjsSitePath { + def relativeBuildDir = file(jalviewDirAbsolutePath).toPath().relativize(buildDir.toPath()) + jalviewjsBuildDir = "${relativeBuildDir}/jalviewjs" + if (jalviewjs_site_dir.startsWith('/')) { + jalviewjsSiteDir = jalviewjs_site_dir + } else { + jalviewjsSiteDir = "${jalviewjsBuildDir}/${jalviewjs_site_dir}" + } + jalviewjsTransferSiteDir = "${jalviewjsBuildDir}/tmp/site" +} + +def eclipseWorkspace +task jalviewjsSetEclipseWorkspace { + def propKey = "jalviewjs_eclipse_workspace" + def propVal = null + if (project.hasProperty(propKey)) { + propVal = project.getProperty(propKey) + } + def propsFileName = "${jalviewjsBuildDir}/${jalviewjs_eclipse_workspace_location_file}" + def eclipseWsDir = propVal + def props = new Properties() + + if (( eclipseWsDir == null || !file(eclipseWsDir).exists() ) && file(propsFileName).exists()) { + def ins = new FileInputStream("${jalviewDirAbsolutePath}/${propsFileName}") + props.load(ins) + ins.close() + if (props.getProperty(propKey, null) != null) { + eclipseWsDir = props.getProperty(propKey) + } + } + + if (eclipseWsDir == null || !file(eclipseWsDir).exists()) { + def tempDir = File.createTempDir() + eclipseWsDir = tempDir.getAbsolutePath() + props.setProperty(propKey, eclipseWsDir) + def propsFile = file(propsFileName) + propsFile.parentFile.mkdirs() + propsFile.createNewFile() // doesn't affect existing file + def outs = new FileOutputStream(propsFile, false) + props.store(outs, null) + outs.close() + } + + eclipseWorkspace = file(eclipseWsDir) + + doFirst { + println("ECLIPSE WORKSPACE: "+eclipseWorkspace.getPath()) + } + inputs.property(propKey, eclipseWsDir) + outputs.file(propsFileName) +} + + +def eclipseDropinsDir +def utilsDropinsDir +def eclipseBinary +def eclipseVersion +def eclipseDebug = false +def eclipseVersionSuffix = "" +task jalviewjsEclipsePaths { + def eclipseProduct + + def eclipseRoot = jalviewjs_eclipse_root + if (eclipseRoot.startsWith("~")) { + eclipseRoot = System.getProperty("user.home") + eclipseRoot.substring(1) + } + if (OperatingSystem.current().isMacOsX()) { + eclipseRoot += "/Eclipse.app" + eclipseDropinsDir = "${eclipseRoot}/Contents/Eclipse/dropins" + eclipseBinary = "${eclipseRoot}/Contents/MacOS/eclipse" + eclipseProduct = "${eclipseRoot}/Contents/Eclipse/.eclipseproduct" + } else if (OperatingSystem.current().isWindows()) { // check these paths!! + if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) { + eclipseRoot += "/eclipse" + } + eclipseDropinsDir = "${eclipseRoot}/dropins" + eclipseBinary = "${eclipseRoot}/eclipse" + eclipseProduct = "${eclipseRoot}/.eclipseproduct" + } else { // linux or unix + if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) { + eclipseRoot += "/eclipse" + } + eclipseDropinsDir = "${eclipseRoot}/dropins" + eclipseBinary = "${eclipseRoot}/eclipse" + eclipseProduct = "${eclipseRoot}/.eclipseproduct" + } + + eclipseVersion = "4.12" // default + def assumedVersion = true + if (file(eclipseProduct).exists()) { + def fis = new FileInputStream(eclipseProduct) + def props = new Properties() + props.load(fis) + eclipseVersion = props.getProperty("version") + fis.close() + assumedVersion = false + } + String[] v = eclipseVersion.split("\\.") + def v0 = Integer.valueOf(v[0]) + def v1 = Integer.valueOf(v[1]) + if (v0 < 4 || ( v0 == 4 && v1 < 13 )) { + eclipseVersionSuffix = "_4.12" + } else { + eclipseVersionSuffix = "_4.13" + } + + utilsDropinsDir = "${jalviewjs_utils_dir}/${jalviewjs_eclipse_dropins_dir}${eclipseVersionSuffix}" + def propKey = "eclipse_debug" + eclipseDebug = (project.hasProperty(propKey) && project.getProperty(propKey).equals("true")) + + doFirst { + if (!assumedVersion) { + println("ECLIPSE_VERSION=${eclipseVersion}") + } + } +} + +task jalviewjsEclipseCopyDropins { + dependsOn jalviewjsEclipsePaths + def inputFiles = fileTree(dir: utilsDropinsDir, include: "*.jar") + def outputDir = eclipseDropinsDir + + inputs.files inputFiles + inputFiles.each { file -> + outputs.file("${outputDir}/${file.name}") + } + + doLast { + inputFiles.each { file -> + copy { + from file + into outputDir + } + } + } +} + +// this version (type: Copy) will delete anything in the eclipse dropins folder that isn't in fromDropinsDir +task NEWjalviewjsEclipseCopyDropins(type: Copy) { + dependsOn jalviewjsEclipsePaths + from utilsDropinsDir + into eclipseDropinsDir +} + +task jalviewjsUnzipFiles { + dependsOn jalviewjsSitePath + + def zipFiles = fileTree(dir: "${jalviewjs_utils_dir}/${jalviewjs_libjs_dir}", include: "*.zip") + zipFiles += "${jalviewjs_utils_dir}/${jalviewjs_swingjs_zip}${eclipseVersionSuffix}" + + doLast { + zipFiles.each { file_zip -> + copy { + from zipTree(file_zip) + into jalviewjsSiteDir + } + } + } + + inputs.files zipFiles + outputs.dir jalviewjsSiteDir +} + +task jalviewjsCreateJ2sSettings(type: WriteProperties) { + dependsOn jalviewjsSitePath + outputFile ("${jalviewDir}/${jalviewjs_j2s_settings}") + def j2s_props = project.properties.findAll { it.key.startsWith("j2s.") }.sort { it.key } + def siteDirProperty = "j2s.site.directory" + def setSiteDir = false + j2s_props.each { prop, val -> + if (val != null) { + if (prop == siteDirProperty) { + if (!(val.startsWith('/') || val.startsWith("file://") )) { + val = "${jalviewjsTransferSiteDir}/${val}" + } + setSiteDir = true + } + property(prop,val) + } + if (!setSiteDir) { // default site location, don't override specifically set property + property(siteDirProperty,jalviewjsTransferSiteDir) + } + } + inputs.properties(j2s_props) + outputs.file(outputFile) +} + +task jalviewjsEclipseSetup { + dependsOn jalviewjsEclipseCopyDropins + dependsOn jalviewjsSetEclipseWorkspace + dependsOn jalviewjsCreateJ2sSettings +} + +task jalviewjsCopyResources (type: Copy) { + dependsOn jalviewjsSitePath + def inputFiles = fileTree(dir: jalviewjs_resource_dir) + def outputDir = "${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}" + + from inputFiles + into outputDir + def outputFiles = [] + rename { filename -> + outputFiles += "${outputDir}/${filename}" + null + } + outputs.files outputFiles + inputs.files inputFiles +} + +task jalviewjsCopySiteResources (type: Copy) { + dependsOn jalviewjsSitePath + def inputFiles = fileTree(dir: "${jalviewjs_utils_dir}/${jalviewjs_site_resource_dir}") + def outputDir = jalviewjsSiteDir + + from inputFiles + into outputDir + def outputFiles = [] + rename { filename -> + outputFiles += "${outputDir}/${filename}" + null + } + outputs.files outputFiles + inputs.files inputFiles +} + +task jalviewjsProjectImport(type: Exec) { + dependsOn eclipseProject + dependsOn eclipseClasspath + dependsOn eclipseJdt + dependsOn jalviewjsEclipsePaths + dependsOn jalviewjsEclipseSetup + + def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview/org.eclipse.jdt.core" + executable(eclipseBinary) + args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", eclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath]) + if (eclipseDebug) { + args += "-debug" + } + + doFirst { + println("IMPORT ECLIPSE_DEBUG=${eclipseDebug}") + } + + inputs.file("${jalviewDir}/.project") + outputs.dir(projdir) + outputs.upToDateWhen { file(projdir).exists() } +} + +task jalviewjsTranspile(type: Exec) { + dependsOn jalviewjsEclipseSetup + dependsOn jalviewjsProjectImport + dependsOn jalviewjsEclipsePaths + + executable(eclipseBinary) + args(["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", eclipseWorkspace, "-${jalviewjs_eclipseBuildArg}", eclipse_project_name ]) + if (eclipseDebug) { + args += "-debug" + } + + def stdout + def stderr + stdout = new ByteArrayOutputStream() + stderr = new ByteArrayOutputStream() + + def logOutFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_stdout}" + def logOutFile = file(logOutFileName) + logOutFile.createNewFile() + logOutFile.text = """ROOT: ${jalviewjs_eclipse_root} +BINARY: ${eclipseBinary} +VERSION: ${eclipseVersion} +WORKSPACE: ${eclipseWorkspace} +DEBUG: ${eclipseDebug} +---- +""" + def logOutFOS = new FileOutputStream(logOutFile, true) // true == append + //def logErrFileName = "${jalviewjsBuildDir}/${jalviewjs_j2s_stderr}" + //def logErrFile = file(logFileName) + //logErrFile.createNewFile() + //def logErrFOS = new FileErrputStream(logErrFile, false) + // combine stdout and stderr + def logErrFOS = logOutFOS + + if (jalviewjs_j2s_to_console.equals("true")) { + standardOutput = new org.apache.tools.ant.util.TeeOutputStream( + new org.apache.tools.ant.util.TeeOutputStream( + logOutFOS, + stdout), + standardOutput) + errorOutput = new org.apache.tools.ant.util.TeeOutputStream( + new org.apache.tools.ant.util.TeeOutputStream( + logErrFOS, + stderr), + errorOutput) + } else { + standardOutput = new org.apache.tools.ant.util.TeeOutputStream( + logOutFOS, + stdout) + errorOutput = new org.apache.tools.ant.util.TeeOutputStream( + logErrFOS, + stderr) + } + + doLast { + if (stdout.toString().contains("Error processing ")) { + // j2s did not complete transpile + throw new GradleException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewjsBuildDir}/${jalviewjs_j2s_stdout}'") + } + } + + doFirst { + println("TRANSPILE ECLIPSE_DEBUG=${eclipseDebug}") + } + + inputs.dir(sourceDir) + outputs.dir("${eclipse_bin_dir}/main") + outputs.dir(jalviewjsTransferSiteDir) + outputs.upToDateWhen { file("${jalviewjsTransferSiteDir}${jalviewjs_server_resource}").exists() } + +} + +task jalviewjsCopyTransferSite(type: Copy) { + dependsOn jalviewjsTranspile + from jalviewjsTransferSiteDir + into jalviewjsSiteDir +} + +jalviewjsUnzipFiles.mustRunAfter jalviewjsCopyTransferSite +jalviewjsCopyResources.mustRunAfter jalviewjsCopyTransferSite +jalviewjsCopySiteResources.mustRunAfter jalviewjsCopyTransferSite + +task jalviewjsPrepareSite { + group "JalviewJS" + description "Prepares the website folder including unzipping files and copying resources" + dependsOn jalviewjsSitePath + dependsOn jalviewjsUnzipFiles + dependsOn jalviewjsCopyResources + dependsOn jalviewjsCopySiteResources +} + +task jalviewjsBuildSite { + group "JalviewJS" + description "Builds the whole website including transpiled code" + dependsOn jalviewjsCopyTransferSite + dependsOn jalviewjsPrepareSite +} + +task cleanJalviewjsSite { + doFirst { + delete jalviewjsTransferSiteDir + delete jalviewjsSiteDir + } +} + +task jalviewjsSiteTar(type: Tar) { + group "JalviewJS" + description "Creates a tar.gz file for the website" + dependsOn jalviewjsBuildSite + def outputFilename = "jalviewjs-site-${JALVIEW_VERSION}.tar.gz" + try { + archiveFileName = outputFilename + } catch (Exception e) { + archiveName = outputFilename + } + + compression Compression.GZIP + + from jalviewjsSiteDir + into jalviewjs_site_dir // this is inside the tar file + + inputs.dir(jalviewjsSiteDir) +} + +task jalviewjsServer { + group "JalviewJS" + description "Starts a webserver on localhost to test the website" + dependsOn jalviewjsSitePath + def htmlFile = "${jalviewDirAbsolutePath}/jalviewjsTest.html" + doLast { + + SimpleHttpFileServerFactory factory = new SimpleHttpFileServerFactory() + def port = Integer.valueOf(jalviewjs_server_port) + def start = port + def running = false + def url + while(port < start+1000 && !running) { + try { + def doc_root = new File("${jalviewDirAbsolutePath}/${jalviewjsSiteDir}") + def jalviewjsServer = factory.start(doc_root, port) + running = true + url = jalviewjsServer.getResourceUrl(jalviewjs_server_resource) + println("SERVER STARTED with document root ${doc_root}.") + println("Go to "+url+" . Run gradle --stop to stop (kills all gradle daemons).") + println("For debug: "+url+"?j2sdebug") + + file(htmlFile).text = """ +

Jalview JS Test. <${url}>

+

Jalview JS Test with debug. <${url}?j2sdebug<

+ """ + + } catch (Exception e) { + port++; + } + } + + } + + outputs.file(htmlFile) +} + +task cleanJalviewjsAll { + group "JalviewJS" + description "Delete all configuration and build artifacts to do with JalviewJS build" + dependsOn cleanJalviewjsSite + dependsOn jalviewjsEclipsePaths + + doFirst { + delete jalviewjsBuildDir + delete "${jalviewDir}/${eclipse_bin_dir}" + if (eclipseWorkspace != null && file(eclipseWorkspace.getAbsolutePath()+"/.metadata").exists()) { + delete file(eclipseWorkspace.getAbsolutePath()+"/.metadata") + } + delete "${jalviewDir}/${jalviewjs_j2s_settings}" + } +} + +task jalviewjs { + group "JalviewJS" + description "Build the site" + dependsOn jalviewjsBuildSite +} + + +task jalviewjsIDECopyTransferSite(type: Copy) { + from jalviewjsTransferSiteDir + into jalviewjsSiteDir +} + +task jalviewjsIDEj2s { + group "JalviewJS in Eclipse" + description "Creates the .j2s file" + dependsOn jalviewjsCreateJ2sSettings +} + +task jalviewjsIDEBuildSite { + group "JalviewJS in Eclipse" + description "Copies the Eclipse transpiled site and unzips supporting zipfiles" + dependsOn jalviewjsIDECopyTransferSite + dependsOn jalviewjsPrepareSite +} + +task jalviewjsIDESiteClean { + group "JalviewJS in Eclipse" + description "Deletes the Eclipse transpiled site" + dependsOn cleanJalviewjsSite +} + +task jalviewjsIDEServer { + group "JalviewJS in Eclipse" + description "Starts a webserver on localhost to test the website" + dependsOn jalviewjsServer +} +