JAL-4059 Checked through and fixed build tasks
[jalview.git] / build.gradle
index 4aa019c..751e6c3 100644 (file)
@@ -52,7 +52,7 @@ plugins {
   id 'application'
   id 'eclipse'
   id "com.diffplug.gradle.spotless" version "3.28.0"
-  id 'com.github.johnrengelman.shadow' version '4.0.3'
+  id 'com.github.johnrengelman.shadow' version '6.0.0'
   id 'com.install4j.gradle' version '10.0.3'
   id 'com.dorongold.task-tree' version '2.1.1' // only needed to display task dependency tree with  gradle task1 [task2 ...] taskTree
   id 'com.palantir.git-version' version '0.13.0' apply false
@@ -563,6 +563,7 @@ ext {
   }
   jalviewjsTransferSiteLibDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_lib")
   jalviewjsTransferSiteSwingJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_swingjs")
+  jalviewjsTransferSiteMergeDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_merge")
   jalviewjsTransferSiteCoreDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_core")
   jalviewjsJalviewCoreHtmlFile = string("")
   jalviewjsJalviewCoreName = string(jalviewjs_core_name)
@@ -1851,8 +1852,9 @@ tasks.withType(Test).matching {t -> t.getName().startsWith("testTask")}.all { te
     showExceptions true
     showCauses true
     showStackTraces true
-    showStandardStreams true
-
+    if (test_output) {
+      showStandardStreams true
+    }
     info.events = [ TestLogEvent.FAILED ]
   }
 
@@ -2155,12 +2157,33 @@ shadowJar {
   if (buildDist) {
     dependsOn makeDist
   }
-  from ("${jalviewDir}/${libDistDir}") {
-    include("*.jar")
-  }
-  manifest {
-    attributes "Implementation-Version": JALVIEW_VERSION,
-    "Application-Name": applicationName
+
+  def jarFiles = fileTree(dir: "${jalviewDir}/${libDistDir}", include: "*.jar", exclude: "regex.jar").getFiles()
+  def groovyJars = jarFiles.findAll {it1 -> file(it1).getName().startsWith("groovy-swing")}
+  def otherJars = jarFiles.findAll {it2 -> !file(it2).getName().startsWith("groovy-swing")}
+  from groovyJars
+  from otherJars
+
+  // we need to include the groovy-swing Include-Package for it to run in the shadowJar
+  doFirst {
+    def jarFileManifests = []
+    groovyJars.each { jarFile ->
+      def mf = zipTree(jarFile).getFiles().find { it.getName().equals("MANIFEST.MF") }
+      if (mf != null) {
+        jarFileManifests += mf
+      }
+    }
+
+    manifest {
+      attributes "Implementation-Version": JALVIEW_VERSION, "Application-Name": applicationName
+      from (jarFileManifests) {
+        eachEntry { details ->
+          if (!details.key.equals("Import-Package")) {
+            details.exclude()
+          }
+        }
+      }
+    }
   }
 
   duplicatesStrategy "INCLUDE"
@@ -3022,6 +3045,7 @@ task sourceDist(type: Tar) {
   into project.name
 
   def EXCLUDE_FILES=[
+    "dist/*",
     "build/*",
     "bin/*",
     "test-output/",
@@ -3377,6 +3401,8 @@ task jalviewjsTransferUnzipSwingJs {
     copy {
       from zipTree(file_zip)
       into "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
+      exclude "**.html"
+      exclude "**.htm"
     }
   }
 
@@ -3386,13 +3412,29 @@ task jalviewjsTransferUnzipSwingJs {
 
 
 task jalviewjsTransferUnzipLib {
-  def zipFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_libjs_dir}", include: "*.zip")
+  def zipFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_libjs_dir}", include: "*.zip").sort()
 
   doLast {
     zipFiles.each { file_zip -> 
       copy {
         from zipTree(file_zip)
         into "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
+        exclude "**.html"
+        exclude "**.htm"
+
+        // The following replace() is needed due to a mismatch in Jmol calls to
+        // colorPtToFFRGB$javajs_util_T3d when only colorPtToFFRGB$javajs_util_T3 is defined
+        // in the SwingJS.zip (github or the one distributed with JSmol)
+        if (file_zip.getName().equals("Jmol-SwingJS.zip")) {
+          filter { line ->
+            def l = ""
+            while(!line.equals(l)) {
+              line = line.replace('colorPtToFFRGB$javajs_util_T3d', 'colorPtToFFRGB$javajs_util_T3')
+              l = line
+            }
+            return line
+          }
+        }
       }
     }
   }
@@ -3403,8 +3445,8 @@ task jalviewjsTransferUnzipLib {
 
 
 task jalviewjsTransferUnzipAllLibs {
-  dependsOn jalviewjsTransferUnzipSwingJs
   dependsOn jalviewjsTransferUnzipLib
+  dependsOn jalviewjsTransferUnzipSwingJs
 }
 
 
@@ -3462,7 +3504,7 @@ task jalviewjsSyncAllLibs (type: Sync) {
     include "**"
   }
 
-  // should this be exclude really ?
+  // should this be exclude really ? No, swingjs dir should be transferred last (and overwrite)
   duplicatesStrategy "INCLUDE"
 
   outputs.files outputFiles
@@ -3654,6 +3696,38 @@ DEBUG: ${eclipseDebug}
 }
 
 
+task jalviewjsTranserSiteMergeDirs (type: Sync) {
+  dependsOn jalviewjsTransferUnzipAllLibs
+  dependsOn jalviewjsTransferUnzipSwingJs
+  dependsOn jalviewjsTranspile
+
+  def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteLibDir}")
+  // merge swingjs lib last
+  inputFiles += fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}")
+  // merge jalview files very last
+  inputFiles += fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteJsDir}")
+
+  def outputDir = "${jalviewDir}/${jalviewjsTransferSiteMergeDir}"
+
+  from inputFiles
+  into outputDir
+  def outputFiles = []
+  rename { filename ->
+    outputFiles += "${outputDir}/${filename}"
+    null
+  }
+  preserve {
+    include "**"
+  }
+
+  // should this be exclude really ? No, swingjs dir should be transferred last (and overwrite)
+  duplicatesStrategy "INCLUDE"
+
+  outputs.files outputFiles
+  inputs.files inputFiles
+}
+
+
 def jalviewjsCallCore(String name, FileCollection list, String prefixFile, String suffixFile, String jsfile, String zjsfile, File logOutFile, Boolean logOutConsole) {
 
   def stdout = new ByteArrayOutputStream()
@@ -3668,6 +3742,7 @@ def jalviewjsCallCore(String name, FileCollection list, String prefixFile, Strin
 
   def coreTop = file(prefixFile)
   def coreBottom = file(suffixFile)
+  def missingFiles = []
   coreFile.getParentFile().mkdirs()
   coreFile.createNewFile()
   coreFile.write( coreTop.getText("UTF-8") )
@@ -3681,6 +3756,7 @@ def jalviewjsCallCore(String name, FileCollection list, String prefixFile, Strin
       msg = "...file '"+f.getPath()+"' does not exist, skipping"
       println(msg)
       logOutFile.append(msg+"\n")
+      missingFiles += f
     }
   }
   coreFile.append( coreBottom.getText("UTF-8") )
@@ -3695,7 +3771,7 @@ def jalviewjsCallCore(String name, FileCollection list, String prefixFile, Strin
     classpath = files(["${jalviewDir}/${jalviewjs_closure_compiler}"])
     main = "com.google.javascript.jscomp.CommandLineRunner"
     jvmArgs = [ "-Dfile.encoding=UTF-8" ]
-    args = [ "--compilation_level", "SIMPLE_OPTIMIZATIONS", "--warning_level", "QUIET", "--charset", "UTF-8", "--js", jsfile, "--js_output_file", zjsfile ]
+    args = [ "--compilation_level", jalviewjs_closure_compiler_optimization_level, "--warning_level", "QUIET", "--charset", "UTF-8", "--js", jsfile, "--js_output_file", zjsfile ]
     maxHeapSize = "2g"
 
     msg = "\nRunning '"+commandLine.join(' ')+"'\n"
@@ -3723,6 +3799,11 @@ def jalviewjsCallCore(String name, FileCollection list, String prefixFile, Strin
     }
   }
   msg = "--"
+  if (missingFiles.size() > 0) {
+    msg += "\n!!! These files were listed but missing:\n"
+    missingFiles.each { file -> msg += "!!!  " + file.getPath() + "\n" }
+    msg = "--"
+  }
   println(msg)
   logOutFile.append(msg+"\n")
 }
@@ -3731,13 +3812,12 @@ def jalviewjsCallCore(String name, FileCollection list, String prefixFile, Strin
 task jalviewjsBuildAllCores {
   group "JalviewJS"
   description "Build the core js lib closures listed in the classlists dir"
-  dependsOn jalviewjsTranspile
-  dependsOn jalviewjsTransferUnzipSwingJs
+  dependsOn jalviewjsTranserSiteMergeDirs
 
-  def j2sDir = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${jalviewjs_j2s_subdir}"
-  def swingJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_j2s_subdir}"
-  def libJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteLibDir}/${jalviewjs_j2s_subdir}"
-  def jsDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_js_subdir}"
+  def j2sDir = "${jalviewDir}/${jalviewjsTransferSiteMergeDir}/${jalviewjs_j2s_subdir}"
+  def swingJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteMergeDir}/${jalviewjs_j2s_subdir}"
+  def libJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteMergeDir}/${jalviewjs_j2s_subdir}"
+  def jsDir = "${jalviewDir}/${jalviewjsTransferSiteMergeDir}/${jalviewjs_js_subdir}"
   def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}/${jalviewjs_j2s_subdir}/core"
   def prefixFile = "${jsDir}/core/coretop2.js"
   def suffixFile = "${jsDir}/core/corebottom2.js"
