X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=build.gradle;h=ca738599cd25ee59041f10aa36b5be9c907e40bb;hb=refs%2Fheads%2Fimprovement%2FJAL-3543_dont_report_null_versions_in_java_console;hp=d81604e68e8f27a5156e204e017c32cb753ff2e8;hpb=797296a31f6cb12c2c7fc990d39966f07b600862;p=jalview.git diff --git a/build.gradle b/build.gradle index d81604e..ca73859 100644 --- a/build.gradle +++ b/build.gradle @@ -1,11 +1,15 @@ 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.Output +import org.gradle.plugins.ide.eclipse.model.Library +import java.security.MessageDigest +import groovy.transform.ExternalizeMethods +import groovy.util.XmlParser +import groovy.xml.XmlUtil buildscript { dependencies { - classpath 'org.openclover:clover:4.3.1' - classpath 'org.apache.commons:commons-compress:1.18' + classpath 'org.openclover:clover:4.4.1' } } @@ -14,7 +18,8 @@ plugins { id 'application' id 'eclipse' id 'com.github.johnrengelman.shadow' version '4.0.3' - id 'com.install4j.gradle' version '7.0.9' + id 'com.install4j.gradle' version '8.0.2' + id 'com.dorongold.task-tree' version '1.5' // only needed to display task dependency tree with gradle task1 [task2 ...] taskTree } repositories { @@ -26,94 +31,332 @@ repositories { } } -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" +dependencies { } -// configure classpath/args for j8/j11 compilation -def jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath() -def libDir -def libDistDir -def compile_source_compatibility -def compile_target_compatibility +// in ext the values are cast to Object. Ensure string values are cast as String (and not GStringImpl) for later use +def string(Object o) { + return o == null ? "" : o.toString() +} + ext { - // where the getdown channel will be built. - // TODO: consider allowing this expression to be overrriden 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 + '/' - def getdownChannel = getdown_channel_name - if (getdown_channel_name.equals("COMMIT")) { - getdownChannel = getGitHash() - } - getdown_app_base = getdown_channel_base+"/"+getdownChannel+"/"+JAVA_VERSION+"/" - modules_compileClasspath = fileTree(dir: "$jalviewDir/$j11modDir", include: ["*.jar"]) - modules_runtimeClasspath = modules_compileClasspath -} + jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath() + jalviewDirRelativePath = jalviewDir + + // local build environment properties + def localProps = "${jalviewDirAbsolutePath}/local.properties" + if (file(localProps).exists()) { + try { + def p = new Properties() + def localPropsFIS = new FileInputStream(localProps) + p.load(localPropsFIS) + localPropsFIS.close() + p.each { + key, val -> + def oldval = findProperty(key) + setProperty(key, val) + if (oldval != null) { + println("Overriding property '${key}' ('${oldval}') with local.properties value '${val}'") + } else { + println("Setting unknown property '${key}' with local.properties value '${val}'") + } + } + } catch (Exception e) { + System.out.println("Exception reading local.properties") + } + } + + // this property set when running Eclipse headlessly + j2sHeadlessBuildProperty = string("net.sf.j2s.core.headlessbuild") + // this property set by Eclipse + eclipseApplicationProperty = string("eclipse.application") + // CHECK IF RUNNING FROM WITHIN ECLIPSE + def eclipseApplicationPropertyVal = System.properties[eclipseApplicationProperty] + IN_ECLIPSE = eclipseApplicationPropertyVal != null && eclipseApplicationPropertyVal.startsWith("org.eclipse.ui.") + // BUT WITHOUT THE HEADLESS BUILD PROPERTY SET + if (System.properties[j2sHeadlessBuildProperty].equals("true")) { + println("Setting IN_ECLIPSE to ${IN_ECLIPSE} as System.properties['${j2sHeadlessBuildProperty}'] == '${System.properties[j2sHeadlessBuildProperty]}'") + IN_ECLIPSE = false + } + if (IN_ECLIPSE) { + println("WITHIN ECLIPSE IDE") + } else { + println("HEADLESS BUILD") + } + /* *-/ + System.properties.sort { it.key }.each { + key, val -> println("SYSTEM PROPERTY ${key}='${val}'") + } + /-* *-/ + if (false && IN_ECLIPSE) { + jalviewDir = jalviewDirAbsolutePath + } + */ + + // essentials + bareSourceDir = string(source_dir) + sourceDir = string("${jalviewDir}/${bareSourceDir}") + resourceDir = string("${jalviewDir}/${resource_dir}") + bareTestSourceDir = string(test_source_dir) + testSourceDir = string("${jalviewDir}/${bareTestSourceDir}") + + // clover + cloverInstrDir = file("${buildDir}/${cloverSourcesInstrDir}") + classesDir = string("${jalviewDir}/${classes_dir}") + if (clover.equals("true")) { + use_clover = true + classesDir = string("${buildDir}/${cloverClassesDir}") + } else { + use_clover = false + classesDir = string("${jalviewDir}/${classes_dir}") + } + + classes = classesDir + + getdownWebsiteDir = string("${jalviewDir}/${getdown_website_dir}/${JAVA_VERSION}") + buildDist = true + + // the following values might be overridden by the CHANNEL switch + getdownChannelName = CHANNEL.toLowerCase() + getdownDir = string("${getdownChannelName}/${JAVA_VERSION}") + getdownAppBase = string("${getdown_channel_base}/${getdownDir}") + getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher}") + getdownAppDistDir = getdown_app_dir_alt + buildProperties = string("${classesDir}/${build_properties_file}") + reportRsyncCmd = false + jvlChannelName = CHANNEL.toLowerCase() + switch (CHANNEL) { + + case "BUILD": + // TODO: get bamboo build artifact URL for getdown artifacts + getdown_channel_base = bamboo_channelbase + getdownChannelName = string("${bamboo_planKey}/${JAVA_VERSION}") + getdownAppBase = string("${bamboo_channelbase}/${bamboo_planKey}${bamboo_getdown_channel_suffix}/${JAVA_VERSION}") + jvlChannelName += "_${getdownChannelName}" + break + + case "RELEASE": + getdownAppDistDir = getdown_app_dir_release + reportRsyncCommand = true + break + + case "ARCHIVE": + getdownChannelName = CHANNEL.toLowerCase()+"/${JALVIEW_VERSION}" + getdownDir = string("${getdownChannelName}/${JAVA_VERSION}") + getdownAppBase = string("${getdown_channel_base}/${getdownDir}") + if (!file("${ARCHIVEDIR}/${packageDir}").exists()) { + throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution") + } else { + packageDir = string("${ARCHIVEDIR}/${packageDir}") + buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}") + buildDist = false + } + reportRsyncCommand = true + break + + case "ARCHIVELOCAL": + getdownChannelName = string("archive/${JALVIEW_VERSION}") + getdownDir = string("${getdownChannelName}/${JAVA_VERSION}") + getdownAppBase = file(getdownWebsiteDir).toURI().toString() + if (!file("${ARCHIVEDIR}/${packageDir}").exists()) { + throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution") + } else { + packageDir = string("${ARCHIVEDIR}/${packageDir}") + buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}") + buildDist = false + } + reportRsyncCommand = true + getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}") + break + + case "DEVELOP": + reportRsyncCommand = true + break + + case "TEST-RELEASE": + reportRsyncCommand = true + break + + case ~/^SCRATCH(|-[-\w]*)$/: + getdownChannelName = CHANNEL + getdownDir = string("${getdownChannelName}/${JAVA_VERSION}") + getdownAppBase = string("${getdown_channel_base}/${getdownDir}") + reportRsyncCommand = true + break + + case "TEST-LOCAL": + if (!file("${LOCALDIR}").exists()) { + throw new GradleException("Must provide a LOCALDIR value to produce a local distribution") + } else { + getdownAppBase = file(file("${LOCALDIR}").getAbsolutePath()).toURI().toString() + getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}") + } + break + + case "LOCAL": + getdownAppBase = file(getdownWebsiteDir).toURI().toString() + getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}") + break -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 -// this property is assigned below and expanded to multiple lines in the getdown task -def getdown_alt_multi_java_location -if (JAVA_VERSION.equals("1.8")) { - JAVA_INTEGER_VERSION = "8" - 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_multi_java_location = getdown_alt_java8_txt_multi_java_location -} 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_multi_java_location = getdown_alt_java11_txt_multi_java_location - additional_compiler_args += [ - '--module-path', ext.modules_compileClasspath.asPath, + default: // something wrong specified + throw new GradleException("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]") + break + + } + // override getdownAppBase if requested + if (findProperty("getdown_appbase_override") != null) { + getdownAppBase = string(getProperty("getdown_appbase_override")) + println("Overriding getdown appbase with '${getdownAppBase}'") + } + // sanitise file name for jalview launcher file for this channel + jvlChannelName = jvlChannelName.replaceAll(/[^\w\-]/,"_") + + getdownAppDir = string("${getdownWebsiteDir}/${getdownAppDistDir}") + //getdownJ11libDir = "${getdownWebsiteDir}/${getdown_j11lib_dir}" + getdownResourceDir = string("${getdownWebsiteDir}/${getdown_resource_dir}") + getdownInstallDir = string("${getdownWebsiteDir}/${getdown_install_dir}") + getdownFilesDir = string("${jalviewDir}/${getdown_files_dir}/${JAVA_VERSION}/") + getdownFilesInstallDir = string("${getdownFilesDir}/${getdown_install_dir}") + /* compile without modules -- using classpath libraries + modules_compileClasspath = fileTree(dir: "${jalviewDir}/${j11modDir}", include: ["*.jar"]) + modules_runtimeClasspath = modules_compileClasspath + */ + gitHash = string("") + gitBranch = string("") + + println("Using a ${CHANNEL} profile.") + + additional_compiler_args = [] + // configure classpath/args for j8/j11 compilation + if (JAVA_VERSION.equals("1.8")) { + JAVA_INTEGER_VERSION = string("8") + //libDir = j8libDir + libDir = j11libDir + libDistDir = j8libDir + compile_source_compatibility = 1.8 + compile_target_compatibility = 1.8 + // these are getdown.txt properties defined dependent on the JAVA_VERSION + getdownAltJavaMinVersion = string(findProperty("getdown_alt_java8_min_version")) + getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java8_max_version")) + // this property is assigned below and expanded to multiple lines in the getdown task + getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java8_txt_multi_java_location")) + // this property is for the Java library used in eclipse + eclipseJavaRuntimeName = string("JavaSE-1.8") + } else if (JAVA_VERSION.equals("11")) { + JAVA_INTEGER_VERSION = string("11") + libDir = j11libDir + libDistDir = j11libDir + compile_source_compatibility = 11 + compile_target_compatibility = 11 + getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version")) + getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version")) + getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location")) + eclipseJavaRuntimeName = string("JavaSE-11") + /* compile without modules -- using classpath libraries + additional_compiler_args += [ + '--module-path', modules_compileClasspath.asPath, '--add-modules', j11modules - ] -} else { - throw new GradleException("JAVA_VERSION=$JAVA_VERSION not currently supported by Jalview") + ] + */ + } 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 + getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version")) + getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version")) + getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location")) + eclipseJavaRuntimeName = string("JavaSE-11") + /* compile without modules -- using classpath libraries + additional_compiler_args += [ + '--module-path', modules_compileClasspath.asPath, + '--add-modules', j11modules + ] + */ + } else { + throw new GradleException("JAVA_VERSION=${JAVA_VERSION} not currently supported by Jalview") + } + + + // for install4j + JAVA_MIN_VERSION = JAVA_VERSION + JAVA_MAX_VERSION = JAVA_VERSION + def jreInstallsDir = string(jre_installs_dir) + if (jreInstallsDir.startsWith("~/")) { + jreInstallsDir = System.getProperty("user.home") + jreInstallsDir.substring(1) + } + macosJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-mac-x64/jre") + macosJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-mac-x64.tar.gz") + windowsJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-windows-x64/jre") + windowsJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-windows-x64.tar.gz") + linuxJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-linux-x64/jre") + linuxJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-linux-x64.tar.gz") + install4jDir = string("${jalviewDir}/${install4j_utils_dir}") + install4jConfFileName = string("jalview-install4j-conf.install4j") + install4jConfFile = file("${install4jDir}/${install4jConfFileName}") + install4jHomeDir = install4j_home_dir + if (install4jHomeDir.startsWith("~/")) { + install4jHomeDir = System.getProperty("user.home") + install4jHomeDir.substring(1) + } + + + + buildingHTML = string("${jalviewDir}/${docDir}/building.html") + helpFile = string("${classesDir}/${help_dir}/help.jhm") + helpParentDir = string("${jalviewDir}/${help_parent_dir}") + helpSourceDir = string("${helpParentDir}/${help_dir}") + + + relativeBuildDir = file(jalviewDirAbsolutePath).toPath().relativize(buildDir.toPath()) + jalviewjsBuildDir = string("${relativeBuildDir}/jalviewjs") + jalviewjsSiteDir = string("${jalviewjsBuildDir}/${jalviewjs_site_dir}") + if (IN_ECLIPSE) { + jalviewjsTransferSiteJsDir = string(jalviewjsSiteDir) + } else { + jalviewjsTransferSiteJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_js") + } + jalviewjsTransferSiteLibDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_lib") + jalviewjsTransferSiteSwingJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_swingjs") + jalviewjsTransferSiteCoreDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_core") + jalviewjsJalviewCoreHtmlFile = string("") + jalviewjsJalviewCoreName = string(jalviewjs_core_name) + jalviewjsCoreClasslists = [] + jalviewjsJalviewTemplateName = string(jalviewjs_name) + jalviewjsJ2sSettingsFileName = string("${jalviewDir}/${jalviewjs_j2s_settings}") + jalviewjsJ2sProps = null + + eclipseWorkspace = null + eclipseBinary = string("") + eclipseVersion = string("") + eclipseDebug = false + // ENDEXT } -sourceSets { +sourceSets { main { java { - srcDirs "$jalviewDir/$sourceDir" - outputDir = file("$classes") + srcDirs sourceDir + outputDir = file(classesDir) } resources { - srcDirs "$jalviewDir/$resourceDir" - srcDirs "$jalviewDir/$libDistDir" + srcDirs resourceDir + srcDirs += helpParentDir } - jar.destinationDir = file("$jalviewDir/$packageDir") + jar.destinationDir = file("${jalviewDir}/${packageDir}") compileClasspath = files(sourceSets.main.java.outputDir) - compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"]) + //compileClasspath += files(sourceSets.main.resources.srcDirs) + compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"]) runtimeClasspath = compileClasspath } + clover { java { srcDirs = [ cloverInstrDir ] @@ -126,16 +369,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 testSourceDir + outputDir = file("${jalviewDir}/${testOutputDir}") } resources { @@ -145,27 +388,29 @@ sourceSets { compileClasspath = files( sourceSets.test.java.outputDir ) if (use_clover) { - compileClasspath += sourceSets.clover.compileClasspath + compileClasspath = sourceSets.clover.compileClasspath } 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 } } + // clover bits dependencies { if (use_clover) { - cloverCompile 'org.openclover:clover:4.3.1' - testCompile 'org.openclover:clover:4.3.1' + cloverCompile 'org.openclover:clover:4.4.1' + testCompile 'org.openclover:clover:4.4.1' } } + configurations { cloverRuntime cloverRuntime.extendsFrom cloverCompile @@ -173,11 +418,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' @@ -186,11 +431,11 @@ eclipse { classpath { //defaultOutputDir = sourceSets.main.java.outputDir def removeThese = [] - configurations.each{ if (it.isCanBeResolved()) { + configurations.each{ + if (it.isCanBeResolved()) { removeThese += it } } - containers 'org.eclipse.buildship.core.gradleclasspathcontainer' minusConfigurations += removeThese plusConfigurations = [ ] @@ -198,101 +443,92 @@ eclipse { whenMerged { cp -> def removeTheseToo = [] - HashMap addedSrcPath = new HashMap<>(); + HashMap alreadyAddedSrcPath = new HashMap<>(); cp.entries.each { entry -> + // This conditional removes all src classpathentries that a) have already been added or b) aren't "src" or "test". + // e.g. this removes the resources dir being copied into bin/main, bin/test AND bin/clover + // we add the resources and help/help dirs in as libs afterwards (see below) if (entry.kind == 'src') { - if (addedSrcPath.getAt(entry.path) || !(entry.path == "src" || entry.path == "test")) { + if (alreadyAddedSrcPath.getAt(entry.path) || !(entry.path == bareSourceDir || entry.path == bareTestSourceDir)) { removeTheseToo += entry } else { - addedSrcPath.putAt(entry.path, true) + alreadyAddedSrcPath.putAt(entry.path, true) } } + } cp.entries.removeAll(removeTheseToo) - } - 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 - } + //cp.entries += new Output("${eclipse_bin_dir}/main") + if (file(helpParentDir).isDirectory()) { + cp.entries += new Library(fileReference(helpParentDir)) } - 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"])) + if (file(resourceDir).isDirectory()) { + cp.entries += new Library(fileReference(resourceDir)) } - node.appendNode('classpathentry', [kind:"output", path:"bin/main"]) - node.appendNode('classpathentry', [kind:"lib", path:helpParentDir]) - node.appendNode('classpathentry', [kind:"lib", path: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 + HashMap alreadyAddedLibPath = new HashMap<>(); + + sourceSets.main.compileClasspath.findAll { it.name.endsWith(".jar") }.any { + //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 - //println("Not adding directory "+it) - return + // don't add dirs to classpath, especially if they don't exist + return false // groovy "continue" in .any closure } 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) - node.appendNode('classpathentry', [kind:"lib", path:itPath]) - addedLibPath.put(itPath, true) + cp.entries += new Library(fileReference(itPath)) + alreadyAddedLibPath.put(itPath, true) } } - sourceSets.test.compileClasspath.each{ - //if ((it.isDirectory() || ! it.exists()) && ! (it.equals(sourceSets.main.java.outputDir))) { + + sourceSets.test.compileClasspath.findAll { it.name.endsWith(".jar") }.any { //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 - //println("Not adding directory "+it) - return + return false // groovy "continue" in .any closure } + def itPath = it.toString() - if (itPath.startsWith(jalviewDirAbsolutePath+"/")) { + if (itPath.startsWith("${jalviewDirAbsolutePath}/")) { itPath = itPath.substring(jalviewDirAbsolutePath.length()+1) } - if (addedLibPath.get(itPath)) { - //println("Not adding duplicate entry "+itPath) + if (alreadyAddedLibPath.get(itPath)) { + // don't duplicate } else { - //println("Adding entry "+itPath) - node.appendNode('classpathentry', [kind:"lib", path:itPath]) - .appendNode('attributes') - .appendNode('attribute', [name:"test", value:"true"]) - addedLibPath.put(itPath, true) + def lib = new Library(fileReference(itPath)) + lib.entryAttributes["test"] = "true" + cp.entries += lib + alreadyAddedLibPath.put(itPath, true) } } - } - } - } + } // 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 = eclipseJavaRuntimeName + // add in jalview project specific properties/preferences into eclipse core preferences file { withProperties { props -> def jalview_prefs = new Properties() - def ins = new FileInputStream(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 -> @@ -302,19 +538,27 @@ eclipse { } } } - } + } // jdt + + if (IN_ECLIPSE) { + // Don't want these to be activated if in headless build + synchronizationTasks "eclipseSynchronizationTask" + autoBuildTasks "eclipseAutoBuildTask" + + } } + task cloverInstr() { // only instrument source, we build test classes as normal - inputs.files files (sourceSets.main.allJava) // , fileTree(dir:"$jalviewDir/$testSourceDir", include: ["**/*.java"])) + inputs.files files (sourceSets.main.allJava,sourceSets.test.allJava) // , fileTree(dir:"$jalviewDir/$testSourceDir", include: ["**/*.java"])) outputs.dir cloverInstrDir 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 })) @@ -325,27 +569,44 @@ task cloverInstr() { } -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) +task cloverReportHTML (type: JavaExec) { + inputs.dir "${buildDir}/clover" + outputs.dir "${reportsDir}/clover" - // 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) - } + classpath configurations.cloverRuntime + maxHeapSize "${cloverReportJVMHeap}" + jvmArgs += "${cloverReportJVMArgs}" + main = "com.atlassian.clover.reporters.html.HtmlReporter" + args "--initstring", "${buildDir}/clover/clover.db", "-o", "${reportsDir}/clover" + "${cloverReportHTMLOptions}".split(",").each { + args+= it.trim() + } } +task cloverReportXML (type: JavaExec) { + inputs.dir "${buildDir}/clover" + outputs.dir "${reportsDir}/clover" + maxHeapSize "${cloverReportJVMHeap}" + jvmArgs "${cloverReportJVMArgs}" + classpath configurations.cloverRuntime + main = "com.atlassian.clover.reporters.xml.XMLReporter" + args "--initstring", "${buildDir}/clover/clover.db", "-o", "${reportsDir}/clover/clover.xml" + + "${cloverReportXMLOptions}".split(",").each { + args+= it.trim() + } +} +task cloverReport { + group = "Verification" + description = "Creates the Clover report" + inputs.dir "${buildDir}/clover" + outputs.dir "${reportsDir}/clover" + onlyIf { + file("${buildDir}/clover/clover.db").exists() + } + dependsOn cloverReportXML + dependsOn cloverReportHTML +} // end clover bits @@ -360,6 +621,7 @@ compileJava { } + compileTestJava { if (use_clover) { dependsOn compileCloverJava @@ -387,72 +649,141 @@ compileCloverJava { classpath += configurations.cloverRuntime } + 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) } -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() + + gitHash = hashStdOut.toString().trim() + gitBranch = branchStdOut.toString().trim() + + outputs.upToDateWhen { false } } + task createBuildProperties(type: WriteProperties) { - inputs.dir("$jalviewDir/$sourceDir") - inputs.dir("$jalviewDir/$resourceDir") - outputFile "$classes/$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") + dependsOn setGitVals + inputs.dir(sourceDir) + inputs.dir(resourceDir) + file(buildProperties).getParentFile().mkdirs() + 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:"+gitHash+" ["+gitBranch+"]" outputs.file(outputFile) - outputs.dir("$classes") } + +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() + def buildtoolsPandoc = System.getProperty("user.home")+"/buildtools/pandoc/bin/pandoc" + if ((pandoc == null || ! file(pandoc).exists()) && file(buildtoolsPandoc).exists()) { + 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("Cannot find pandoc. Skipping convert building.md to HTML") + } + } + + 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 = "${classesDir}/${docDir}" + from fileTree("${jalviewDir}/${docDir}") into syncDir } -def helpFile = "$classes/$helpDir/help.jhm" task copyHelp(type: Copy) { - def inputDir = "$jalviewDir/$helpParentDir/$helpDir" - def outputDir = "$classes/$helpDir" + def inputDir = helpSourceDir + def outputDir = "${classesDir}/${help_dir}" from(inputDir) { exclude '**/*.gif' exclude '**/*.jpg' exclude '**/*.png' - filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': JALVIEW_VERSION]) + filter(ReplaceTokens, + beginToken: '$$', + endToken: '$$', + tokens: [ + 'Version-Rel': JALVIEW_VERSION, + 'Year-Rel': getDate("yyyy") + ] + ) } from(inputDir) { include '**/*.gif' @@ -466,22 +797,24 @@ task copyHelp(type: Copy) { outputs.dir(outputDir) } + task syncLib(type: Sync) { - def syncDir = "$classes/$libDistDir" - from fileTree("$jalviewDir/$libDistDir") + def syncDir = "${classesDir}/${libDistDir}" + from fileTree("${jalviewDir}/${libDistDir}") into syncDir } + task syncResources(type: Sync) { - from "$jalviewDir/$resourceDir" + from resourceDir include "**/*.*" - exclude "install4j" - into "$classes" + into "${classesDir}" preserve { include "**" } } + task prepare { dependsOn syncResources dependsOn syncDocs @@ -497,7 +830,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 @@ -510,58 +845,75 @@ 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 = "${classesDir}/${help_dir}" 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("${classesDir}/doc") + outputs.dir("${classesDir}/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"]) - - 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") + task linkCheck(type: JavaExec) { dependsOn prepare, compileLinkCheck - classpath = files("$jalviewDir/$utilsDir") + + def helpLinksCheckerOutFile = file("${jalviewDir}/${utilsDir}/HelpLinksChecker.out") + classpath = files("${jalviewDir}/${utilsDir}") main = "HelpLinksChecker" workingDir = jalviewDir - def help = "$classes/$helpDir" - args = [ "$classes/$helpDir", "-nointernet" ] - //args = [ "$classesDir/$helpDir", "-nointernet" ] + args = [ "${classesDir}/${help_dir}", "-nointernet" ] + + def outFOS = new FileOutputStream(helpLinksCheckerOutFile, false) // false == don't append + def errFOS = outFOS + standardOutput = new org.apache.tools.ant.util.TeeOutputStream( + outFOS, + standardOutput) + errorOutput = new org.apache.tools.ant.util.TeeOutputStream( + outFOS, + errorOutput) + + inputs.dir("${classesDir}/${help_dir}") + outputs.file(helpLinksCheckerOutFile) +} - doFirst { - helplinkscheckeroutputfile.createNewFile() - standardOutput new FileOutputStream(helplinkscheckeroutputfile, false) - } +// import the pubhtmlhelp target +ant.properties.basedir = "${jalviewDir}" +ant.properties.helpBuildDir = "${jalviewDirAbsolutePath}/${classes_dir}/${help_dir}" +ant.importBuild "${utilsDir}/publishHelp.xml" - outputs.file(helplinkscheckeroutputfile) -} task cleanPackageDir(type: Delete) { - delete fileTree("$jalviewDir/$packageDir").include("*.jar") + doFirst { + delete fileTree(dir: "${jalviewDir}/${packageDir}", include: "*.jar") + } } jar { @@ -576,7 +928,7 @@ jar { "Codebase": application_codebase } - destinationDir = file("$jalviewDir/$packageDir") + destinationDir = file("${jalviewDir}/${packageDir}") archiveName = rootProject.name+".jar" exclude "cache*/**" @@ -585,24 +937,27 @@ jar { exclude "**/*.jar" exclude "**/*.jar.*" - inputs.dir("$classes") - outputs.file("$jalviewDir/$packageDir/$archiveName") + inputs.dir(classesDir) + outputs.file("${jalviewDir}/${packageDir}/${archiveName}") } + task copyJars(type: Copy) { - from fileTree("$classes").include("**/*.jar").include("*.jar").files - into "$jalviewDir/$packageDir" + from fileTree(dir: classesDir, 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 } } + task makeDist { group = "build" description = "Put all required libraries in dist" @@ -612,9 +967,10 @@ task makeDist { dependsOn cleanPackageDir dependsOn syncJars dependsOn jar - outputs.dir("$jalviewDir/$packageDir") + outputs.dir("${jalviewDir}/${packageDir}") } + task cleanDist { dependsOn cleanPackageDir dependsOn cleanTest @@ -622,78 +978,105 @@ task cleanDist { } shadowJar { - dependsOn makeDist - from ("$jalviewDir/$libDistDir") { + group = "distribution" + 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 getdownResourceDir = getdownResourceDir def getdownResourceFilenames = [] + doFirst { + // clean the getdown website and files dir before creating getdown folders + delete getdownWebsiteDir + delete getdownFilesDir + + copy { + from buildProperties + rename(build_properties_file, getdown_build_properties) + into getdownAppDir + } + getdownWebsiteResourceFilenames += "${getdownAppDistDir}/${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) - props.put("getdown_txt_multi_java_location", getdown_alt_multi_java_location) - - if (getdown_local == "true") { - getdown_app_base = "file://"+file(getdownWebsiteDir).getAbsolutePath() + if (getdownAltJavaMinVersion != null && getdownAltJavaMinVersion.length() > 0) { + props.put("getdown_txt_java_min_version", getdownAltJavaMinVersion) + } + if (getdownAltJavaMaxVersion != null && getdownAltJavaMaxVersion.length() > 0) { + props.put("getdown_txt_java_max_version", getdownAltJavaMaxVersion) + } + if (getdownAltMultiJavaLocation != null && getdownAltMultiJavaLocation.length() > 0) { + props.put("getdown_txt_multi_java_location", getdownAltMultiJavaLocation) } - props.put("getdown_txt_appbase", getdown_app_base) + + props.put("getdown_txt_appbase", getdownAppBase) 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 { from filename - into project.ext.getdownResourceDir + into getdownResourceDir } } def codeFiles = [] - makeDist.outputs.files.each{ f -> + fileTree(file(packageDir)).each{ f -> if (f.isDirectory()) { def files = fileTree(dir: f, include: ["*"]).getFiles() codeFiles += files @@ -702,180 +1085,414 @@ task getdownWebsite() { } } codeFiles.sort().each{f -> - def line = "code = " + getdown_app_dir + '/' + f.getName() + "\n" + def name = f.getName() + def line = "code = ${getdownAppDistDir}/${name}\n" getdownTextString += line copy { from f.getPath() - into project.ext.getdownAppDir + into getdownAppDir } } // 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 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("${getdownWebsiteDir}/getdown.txt") getdown_txt.write(getdownTextString) + def getdownLaunchJvl = getdown_launch_jvl_name + ( (jvlChannelName != null && jvlChannelName.length() > 0)?"-${jvlChannelName}":"" ) + ".jvl" + def launchJvl = file("${getdownWebsiteDir}/${getdownLaunchJvl}") + launchJvl.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 getdownWebsiteDir } copy { from getdownLauncher - into project.ext.getdownFilesDir + if (file(getdownLauncher).getName() != getdown_launcher) { + rename(file(getdownLauncher).getName(), getdown_launcher) + } + into 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 launchJvl 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 "${getdownFilesDir}/${getdown_resource_dir}" } } - inputs.dir(jalviewDir + '/' + packageDir) - outputs.dir(project.ext.getdownWebsiteDir) - outputs.dir(project.ext.getdownFilesDir) + if (buildDist) { + inputs.dir("${jalviewDir}/${packageDir}") + } + outputs.dir(getdownWebsiteDir) + outputs.dir(getdownFilesDir) } + +// a helper task to allow getdown digest of any dir: `gradle getdownDigestDir -PDIGESTDIR=/path/to/my/random/getdown/dir +task getdownDigestDir(type: JavaExec) { + def digestDirPropertyName = "DIGESTDIR" + description = "Digest a local dir (-P${digestDirPropertyName}=...) for getdown" + doFirst { + classpath = files(getdownLauncher) + def digestDir = findProperty(digestDirPropertyName) + if (digestDir == null) { + throw new GradleException("Must provide a DIGESTDIR value to produce an alternative getdown digest") + } + args digestDir + } + main = "com.threerings.getdown.tools.Digester" +} + + 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(getdownLauncher) + } main = "com.threerings.getdown.tools.Digester" - args project.ext.getdownWebsiteDir - inputs.dir(project.ext.getdownWebsiteDir) - outputs.file(project.ext.getdownWebsiteDir + '/' + "digest2.txt") + args getdownWebsiteDir + inputs.dir(getdownWebsiteDir) + outputs.file("${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 getdownWebsiteDir + delete getdownFilesDir + } } + install4j { - def install4jHomeDir = "/opt/install4j" - def hostname = "hostname".execute().text.trim() - if (hostname.equals("jv-bamboo")) { - install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j" - } else if (OperatingSystem.current().isMacOsX()) { - install4jHomeDir = '/Applications/install4j.app/Contents/Resources/app' - if (! file(install4jHomeDir).exists()) { - install4jHomeDir = System.getProperty("user.home")+install4jHomeDir - } - } else if (OperatingSystem.current().isLinux()) { + if (file(install4jHomeDir).exists()) { + // good to go! + } else if (file(System.getProperty("user.home")+"/buildtools/install4j").exists()) { install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j" + } else if (file("/Applications/install4j.app/Contents/Resources/app").exists()) { + install4jHomeDir = "/Applications/install4j.app/Contents/Resources/app" } - installDir = file(install4jHomeDir) - mediaTypes = Arrays.asList(install4jMediaTypes.split(",")) -} - -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 - ] - ) - 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']) + installDir(file(install4jHomeDir)) + + mediaTypes = Arrays.asList(install4j_media_types.split(",")) +} + + +task copyInstall4jTemplate { + def install4jTemplateFile = file("${install4jDir}/${install4j_template}") + def install4jFileAssociationsFile = file("${install4jDir}/${install4j_installer_file_associations}") + inputs.file(install4jTemplateFile) + inputs.file(install4jFileAssociationsFile) + outputs.file(install4jConfFile) + + doLast { + def install4jConfigXml = new XmlParser().parse(install4jTemplateFile) + + // turn off code signing if no OSX_KEYPASS + if (OSX_KEYPASS == "") { + install4jConfigXml.'**'.codeSigning.each { codeSigning -> + codeSigning.'@macEnabled' = "false" + } + install4jConfigXml.'**'.windows.each { windows -> + windows.'@runPostProcessor' = "false" + } + } + + // turn off checksum creation for LOCAL channel + def e = install4jConfigXml.application[0] + if (CHANNEL == "LOCAL") { + e.'@createChecksums' = "false" + } else { + e.'@createChecksums' = "true" + } + + // put file association actions where placeholder action is + def install4jFileAssociationsText = install4jFileAssociationsFile.text + def fileAssociationActions = new XmlParser().parseText("${install4jFileAssociationsText}") + install4jConfigXml.'**'.action.any { a -> + if (a.'@name' == 'EXTENSIONS_REPLACED_BY_GRADLE') { + def parent = a.parent() + parent.remove(a) + fileAssociationActions.each { faa -> + parent.append(faa) + } + // don't need to continue in .any loop once replacements have been made + return true + } } + + // write install4j file + install4jConfFile.text = XmlUtil.serialize(install4jConfigXml) } - into install4jDir - outputs.files(install4jConf) +} - doLast { - def installerFileAssociationsXml = file("$install4jDir/$install4jInstallerFileAssociations").text - ant.replaceregexp( - byline: false, - flags: "s", - match: '', - //match: '', - replace: installerFileAssociationsXml, - file: install4jConf - ) + +clean { + doFirst { + delete install4jConfFile } } + task installers(type: com.install4j.gradle.Install4jTask) { group = "distribution" description = "Create the install4j installers" + dependsOn setGitVals 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" + + projectFile = install4jConfFile + + // create an md5 for the input files to use as version for install4j conf file + def digest = MessageDigest.getInstance("MD5") + digest.update( + (file("${install4jDir}/${install4j_template}").text + + file("${install4jDir}/${install4j_info_plist_file_associations}").text + + file("${install4jDir}/${install4j_installer_file_associations}").text).bytes) + def filesMd5 = new BigInteger(1, digest.digest()).toString(16) + if (filesMd5.length() >= 8) { + filesMd5 = filesMd5.substring(0,8) + } + def install4jTemplateVersion = "${JALVIEW_VERSION}_F${filesMd5}_C${gitHash}" + // make install4jBuildDir relative to jalviewDir + def install4jBuildDir = "${install4j_build_dir}/${JAVA_VERSION}" + + variables = [ + 'JALVIEW_NAME': getdown_txt_title, + 'JALVIEW_DIR': "../..", + 'OSX_KEYSTORE': OSX_KEYSTORE, + 'JSIGN_SH': JSIGN_SH, + 'JRE_DIR': getdown_app_dir_java, + 'INSTALLER_TEMPLATE_VERSION': install4jTemplateVersion, + 'JALVIEW_VERSION': JALVIEW_VERSION, + 'JAVA_MIN_VERSION': JAVA_MIN_VERSION, + 'JAVA_MAX_VERSION': JAVA_MAX_VERSION, + 'JAVA_VERSION': JAVA_VERSION, + 'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION, + 'VERSION': JALVIEW_VERSION, + 'MACOS_JAVA_VM_DIR': macosJavaVMDir, + 'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir, + 'LINUX_JAVA_VM_DIR': linuxJavaVMDir, + 'MACOS_JAVA_VM_TGZ': macosJavaVMTgz, + 'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz, + 'LINUX_JAVA_VM_TGZ': linuxJavaVMTgz, + 'COPYRIGHT_MESSAGE': install4j_copyright_message, + 'MACOS_BUNDLE_ID': install4j_macOS_bundle_id, + 'INSTALLER_NAME': install4j_installer_name, + 'INSTALL4J_UTILS_DIR': install4j_utils_dir, + 'GETDOWN_WEBSITE_DIR': getdown_website_dir, + 'GETDOWN_FILES_DIR': getdown_files_dir, + 'GETDOWN_RESOURCE_DIR': getdown_resource_dir, + 'GETDOWN_DIST_DIR': getdownAppDistDir, + 'GETDOWN_ALT_DIR': getdown_app_dir_alt, + 'GETDOWN_INSTALL_DIR': getdown_install_dir, + 'INFO_PLIST_FILE_ASSOCIATIONS_FILE': install4j_info_plist_file_associations, + 'BUILD_DIR': install4jBuildDir, + ] + + destination = "${jalviewDir}/${install4jBuildDir}" buildSelected = true + if (install4j_faster.equals("true") || CHANNEL.startsWith("LOCAL")) { + faster = true + disableSigning = true + } + if (OSX_KEYPASS) { - macKeystorePassword=OSX_KEYPASS - + macKeystorePassword = OSX_KEYPASS } - - inputs.dir(project.ext.getdownWebsiteDir) - inputs.file(install4jConf) + + doFirst { + println("Using projectFile "+projectFile) + } + + inputs.dir(getdownWebsiteDir) + inputs.file(install4jConfFile) + inputs.file("${install4jDir}/${install4j_info_plist_file_associations}") inputs.dir(macosJavaVMDir) inputs.dir(windowsJavaVMDir) - outputs.dir("$jalviewDir/$install4jBuildDir/$JAVA_VERSION") + outputs.dir("${jalviewDir}/${install4j_build_dir}/${JAVA_VERSION}") } -clean { - 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", + "**/*.log", + ] + 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", + ] + def INCLUDE_FILES=[ + ".settings/org.eclipse.jdt.core.jalview.prefs", + ] + + 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) { + include(INCLUDE_FILES) + } +// 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("${classesDir}/${help_dir}") + outputs.dir("${buildDir}/distributions/${help_dir}") } + +// LARGE AMOUNT OF JALVIEWJS STUFF DELETED HERE +task eclipseAutoBuildTask {} +task eclipseSynchronizationTask {}