JAL-3130 JAL-3007 Added gradle build for Java 11. Now in root jalview dir
[jalview.git] / build.gradle
1 import org.apache.tools.ant.filters.ReplaceTokens
2 import org.gradle.internal.os.OperatingSystem
3
4
5 buildscript {
6   dependencies {
7     //classpath files("$gradlePluginsDir/gradle-macappbundle-2.3.0-patched-2.3.0.jar")
8   }
9 }
10
11 plugins {
12   id 'java'
13   id 'application'
14   id 'com.github.johnrengelman.shadow' version '4.0.3'
15   id 'com.install4j.gradle' version '7.0.9'
16 }
17
18 repositories {
19   jcenter()
20   mavenCentral()
21   flatDir {
22     dirs gradlePluginsDir
23   }
24 }
25
26 mainClassName = launcherClass
27
28 sourceSets {
29
30   main {
31     java {
32       srcDirs "$jalviewDir/$sourceDir"
33       outputDir = file("$jalviewDir/$classesDir")
34     }
35
36     resources {
37       srcDirs "$jalviewDir/$resourceDir"
38       srcDirs "$jalviewDir/$libDir"
39     }
40
41     jar.destinationDir = file("$jalviewDir/$packageDir")
42
43     compileClasspath = files(sourceSets.main.java.outputDir)
44     compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"])
45     //compileClasspath += fileTree(dir: "$jalviewDir/$j11libDir", include: ["*.jar"])
46
47     runtimeClasspath = compileClasspath
48   }
49
50   test {
51     java {
52       srcDirs "$jalviewDir/$testSourceDir"
53       outputDir = file("$jalviewDir/$testOutputDir")
54     }
55
56     resources {
57       srcDirs = sourceSets.main.resources.srcDirs
58     }
59
60     compileClasspath = sourceSets.main.compileClasspath
61     compileClasspath += files( sourceSets.test.java.outputDir )
62     compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"])
63
64     runtimeClasspath = compileClasspath
65   }
66
67   modules {
68     compileClasspath = fileTree(dir: "$jalviewDir/$j11libDir", include: ["*.jar"])
69
70     runtimeClasspath = compileClasspath
71   }
72
73 }
74
75 compileJava {
76
77   doFirst {
78     if (JAVA_VERSION.equals("1.8")) {
79       sourceCompatibility = 1.8
80       targetCompatibility = 1.8
81     } else if (JAVA_VERSION.equals("11")) {
82       sourceCompatibility = 11
83       targetCompatibility = 11
84
85       options.compilerArgs = [
86         '--module-path', sourceSets.modules.compileClasspath.asPath,
87         '--add-modules', j11modules
88       ]
89     }
90   }
91
92 }
93
94 clean {
95   delete sourceSets.main.java.outputDir
96 }
97
98 cleanTest {
99   delete sourceSets.test.java.outputDir
100 }
101
102 def getDate(format) {
103   def date = new Date()
104   //return date.format("dd MMMM yyyy")
105   return date.format(format)
106 }
107
108 def getGitHash() {
109   def stdout = new ByteArrayOutputStream()
110   exec {
111     commandLine "git", "rev-parse", "--short", "HEAD"
112     standardOutput = stdout
113     workingDir = jalviewDir
114   }
115   return stdout.toString().trim()
116 }
117
118 def getGitBranch() {
119   def stdout = new ByteArrayOutputStream()
120   exec {
121     commandLine "git", "rev-parse", "--abbrev-ref", "HEAD"
122     standardOutput = stdout
123     workingDir = jalviewDir
124   }
125   return stdout.toString().trim()
126 }
127
128 task createBuildProperties(type: WriteProperties) {
129   inputs.dir("$jalviewDir/$sourceDir")
130   inputs.dir("$jalviewDir/$resourceDir")
131   outputFile "$jalviewDir/$classesDir/$buildPropertiesFile"
132   /* taking time/date specific comment out to allow better incremental builds */
133   //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss")
134   comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd")
135   property "BUILD_DATE", getDate("dd MMMM yyyy")
136   property "VERSION", JALVIEW_VERSION
137   property "INSTALLATION", INSTALLATION+" git-commit:"+getGitHash()+" ["+getGitBranch()+"]"
138   outputs.file(outputFile)
139   outputs.dir("$jalviewDir/$classesDir")
140 }
141
142 task syncDocs(type: Sync) {
143   def syncDir = "$jalviewDir/$classesDir/$docDir"
144   from fileTree("$jalviewDir/$docDir")
145   into syncDir
146
147 }
148
149 def helpFile = "$jalviewDir/$classesDir/$helpDir/help.jhm"
150 task syncHelp(type: Sync) {
151   inputs.files("$jalviewDir/$helpDir")
152   outputs.files(helpFile)
153
154   def syncDir = "$jalviewDir/$classesDir/$helpDir"
155   from fileTree("$jalviewDir/$helpDir")
156   into syncDir
157 }
158
159 task copyHelp(type: Copy) {
160   def inputDir = "$jalviewDir/$helpDir"
161   def outputDir = "$jalviewDir/$classesDir/$helpDir"
162   from inputDir
163   into outputDir
164   filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': "USING_FILTER"])
165   inputs.dir(inputDir)
166   outputs.files(helpFile)
167   outputs.dir(outputDir)
168 }
169
170 task syncLib(type: Sync) {
171   def syncDir = "$jalviewDir/$classesDir/$libDir"
172   from fileTree("$jalviewDir/$libDir")
173   into syncDir
174 }
175
176 task syncResources(type: Sync) {
177   from "$jalviewDir/$resourceDir"
178   include "**/*.*"
179   into "$jalviewDir/$classesDir"
180   preserve {
181     include "**"
182   }
183 }
184
185 task prepare {
186   dependsOn syncResources
187   dependsOn syncDocs
188   dependsOn copyHelp
189 }
190
191 //testReportDirName = "test-reports" // note that test workingDir will be $jalviewDir
192 test {
193   dependsOn prepare
194   dependsOn compileJava
195   useTestNG {
196     includeGroups testngGroups
197   }
198   workingDir = jalviewDir
199   //systemProperties 'clover.jar' System.properties.clover.jar
200 }
201
202 task buildIndices(type: JavaExec) {
203   dependsOn copyHelp
204   classpath = sourceSets.main.compileClasspath
205   main = "com.sun.java.help.search.Indexer"
206   workingDir = "$jalviewDir/$classesDir/$helpDir"
207   def argDir = "html"
208   args = [ argDir ]
209   inputs.dir("$workingDir/$argDir")
210
211   outputs.dir("$jalviewDir/$classesDir/doc")
212   outputs.dir("$jalviewDir/$classesDir/help")
213   outputs.file("$workingDir/JavaHelpSearch/DOCS")
214   outputs.file("$workingDir/JavaHelpSearch/DOCS.TAB")
215   outputs.file("$workingDir/JavaHelpSearch/OFFSETS")
216   outputs.file("$workingDir/JavaHelpSearch/POSITIONS")
217   outputs.file("$workingDir/JavaHelpSearch/SCHEMA")
218   outputs.file("$workingDir/JavaHelpSearch/TMAP")
219 }
220
221 task compileLinkCheck(type: JavaCompile) {
222   options.fork = true
223   classpath = files("$jalviewDir/$utilsDir")
224   destinationDir = file("$jalviewDir/$utilsDir")
225   source = fileTree(dir: "$jalviewDir/$utilsDir", include: ["HelpLinksChecker.java", "BufferedLineReader.java"])
226
227   outputs.file("$jalviewDir/$utilsDir/HelpLinksChecker.class")
228   outputs.file("$jalviewDir/$utilsDir/BufferedLineReader.class")
229 }
230
231 task linkCheck(type: JavaExec) {
232   dependsOn prepare, compileLinkCheck
233   classpath = files("$jalviewDir/$utilsDir")
234   main = "HelpLinksChecker"
235   workingDir = "$jalviewDir"
236   args = [ "$classesDir/$helpDir", "-nointernet" ]
237
238   doFirst {
239     standardOutput new FileOutputStream("$jalviewDir/$utilsDir/HelpLinksChecker.out")
240   }
241
242   outputs.file("$jalviewDir/$utilsDir/HelpLinksChecker.out")
243 }
244
245 task cleanPackageDir(type: Delete) {
246   delete fileTree("$jalviewDir/$packageDir").include("*.jar")
247 }
248
249 jar {
250   dependsOn linkCheck
251   dependsOn buildIndices
252   dependsOn createBuildProperties
253
254   manifest {
255     attributes "Main-Class": mainClass,
256     "Permissions": "all-permissions",
257     "Application-Name": "Jalview Desktop",
258     "Codebase": application_codebase
259   }
260
261   destinationDir = file("$jalviewDir/$packageDir")
262   archiveName = rootProject.name+".jar"
263
264   exclude "cache*/**"
265   exclude "*.jar"
266   exclude "*.jar.*"
267   exclude "**/*.jar"
268   exclude "**/*.jar.*"
269
270   inputs.dir("$jalviewDir/$classesDir")
271   outputs.file("$jalviewDir/$packageDir/$archiveName")
272 }
273
274 task copyJars(type: Copy) {
275   from fileTree("$jalviewDir/$classesDir").include("**/*.jar").include("*.jar").files
276   into "$jalviewDir/$packageDir"
277 }
278
279 // doing a Sync instead of Copy as Copy doesn't deal with "outputs" very well
280 task syncJars(type: Sync) {
281   from fileTree("$jalviewDir/$libDir").include("**/*.jar").include("*.jar").files
282   into "$jalviewDir/$packageDir"
283   preserve {
284     include jar.archiveName
285   }
286 }
287
288 task makeDist {
289   // order of "cleanPackageDir", "copyJars", "jar" important!
290   jar.mustRunAfter cleanPackageDir
291   syncJars.mustRunAfter cleanPackageDir
292   dependsOn cleanPackageDir
293   dependsOn syncJars
294   dependsOn jar
295   outputs.dir("$jalviewDir/$packageDir")
296 }
297
298 task cleanDist {
299   dependsOn cleanPackageDir
300   dependsOn cleanTest
301   dependsOn clean
302 }
303
304 shadowJar {
305   dependsOn makeDist
306   if (JAVA_VERSION.equals("11")) {
307     from ("$jalviewDir/$j11libDir") {
308       include("*.jar")
309     }
310   }
311   mainClassName = shadowJarMainClass
312   mergeServiceFiles()
313   classifier = "all"
314   minimize()
315 }
316
317 ext {
318   getdownWebsiteDir = jalviewDir + '/' + getdown_website_dir
319   getdownAppDir = getdownWebsiteDir + '/' + getdown_app_dir
320   getdownJ11libDir = getdownWebsiteDir + '/' + getdown_j11lib_dir
321   getdownResourceDir = getdownWebsiteDir + '/' + getdown_resource_dir
322   getdownLauncher = jalviewDir + '/' + getdown_launcher
323   getdownFilesDir = jalviewDir + '/' + getdown_files_dir
324 }
325
326 task getdownWebsite() {
327   dependsOn makeDist
328   def getdownWebsiteResourceFilenames = []
329   def getdownTextString = ""
330   def getdownResourceDir = project.ext.getdownResourceDir
331   def getdownAppDir = project.ext.getdownAppDir
332   def getdownResourceFilenames = []
333   doFirst {
334     // go through properties looking for getdown_txt_...
335     def props = project.properties.sort { it.key }
336     if (JAVA_VERSION.equals("11")) {
337       props.put("getdown_txt_java_min_version", getdown_alt_java11_min_version)
338     } else {
339       props.put("getdown_txt_java_min_version", getdown_alt_java8_min_version)
340     }
341     props.each{ prop, val ->
342       if (prop.startsWith("getdown_txt_") && val != null) {
343         // file values rationalised
344         if (val.indexOf('/') > -1) {
345           def r = null
346           if (val.indexOf('/') == 0) {
347             // absolute path
348             r = file(val)
349           } else if (val.indexOf('/') > 0) {
350             // relative path (relative to jalviewDir)
351             r = file( jalviewDir + '/' + val )
352           }
353           if (r.exists()) {
354             val = getdown_resource_dir + '/' + r.getName()
355             getdownWebsiteResourceFilenames += val
356             getdownResourceFilenames += r.getPath()
357           }
358         }
359         def line = prop.substring(12) + " = " + val + "\n"
360         getdownTextString += line
361       }
362     }
363
364     getdownWebsiteResourceFilenames.each{ filename ->
365       getdownTextString += "resource = "+filename+"\n"
366     }
367     getdownResourceFilenames.each{ filename ->
368       copy {
369         from filename
370         into project.ext.getdownResourceDir
371       }
372     }
373
374     def codeFiles = []
375     makeDist.outputs.files.each{ f ->
376       if (f.isDirectory()) {
377         def files = fileTree(dir: f, include: ["*"]).getFiles()
378         codeFiles += files
379       } else if (f.exists()) {
380         codeFiles += f
381       }
382     }
383     codeFiles.sort().each{f ->
384       def line = "code = " + getdown_app_dir + '/' + f.getName() + "\n"
385       getdownTextString += line
386       copy {
387         from f.getPath()
388         into project.ext.getdownAppDir
389       }
390     }
391
392     if (JAVA_VERSION.equals("11")) {
393       def j11libFiles = fileTree(dir: "$jalviewDir/$j11libDir", include: ["*.jar"]).getFiles()
394       j11libFiles.sort().each{f ->
395         def line = "code = " + getdown_j11lib_dir + '/' + f.getName() + "\n"
396         getdownTextString += line
397         copy {
398           from f.getPath()
399           into project.ext.getdownJ11libDir
400         }
401       }
402     }
403
404     getdownTextString += "code = " + file(getdownLauncher).getName() + "\n"
405     getdownTextString += "class = " + mainClass + "\n"
406
407     def getdown_txt = file(project.ext.getdownWebsiteDir + "/getdown.txt")
408     getdown_txt.write(getdownTextString)
409
410     copy {
411       from getdown_txt
412       into project.ext.getdownFilesDir
413     }
414
415     copy {
416       from getdownLauncher
417       into project.ext.getdownWebsiteDir
418     }
419
420     copy {
421       from getdownLauncher
422       into project.ext.getdownFilesDir
423     }
424
425     copy {
426       from jalviewDir + '/' + project.getProperty('getdown_txt_ui.background_image')
427       from jalviewDir + '/' + project.getProperty('getdown_txt_ui.error_background')
428       from jalviewDir + '/' + project.getProperty('getdown_txt_ui.progress_image')
429       from jalviewDir + '/' + project.getProperty('getdown_txt_ui.icon')
430       from jalviewDir + '/' + project.getProperty('getdown_txt_ui.mac_dock_icon')
431       into project.ext.getdownFilesDir + '/' + getdown_resource_dir 
432     }
433   }
434
435   inputs.dir(jalviewDir + '/' + packageDir)
436   outputs.dir(project.ext.getdownWebsiteDir)
437   outputs.dir(project.ext.getdownFilesDir)
438 }
439
440 task getdownDigest(type: JavaExec) {
441   dependsOn getdownWebsite
442   classpath = files(jalviewDir + '/' + getdown_core)
443   main = "com.threerings.getdown.tools.Digester"
444   args project.ext.getdownWebsiteDir
445   outputs.file(project.ext.getdownWebsiteDir + '/' + "digest2.txt")
446 }
447
448 task getdown() {
449   dependsOn getdownDigest
450 }
451
452 clean {
453   delete project.ext.getdownWebsiteDir
454   delete project.ext.getdownFilesDir
455 }
456
457 install4j {
458   def install4jHomeDir = "/opt/install4j"
459   def hostname = "hostname".execute().text.trim()
460   if (hostname.equals("jv-bamboo")) {
461     install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j"
462   } else if (OperatingSystem.current().isMacOsX()) {
463     install4jHomeDir = '/Applications/install4j.app/Contents/Resources/app'
464     if (! file(install4jHomeDir).exists()) {
465       install4jHomeDir = System.getProperty("user.home")+install4jHomeDir
466     }
467   } else if (OperatingSystem.current().isLinux()) {
468     install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j"
469   }
470   installDir = file(install4jHomeDir)
471 }
472
473 task installers(type: com.install4j.gradle.Install4jTask) {
474   dependsOn getdown
475   projectFile = "$jalviewDir/$install4jResourceDir/$install4jConf"
476   variables = [majorVersion: version.substring(2, 11), build: 001]
477   destination = "$jalviewDir/$install4jBuildDir"
478   buildSelected = true
479   inputs.dir(project.ext.getdownWebsiteDir)
480   outputs.dir("$jalviewDir/$install4jBuildDir")
481 }