@@ -3798,19 +3878,6 @@ task jalviewjsBuildAllCores {
     outputs.file(zjsfile)
   }
   
-  // _stevesoft core. add any cores without a classlist here (and the inputs and outputs)
-  def stevesoftClasslistName = "_stevesoft"
-  def stevesoftClasslist = [
-    'jsfile': "${outputDir}/core${stevesoftClasslistName}.js",
-    'zjsfile': "${outputDir}/core${stevesoftClasslistName}.z.js",
-    'list': fileTree(dir: j2sDir, include: "com/stevesoft/pat/**/*.js"),
-    'name': stevesoftClasslistName
-  ]
-  jalviewjsCoreClasslists += stevesoftClasslist
-  inputs.files(stevesoftClasslist['list'])
-  outputs.file(stevesoftClasslist['jsfile'])
-  outputs.file(stevesoftClasslist['zjsfile'])
-
   // _all core
   def allClasslistName = "_all"
   def allJsFiles = fileTree(dir: j2sDir, include: "**/*.js")
@@ -3887,6 +3954,7 @@ def jalviewjsPublishCoreTemplate(String coreName, String templateName, File inpu
 
 task jalviewjsPublishCoreTemplates {
   dependsOn jalviewjsBuildAllCores
+
   def inputFileName = "${jalviewDir}/${j2s_coretemplate_html}"
   def inputFile = file(inputFileName)
   def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
@@ -3911,6 +3979,7 @@ task jalviewjsPublishCoreTemplates {
 task jalviewjsSyncCore (type: Sync) {
   dependsOn jalviewjsBuildAllCores
   dependsOn jalviewjsPublishCoreTemplates
+
   def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteCoreDir}")
   def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
 
@@ -3930,8 +3999,18 @@ task jalviewjsSyncCore (type: Sync) {
 
 
 // this Copy version of TransferSiteJs will delete anything else in the target dir
+task jalviewjsCopyTransferSiteMergeDir(type: Copy) {
+  dependsOn jalviewjsTranserSiteMergeDirs
+
+  from "${jalviewDir}/${jalviewjsTransferSiteMergeDir}"
+  into "${jalviewDir}/${jalviewjsSiteDir}"
+}
+
+
+// this Copy version of TransferSiteJs will delete anything else in the target dir
 task jalviewjsCopyTransferSiteJs(type: Copy) {
   dependsOn jalviewjsTranspile
+
   from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
   into "${jalviewDir}/${jalviewjsSiteDir}"
 }
@@ -3962,7 +4041,7 @@ jalviewjsSyncBuildProperties.mustRunAfter jalviewjsSyncTransferSiteJs
 task jalviewjsPrepareSite {
   group "JalviewJS"
   description "Prepares the website folder including unzipping files and copying resources"
-  dependsOn jalviewjsSyncAllLibs
+  //dependsOn jalviewjsSyncAllLibs // now using jalviewjsCopyTransferSiteMergeDir
   dependsOn jalviewjsSyncResources
   dependsOn jalviewjsSyncSiteResources
   dependsOn jalviewjsSyncBuildProperties
@@ -3973,7 +4052,7 @@ task jalviewjsPrepareSite {
 task jalviewjsBuildSite {
   group "JalviewJS"
   description "Builds the whole website including transpiled code"
-  dependsOn jalviewjsCopyTransferSiteJs
+  dependsOn jalviewjsCopyTransferSiteMergeDir
   dependsOn jalviewjsPrepareSite
 }
 
@@ -4303,12 +4382,14 @@ task jalviewjsLaunchTest {
       execStdout = stdout
       execStderr = stderr
     }
-    def execArgs = [
+    // macOS not running properly with timeout arguments
+    def execArgs = macOS ? [] : [
+      "--virtual-time-budget=${timeoutms}",
+    ]
+    execArgs += [
       "--no-sandbox", // --no-sandbox IS USED BY THE THORIUM APPIMAGE ON THE BUILDSERVER
       "--headless=new",
       "--disable-gpu",
-      "--timeout=${timeoutms}",
-      "--virtual-time-budget=${timeoutms}",
       "--user-data-dir=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_chromium_user_dir}",
       "--profile-directory=${jalviewjs_chromium_profile_name}",
       "--allow-file-access-from-files",