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