JAL-3252 Don't add java_location until we've got a working mechanism
[jalview.git] / build.gradle
index 69dc6da..916d1d0 100644 (file)
@@ -3,8 +3,9 @@ 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 {
@@ -17,7 +18,7 @@ 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.4' // only needed to display task dependency tree with  gradle task1 [task2 ...] taskTree
 }
 
@@ -37,7 +38,7 @@ dependencies {
 
 // 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.toString()
+  return o == null ? "" : o.toString()
 }
 
 
@@ -55,10 +56,12 @@ ext {
       localPropsFIS.close()
       p.each {
         key, val -> 
-          def over = getProperty(key) != null
+          def oldval = findProperty(key)
           setProperty(key, val)
-          if (over) {
-            println("Overriding property '${key}' with local.properties value '${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) {
@@ -207,11 +210,16 @@ ext {
     break
 
     default: // something wrong specified
-    print("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]")
+    println("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]")
     exit
     break
 
   }
+  // override getdown_app_base if requested
+  if (findProperty("getdown_appbase_override") != null) {
+    getdown_app_base = string(getProperty("getdown_appbase_override"))
+    println("Overriding getdown appbase with '${getdown_app_base}'")
+  }
 
   getdownAppDir = string("${getdownWebsiteDir}/${getdown_app_dir}")
   //getdownJ11libDir = "${getdownWebsiteDir}/${getdown_j11lib_dir}"
@@ -238,22 +246,22 @@ ext {
     compile_source_compatibility = 1.8
     compile_target_compatibility = 1.8
     // these are getdown.txt properties defined dependent on the JAVA_VERSION
-    getdown_alt_java_min_version = getdown_alt_java8_min_version
-    getdown_alt_java_max_version = getdown_alt_java8_max_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
-    getdown_alt_multi_java_location = getdown_alt_java8_txt_multi_java_location
+    getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java8_txt_multi_java_location"))
     // this property is for the Java library used in eclipse
-    eclipse_java_runtime_name = string("JavaSE-1.8")
+    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
-    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 = string("JavaSE-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,
@@ -266,10 +274,10 @@ ext {
     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 = string("JavaSE-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,
@@ -282,13 +290,15 @@ ext {
 
 
   // for install4j
+  JAVA_MIN_VERSION = JAVA_VERSION
+  JAVA_MAX_VERSION = JAVA_VERSION
   macosJavaVMDir = string("${System.env.HOME}/buildtools/jre/openjdk-java_vm/getdown/macos-jre${JAVA_VERSION}/jre")
   macosJavaVMTgz = string("${System.env.HOME}/buildtools/jre/openjdk-java_vm/install4j/tgz/macos-jre${JAVA_VERSION}.tar.gz")
   windowsJavaVMDir = string("${System.env.HOME}/buildtools/jre/openjdk-java_vm/getdown/windows-jre${JAVA_VERSION}/jre")
   windowsJavaVMTgz = string("${System.env.HOME}/buildtools/jre/openjdk-java_vm/install4j/tgz/windows-jre${JAVA_VERSION}.tar.gz")
   install4jDir = string("${jalviewDir}/${install4j_utils_dir}")
-  install4jConfFileName = string("jalview-installers-java${JAVA_VERSION}.install4j")
-  install4jConfFile = string("${install4jDir}/${install4jConfFileName}")
+  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)
@@ -299,8 +309,7 @@ ext {
   buildingHTML = string("${jalviewDir}/${docDir}/building.html")
   helpFile = string("${classesDir}/${help_dir}/help.jhm")
   helpParentDir = string("${jalviewDir}/${help_parent_dir}")
-  helpDir = string("${help_dir}")
-  helpSourceDir = string("${helpParentDir}/${helpDir}")
+  helpSourceDir = string("${helpParentDir}/${help_dir}")
 
 
   relativeBuildDir = file(jalviewDirAbsolutePath).toPath().relativize(buildDir.toPath())
@@ -338,11 +347,13 @@ sourceSets {
 
     resources {
       srcDirs resourceDir
+      srcDirs += helpParentDir
     }
 
     jar.destinationDir = file("${jalviewDir}/${packageDir}")
 
     compileClasspath = files(sourceSets.main.java.outputDir)
+    //compileClasspath += files(sourceSets.main.resources.srcDirs)
     compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
 
     runtimeClasspath = compileClasspath
@@ -451,8 +462,8 @@ eclipse {
         cp.entries.removeAll(removeTheseToo)
 
         //cp.entries += new Output("${eclipse_bin_dir}/main")
-        if (file(helpSourceDir).isDirectory()) {
-          cp.entries += new Library(fileReference(helpSourceDir))
+        if (file(helpParentDir).isDirectory()) {
+          cp.entries += new Library(fileReference(helpParentDir))
         }
         if (file(resourceDir).isDirectory()) {
           cp.entries += new Library(fileReference(resourceDir))
@@ -460,7 +471,7 @@ eclipse {
 
         HashMap<String, Boolean> alreadyAddedLibPath = new HashMap<>();
 
-        sourceSets.main.compileClasspath.findAll { it.name.endsWith(".jar") }.each {
+        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, especially if they don't exist
@@ -480,7 +491,6 @@ eclipse {
           }
         }
 
-        //fileTree(dir: "$jalviewDir/$utilsDir", include: ["test*/*.jar"]).each {
         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()) {
@@ -514,7 +524,7 @@ eclipse {
     // for the IDE, use java 11 compatibility
     sourceCompatibility = compile_source_compatibility
     targetCompatibility = compile_target_compatibility
-    javaRuntimeName = eclipse_java_runtime_name
+    javaRuntimeName = eclipseJavaRuntimeName
 
     // add in jalview project specific properties/preferences into eclipse core preferences
     file {
@@ -744,7 +754,7 @@ task syncDocs(type: Sync) {
 
 task copyHelp(type: Copy) {
   def inputDir = helpSourceDir
-  def outputDir = "${classesDir}/${helpDir}"
+  def outputDir = "${classesDir}/${help_dir}"
   from(inputDir) {
     exclude '**/*.gif'
     exclude '**/*.jpg'
@@ -826,7 +836,7 @@ task buildIndices(type: JavaExec) {
   dependsOn copyHelp
   classpath = sourceSets.main.compileClasspath
   main = "com.sun.java.help.search.Indexer"
-  workingDir = "${classesDir}/${helpDir}"
+  workingDir = "${classesDir}/${help_dir}"
   def argDir = "html"
   args = [ argDir ]
   inputs.dir("${workingDir}/${argDir}")
@@ -862,8 +872,7 @@ task linkCheck(type: JavaExec) {
   classpath = files("${jalviewDir}/${utilsDir}")
   main = "HelpLinksChecker"
   workingDir = jalviewDir
-  def help = "${classesDir}/${helpDir}"
-  args = [ "${classesDir}/${helpDir}", "-nointernet" ]
+  args = [ "${classesDir}/${help_dir}", "-nointernet" ]
 
   def outFOS = new FileOutputStream(helpLinksCheckerOutFile, false) // false == don't append
   def errFOS = outFOS
@@ -874,13 +883,13 @@ task linkCheck(type: JavaExec) {
     outFOS,
     errorOutput)
 
-  inputs.dir("${classesDir}/${helpDir}")
+  inputs.dir("${classesDir}/${help_dir}")
   outputs.file(helpLinksCheckerOutFile)
 }
 
 // import the pubhtmlhelp target
 ant.properties.basedir = "${jalviewDir}"
-ant.properties.helpBuildDir = "${jalviewDirAbsolutePath}/${classes_dir}/${helpDir}"
+ant.properties.helpBuildDir = "${jalviewDirAbsolutePath}/${classes_dir}/${help_dir}"
 ant.importBuild "${utilsDir}/publishHelp.xml"
 
 
@@ -996,13 +1005,15 @@ task getdownWebsite() {
 
     // go through properties looking for getdown_txt_...
     def props = project.properties.sort { it.key }
-    if (getdown_alt_java_min_version.length() > 0) {
-      props.put("getdown_txt_java_min_version", getdown_alt_java_min_version)
+    if (getdownAltJavaMinVersion != null && getdownAltJavaMinVersion.length() > 0) {
+      props.put("getdown_txt_java_min_version", getdownAltJavaMinVersion)
     }
-    if (getdown_alt_java_max_version.length() > 0) {
-      props.put("getdown_txt_java_max_version", getdown_alt_java_max_version)
+    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_multi_java_location", getdown_alt_multi_java_location)
 
     props.put("getdown_txt_appbase", getdown_app_base)
     props.each{ prop, val ->
@@ -1206,84 +1217,46 @@ install4j {
   installDir(file(install4jHomeDir))
 
   mediaTypes = Arrays.asList(install4j_media_types.split(","))
-  if (install4j_faster.equals("true")) {
-    faster = true
-  }
 }
 
 
-task copyInstall4jTemplate(type: Copy) {
-  from (install4jDir) {
-    include install4j_template
-    rename (install4j_template, install4jConfFileName)
-    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': install4j_info_plist_file_associations,
-        'COPYRIGHT_MESSAGE': install4j_copyright_message,
-        'MACOS_BUNDLE_ID': install4j_macOS_bundle_id,
-        '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
-      ]
-    )
+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 == "") {
-      filter(ReplaceTokens,
-        beginToken: 'codeSigning macEnabled="',
-        endToken: '"',
-        tokens: [
-          'true': 'codeSigning macEnabled="false"'
-        ]
-      )
-      filter(ReplaceTokens,
-        beginToken: 'runPostProcessor="true" ',
-        endToken: 'Processor',
-        tokens: [
-          'post': 'runPostProcessor="false" postProcessor'
-        ]
-      )
+      install4jConfigXml.'**'.codeSigning.each { codeSigning ->
+        codeSigning.'@macEnabled' = "false"
+      }
+      install4jConfigXml.'**'.windows.each { windows ->
+        windows.'@runPostProcessor' = "false"
+      }
     }
-  }
-  into install4jDir
-  outputs.files(install4jConfFile)
 
-  doLast {
-    // include file associations in installer
-    def installerFileAssociationsXml = file("${install4jDir}/${install4j_installer_file_associations}").text
-    ant.replaceregexp(
-      byline: false,
-      flags: "s",
-      match: '<action name="EXTENSIONS_REPLACED_BY_GRADLE".*?</action>',
-      replace: installerFileAssociationsXml,
-      file: install4jConfFile
-    )
-    /*
-    // include uninstaller applescript app files in dmg
-    def installerDMGUninstallerXml = file("$install4jDir/$install4j_DMG_uninstaller_app_files").text
-    ant.replaceregexp(
-    byline: false,
-    flags: "s",
-    match: '<file name="UNINSTALL_OLD_JALVIEW_APP_REPLACED_IN_GRADLE" file=.*?>',
-    replace: installerDMGUninstallerXml,
-    file: install4jConfFile
-    )
-     */
+    // put file association actions where placeholder action is
+    def install4jFileAssociationsText = install4jFileAssociationsFile.text
+    def fileAssociationActions = new XmlParser().parseText("<actions>${install4jFileAssociationsText}</actions>")
+    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)
   }
 }
 
@@ -1298,15 +1271,59 @@ clean {
 task installers(type: com.install4j.gradle.Install4jTask) {
   group = "distribution"
   description = "Create the install4j installers"
+  dependsOn setGitVals
   dependsOn getdown
   dependsOn copyInstall4jTemplate
-  projectFile = file(install4jConfFile)
-  variables = [majorVersion: version.substring(2, 11), build: 001, OSX_KEYSTORE: OSX_KEYSTORE, JSIGN_SH: JSIGN_SH]
+
+  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}"
+
+  variables = [
+    '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,
+    'MACOS_JAVA_VM_TGZ': macosJavaVMTgz,
+    'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir,
+    'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz,
+    'COPYRIGHT_MESSAGE': install4j_copyright_message,
+    'MACOS_BUNDLE_ID': install4j_macOS_bundle_id,
+    '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,
+    'INFO_PLIST_FILE_ASSOCIATIONS_FILE': install4j_info_plist_file_associations,
+  ]
+
   destination = "${jalviewDir}/${install4j_build_dir}/${JAVA_VERSION}"
   buildSelected = true
 
+  if (install4j_faster.equals("true") || CHANNEL.startsWith("DEVELOP") || CHANNEL.startsWith("LOCAL")) {
+    // this doesn't seem to work
+    faster = true
+    disableSigning = true
+  }
+
   if (OSX_KEYPASS) {
-    macKeystorePassword=OSX_KEYPASS
+    macKeystorePassword = OSX_KEYPASS
   }
 
   doFirst {
@@ -1315,13 +1332,14 @@ task installers(type: com.install4j.gradle.Install4jTask) {
 
   inputs.dir(getdownWebsiteDir)
   inputs.file(install4jConfFile)
+  inputs.file("${install4jDir}/${install4j_info_plist_file_associations}")
   inputs.dir(macosJavaVMDir)
   inputs.dir(windowsJavaVMDir)
   outputs.dir("${jalviewDir}/${install4j_build_dir}/${JAVA_VERSION}")
 }
 
 
-task sourceDist (type: Tar) {
+task sourceDist(type: Tar) {
   
   def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
   def outputFileName = "${project.name}_${VERSION_UNDERSCORES}.tar.gz"
@@ -1399,12 +1417,14 @@ task sourceDist (type: Tar) {
 }
 
 
-task helppages  {
+task helppages {
   dependsOn copyHelp
   dependsOn pubhtmlhelp
   
-  inputs.dir("${classesDir}/${helpDir}")
-  outputs.dir("${buildDir}/distributions/${helpDir}")
+  inputs.dir("${classesDir}/${help_dir}")
+  outputs.dir("${buildDir}/distributions/${help_dir}")
 }
 
 // LARGE AMOUNT OF JALVIEWJS STUFF DELETED HERE
+task eclipseAutoBuildTask {}
+task eclipseSynchronizationTask {}