351d9aca202022f27117f0c87ca8ff8f11bf9f5d
[jalview.git] / build.gradle
1 import org.apache.tools.ant.filters.ReplaceTokens
2 import org.gradle.internal.os.OperatingSystem
3 import org.gradle.plugins.ide.eclipse.model.*
4 import groovy.transform.ExternalizeMethods
5
6 plugins {
7   id 'java'
8   id 'application'
9   id 'eclipse'
10 }
11
12 repositories {
13   jcenter()
14   mavenCentral()
15   mavenLocal()
16   flatDir {
17     dirs gradlePluginsDir
18   }
19 }
20
21 mainClassName = launcherClass
22 def classes = "$jalviewDir/$classesDir"
23
24 // configure classpath/args for j8/j11 compilation
25
26 def jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath()
27 def libDir
28 def libDistDir
29 def compile_source_compatibility
30 def compile_target_compatibility
31
32 ext {
33   buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
34
35   gitHash = ""
36   gitBranch = ""
37 }
38
39 def JAVA_INTEGER_VERSION
40 //def additional_compiler_args = []
41 // this property is for the Java library used in eclipse
42 def eclipse_java_runtime_name
43 if (JAVA_VERSION.equals("1.8")) {
44   JAVA_INTEGER_VERSION = "8"
45   //libDir = j8libDir
46   libDir = j11libDir
47   libDistDir = j8libDir
48   compile_source_compatibility = 1.8
49   compile_target_compatibility = 1.8
50   eclipse_java_runtime_name = "JavaSE-1.8"
51 } else if (JAVA_VERSION.equals("11")) {
52   JAVA_INTEGER_VERSION = "11"
53   libDir = j11libDir
54   libDistDir = j11libDir
55   compile_source_compatibility = 11
56   compile_target_compatibility = 11
57   eclipse_java_runtime_name = "JavaSE-11"
58   /* compile without modules -- using classpath libraries
59   additional_compiler_args += [
60   '--module-path', ext.modules_compileClasspath.asPath,
61   '--add-modules', j11modules
62   ]
63   */
64 } else if (JAVA_VERSION.equals("12") || JAVA_VERSION.equals("13")) {
65   JAVA_INTEGER_VERSION = JAVA_VERSION
66   libDir = j11libDir
67   libDistDir = j11libDir
68   compile_source_compatibility = JAVA_VERSION
69   compile_target_compatibility = JAVA_VERSION
70   eclipse_java_runtime_name = "JavaSE-11"
71   /* compile without modules -- using classpath libraries
72   additional_compiler_args += [
73   '--module-path', ext.modules_compileClasspath.asPath,
74   '--add-modules', j11modules
75   ]
76   */
77 } else {
78   throw new GradleException("JAVA_VERSION=$JAVA_VERSION not currently supported by Jalview")
79 }
80
81 sourceSets {
82
83   main {
84     java {
85       srcDirs "$jalviewDir/$sourceDir"
86       outputDir = file("$classes")
87     }
88
89     resources {
90       srcDirs "$jalviewDir/$resourceDir"
91     }
92
93     compileClasspath = files(sourceSets.main.java.outputDir)
94     compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"])
95
96     runtimeClasspath = compileClasspath
97   }
98
99 }
100
101 eclipse {
102   project {
103     name = eclipse_project_name
104
105     natures 'org.eclipse.jdt.core.javanature',
106     'org.eclipse.buildship.core.gradleprojectnature'
107
108     buildCommand 'org.eclipse.jdt.core.javabuilder'
109     buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
110   }
111
112   classpath {
113     //defaultOutputDir = sourceSets.main.java.outputDir
114     def removeThese = []
115     configurations.each{ if (it.isCanBeResolved()) {
116         removeThese += it
117       }
118     }
119
120     minusConfigurations += removeThese
121     plusConfigurations = [ ]
122     file {
123
124       whenMerged { cp ->
125         def removeTheseToo = []
126         HashMap<String, Boolean> addedSrcPath = new HashMap<>();
127         cp.entries.each { entry ->
128           if (entry.kind == 'src') {
129             if (addedSrcPath.getAt(entry.path) || !(entry.path == "src" || entry.path == "test")) {
130               removeTheseToo += entry
131             } else {
132               addedSrcPath.putAt(entry.path, true)
133             }
134           }
135         }
136         cp.entries.removeAll(removeTheseToo)
137
138         cp.entries += new Output("bin/main")
139         cp.entries += new Library(fileReference(helpParentDir))
140         cp.entries += new Library(fileReference(resourceDir))
141
142         HashMap<String, Boolean> addedLibPath = new HashMap<>();
143
144         // changing from sourcesets.main.classpath to specific Java version lib
145         //sourceSets.main.compileClasspath.each{
146         fileTree("$jalviewDir/$libDistDir").include("**/*.jar").include("*.jar").each {
147           //don't want to add outputDir as eclipse is using its own output dir in bin/main
148           if (it.isDirectory() || ! it.exists()) {
149             // don't add dirs to classpath
150             return
151           }
152           def itPath = it.toString()
153           if (itPath.startsWith(jalviewDirAbsolutePath+"/")) {
154             itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
155           }
156           if (addedLibPath.get(itPath)) {
157             //println("Not adding duplicate entry "+itPath)
158           } else {
159             //println("Adding entry "+itPath)
160             cp.entries += new Library(fileReference(itPath))
161             addedLibPath.put(itPath, true)
162           }
163         }
164       } // whenMerged
165
166     } // file
167
168     containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
169   } // classpath
170
171   jdt {
172     // for the IDE, use java 11 compatibility
173     sourceCompatibility = compile_source_compatibility
174     targetCompatibility = compile_target_compatibility
175     javaRuntimeName = eclipse_java_runtime_name
176
177     /*
178     file {
179     withProperties { props ->
180     def jalview_prefs = new Properties()
181     def ins = new FileInputStream(jalviewDirAbsolutePath+"/"+eclipse_extra_jdt_prefs_file)
182     jalview_prefs.load(ins)
183     ins.close()
184     jalview_prefs.forEach { t, v ->
185     if (props.getAt(t) == null) {
186     props.putAt(t, v)
187     }
188     }
189     }
190     }
191      */
192   } // jdt
193
194   //synchronizationTasks eclipseClasspath
195   //autoBuildTasks eclipseClasspath
196 } // eclipse
197
198 /*
199 compileJava {
200
201   doFirst {
202     sourceCompatibility = compile_source_compatibility
203     targetCompatibility = compile_target_compatibility
204     //options.compilerArgs = additional_compiler_args
205     print ("Setting target compatibility to "+targetCompatibility+"\n")
206   }
207
208 }
209
210 clean {
211   delete sourceSets.main.java.outputDir
212 }
213 */
214
215 task jalviewjsUnzipFiles {
216   def zipFiles = fileTree(dir: jalviewjs_utils_dir+"/"+jalviewjs_libjs_dir).include("*.zip")
217   zipFiles += jalviewjs_utils_dir+"/"+jalviewjs_swingjs_zip
218
219   doLast {
220     zipFiles.each { file_zip -> 
221       copy {
222         from zipTree(file_zip)
223         into jalviewjs_site_dir
224       }
225     }
226   }
227
228   inputs.files zipFiles
229   outputs.dir jalviewjs_site_dir
230 }
231
232 def eclipseBinary
233 def eclipseDropinsDir
234 def eclipsePluginsDir
235 task jalviewjsEclipsePaths {
236         if (OperatingSystem.current().isMacOsX()) {
237                 eclipseDropinsDir = jalviewjs_eclipse_root+"/Contents/Eclipse/dropins"
238                 eclipsePluginsDir = jalviewjs_eclipse_root+"/Contents/Eclipse/plugins"
239                 eclipseBinary = jalviewjs_eclipse_root+"/Contents/MacOS/eclipse"
240         } else if (OperatingSystem.current().isWindows()) { // check this!
241                 eclipseDropinsDir = jalviewjs_eclipse_root+"/dropins"
242                 eclipsePluginsDir = jalviewjs_eclipse_root+"/plugins"
243                 eclipseBinary = jalviewjs_eclipse_root+"/eclipse"
244         } else { // linux or unix
245                 eclipseDropinsDir = jalviewjs_eclipse_root+"/dropins"
246                 eclipsePluginsDir = jalviewjs_eclipse_root+"/plugins"
247                 eclipseBinary = jalviewjs_eclipse_root+"/eclipse"
248         }
249 }
250
251 task jalviewjsEclipseCopyDropins (type: Copy) {
252   dependsOn jalviewjsEclipsePaths
253   def inputFiles = fileTree(jalviewjs_utils_dir+"/"+jalviewjs_eclipse_dropins_dir)
254   def outputDir = eclipseDropinsDir
255
256   from inputFiles
257   into outputDir
258   def outputFiles = []
259   rename { filename ->
260     outputFiles += outputDir+"/"+filename
261     null
262   }
263   outputs.files outputFiles
264   inputs.files inputFiles
265 }
266
267 task jalviewjsEclipseCopyPlugins (type: Copy) {
268   dependsOn jalviewjsEclipsePaths
269   def inputFiles = fileTree(jalviewjs_utils_dir+"/"+jalviewjs_eclipse_plugins_dir)
270   def outputDir = eclipsePluginsDir
271
272   from inputFiles
273   into outputDir
274   def outputFiles = []
275   rename { filename ->
276     outputFiles += outputDir+"/"+filename
277     null
278   }
279   outputs.files outputFiles
280   inputs.files inputFiles
281 }
282
283 def tempEclipseWorkspace = ""
284
285 task jalviewjsSetTempEclipseWorkspace {
286   tempEclipseWorkspace = file(jalviewjs_eclipse_workspace)
287   if (!tempEclipseWorkspace.exists() && jalviewjs_eclipse_workspace.startsWith(File.separator)) {
288     tempEclipseWorkspace = File.createTempDir()
289     print("ECLIPSE WORKSPACE: "+tempEclipseWorkspace.getPath())
290     tempEclipseWorkspace.deleteOnExit()
291   }
292 }
293
294 task jalviewjsEclipseSetup {
295   dependsOn jalviewjsEclipseCopyDropins
296   dependsOn jalviewjsEclipseCopyPlugins
297   dependsOn jalviewjsSetTempEclipseWorkspace
298 }
299
300
301 task jalviewjsCreateJ2sSettings(type: WriteProperties) {
302   outputFile (jalviewDir+"/"+jalviewjs_j2s_settings)
303   def props = project.properties.sort { it.key }
304   props.each { prop, val ->
305     if (prop.startsWith("j2s.") && val != null) {
306       property(prop,val)
307     }
308   }
309   outputs.file(outputFile)
310 }
311
312 task jalviewjsCopyResources (type: Copy) {
313   def inputFiles = fileTree(dir: jalviewjs_resource_dir)
314   def outputDir = jalviewjs_site_dir+"/"+jalviewjs_j2s_subdir
315
316   from inputFiles
317   into outputDir
318   def outputFiles = []
319   rename { filename ->
320     outputFiles += outputDir+"/"+filename
321     null
322   }
323   outputs.files outputFiles
324   inputs.files inputFiles
325 }
326
327 task jalviewjsCopySiteResources (type: Copy) {
328   def inputFiles = fileTree(dir: jalviewjs_utils_dir+"/"+jalviewjs_site_resource_dir)
329   def outputDir = jalviewjs_site_dir
330
331   from inputFiles
332   into outputDir
333   def outputFiles = []
334   rename { filename ->
335     outputFiles += outputDir+"/"+filename
336     null
337   }
338   outputs.files outputFiles
339   inputs.files inputFiles
340 }
341
342 task cleanJalviewjsSite {
343   delete jalviewjs_site_dir
344 }
345
346 task jalviewjsProjectImport(type: Exec) {
347   // work out how to do this!
348   dependsOn eclipseProject
349   dependsOn eclipseClasspath
350   dependsOn eclipseJdt
351   dependsOn jalviewjsEclipsePaths
352   dependsOn jalviewjsEclipseSetup
353   executable(eclipseBinary)
354   args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", tempEclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
355
356   def tempdir = tempEclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview"
357   outputs.dir(tempdir)
358 }
359
360 task jalviewjsTranspile(type: Exec) {
361   dependsOn jalviewjsProjectImport
362   dependsOn jalviewjsEclipsePaths
363   executable(eclipseBinary)
364   args(["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", tempEclipseWorkspace, "-"+jalviewjs_eclipseBuildArg, eclipse_project_name ])
365 }
366
367 task jalviewjsBuildSite {
368   dependsOn jalviewjsUnzipFiles
369   dependsOn jalviewjsCopyResources
370   dependsOn jalviewjsCopySiteResources
371   dependsOn jalviewjsTranspile
372 }
373
374 task jalviewjsSiteTar(type: Tar) {
375   dependsOn jalviewjsBuildSite
376   def outputFilename = "site.tar.gz"
377   try {
378     archiveFileName = outputFilename
379   } catch (Exception e) {
380     archiveName = outputFilename
381   }
382
383   compression Compression.GZIP
384
385   from jalviewjs_site_dir
386   into jalviewjs_site_dir
387
388   inputs.dir(jalviewjs_site_dir)
389 }
390
391 task jalviewjs {
392   dependsOn jalviewjsCreateJ2sSettings 
393   dependsOn jalviewjsBuildSite
394 }
395