build.gradle 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. //ant.importBuild 'build.xml'
  2. import groovy.xml.MarkupBuilder
  3. import java.util.zip.ZipFile
  4. if (!hasProperty('mainClass')) {
  5. ext.mainClass = ''
  6. }
  7. configurations {
  8. corelibs
  9. optlibs
  10. testdatalibs
  11. examplelibs
  12. }
  13. dependencies {
  14. corelibs project(':jme3-blender')
  15. corelibs project(':jme3-core')
  16. corelibs project(':jme3-desktop')
  17. corelibs project(':jme3-effects')
  18. corelibs project(':jme3-jbullet')
  19. corelibs project(':jme3-jogg')
  20. corelibs project(':jme3-lwjgl')
  21. corelibs project(':jme3-networking')
  22. corelibs project(':jme3-niftygui')
  23. corelibs project(':jme3-plugins')
  24. corelibs project(':jme3-terrain')
  25. optlibs project(':jme3-bullet')
  26. optlibs project(':jme3-jogl')
  27. optlibs project(':jme3-android')
  28. optlibs project(':jme3-ios')
  29. optlibs project(':jme3-android-native')
  30. optlibs project(':jme3-bullet-native')
  31. optlibs project(':jme3-bullet-native-android')
  32. testdatalibs project(':jme3-testdata')
  33. examplelibs project(':jme3-examples')
  34. }
  35. artifacts {
  36. // jar null
  37. }
  38. task checkPlatformConfig {
  39. description = "Downloads the NetBeans platform base and registers it in the SDK project if needed"
  40. def platformFile = file("nbproject/private/platform-private.properties")
  41. if(!platformFile.exists()){
  42. def netbeansFolder = file("../netbeans")
  43. if(!netbeansFolder.exists() || netbeansFolder.list().length == 0){
  44. println "Downloading NetBeans Platform base, this only has to be done once.."
  45. def f = file("netbeans.zip")
  46. new URL(netbeansUrl).withInputStream{ i -> f.withOutputStream{ it << i }}
  47. copy{
  48. from zipTree(f)
  49. into "../"
  50. }
  51. f.delete()
  52. }
  53. file("nbproject/private/").mkdirs()
  54. platformFile.createNewFile()
  55. platformFile.write("nbplatform.default.netbeans.dest.dir=${netbeansFolder.absolutePath.replace('\\','/')}\r\n"+\
  56. "nbplatform.default.harness.dir=${netbeansFolder.absolutePath.replace('\\','/')}/harness\r\n")
  57. }
  58. }
  59. task copyBaseLibs(dependsOn:configurations.corelibs) <<{
  60. description "Copies the library files needed to run the SDK to "+
  61. "jme3-core-baselibs and jme3-core-libraries"
  62. // for each dependency in corelibs..
  63. project.configurations.corelibs.dependencies.each {dep ->
  64. // copy built jme3 jar files to jme3-core-baselibs
  65. dep.dependencyProject.configurations.archives.allArtifacts.each{ artifact->
  66. if(artifact.classifier == "sources"){
  67. } else if(artifact.classifier == "javadoc"){
  68. } else{
  69. copy {
  70. from artifact.file
  71. into "jme3-core-baselibs/release/modules/ext/"
  72. }
  73. }
  74. }
  75. // copy external jar files to jme3-core-libraries
  76. copy {
  77. from dep.dependencyProject.configurations.compile.copyRecursive({ !(it instanceof ProjectDependency); }).resolve()
  78. into "jme3-core-libraries/release/modules/ext/"
  79. }
  80. }
  81. }
  82. copyBaseLibs.inputs.files configurations.corelibs.resolve()
  83. copyBaseLibs.outputs.dir "jme3-core-baselibs/release/modules/ext/"
  84. copyBaseLibs.outputs.dir "jme3-core-libraries/release/modules/ext/"
  85. task createBaseXml(dependsOn: configurations.corelibs) <<{
  86. description "Creates the project.xml files for "+
  87. "jme3-core-baselibs and jme3-core-libraries"
  88. def jmeJarFiles = [] // jme3 jar files
  89. def externalJarFiles = [] // external jar files
  90. // collect jar files
  91. project.configurations.corelibs.dependencies.each {dep ->
  92. // collect external jar files
  93. dep.dependencyProject.configurations.compile.copyRecursive({ !(it instanceof ProjectDependency); }).resolve().each{ file->
  94. externalJarFiles.add(file)
  95. }
  96. // collect internal jar files (classes, sources and javadoc)
  97. dep.dependencyProject.configurations.archives.allArtifacts.each{ artifact->
  98. if(artifact.classifier == "sources"){
  99. } else if(artifact.classifier == "javadoc"){
  100. } else{
  101. if(!jmeJarFiles.contains(artifact.file)){
  102. jmeJarFiles.add(artifact.file)
  103. }
  104. }
  105. }
  106. }
  107. // collect base packages
  108. def packages = []
  109. jmeJarFiles.each{jarFile ->
  110. ZipFile file = new ZipFile(jarFile)
  111. file.entries().each { entry ->
  112. if(entry.name.endsWith('.class')){
  113. // TODO: "/" works on windows?
  114. def pathPart = entry.name.substring(0,entry.name.lastIndexOf('/'))
  115. def classPath = pathPart.replace('/','.');
  116. if(!packages.contains(classPath)){
  117. packages.add(classPath)
  118. }
  119. }
  120. }
  121. }
  122. // collect library packages
  123. def extPackages = []
  124. externalJarFiles.each{jarFile ->
  125. ZipFile file = new ZipFile(jarFile)
  126. file.entries().each { entry ->
  127. if(entry.name.endsWith('.class')){
  128. // TODO: "/" works on windows?
  129. def pathPart = entry.name.substring(0,entry.name.lastIndexOf('/'))
  130. def classPath = pathPart.replace('/','.');
  131. if(!extPackages.contains(classPath)){
  132. extPackages.add(classPath)
  133. }
  134. }
  135. }
  136. }
  137. def writer = new StringWriter()
  138. def xml = new MarkupBuilder(writer)
  139. xml.mkp.xmlDeclaration(version:'1.0')
  140. xml.project(xmlns:"http://www.netbeans.org/ns/project/1"){
  141. type "org.netbeans.modules.apisupport.project"
  142. configuration {
  143. data(xmlns:"http://www.netbeans.org/ns/nb-module-project/3") {
  144. "code-name-base" "com.jme3.gde.core.baselibs"
  145. "suite-component"{}
  146. "module-dependencies"{
  147. dependency{
  148. "code-name-base" "com.jme3.gde.core.libraries"
  149. "build-prerequisite"{}
  150. "compile-dependency"{}
  151. "run-dependency"{
  152. "release-version" "1"
  153. "specification-version" "3.0.0"
  154. }
  155. }
  156. }
  157. "public-packages"{
  158. packages.each{
  159. "package" it
  160. }
  161. }
  162. jmeJarFiles.each{jarFile ->
  163. "class-path-extension"{
  164. "runtime-relative-path" "ext/${jarFile.name}"
  165. "binary-origin" "release/modules/ext/${jarFile.name}"
  166. }
  167. }
  168. }
  169. }
  170. }
  171. // write XML file
  172. File baselibsProjectFile = file("jme3-core-baselibs/nbproject/project.xml");
  173. baselibsProjectFile.write(writer.toString())
  174. def extWriter = new StringWriter()
  175. def extXml = new MarkupBuilder(extWriter)
  176. // extXml.mkp.xmlDeclaration(version:'1.0')
  177. extXml.project(xmlns:"http://www.netbeans.org/ns/project/1"){
  178. type "org.netbeans.modules.apisupport.project"
  179. configuration {
  180. data(xmlns:"http://www.netbeans.org/ns/nb-module-project/3") {
  181. "code-name-base" "com.jme3.gde.core.libraries"
  182. "suite-component"{}
  183. "module-dependencies"{}
  184. "public-packages"{
  185. extPackages.each{
  186. "package" it
  187. }
  188. }
  189. externalJarFiles.each{jarFile ->
  190. "class-path-extension"{
  191. "runtime-relative-path" "ext/${jarFile.name}"
  192. "binary-origin" "release/modules/ext/${jarFile.name}"
  193. }
  194. }
  195. }
  196. }
  197. }
  198. // write XML file
  199. File librariesProjectFile = file("jme3-core-libraries/nbproject/project.xml");
  200. librariesProjectFile.write(extWriter.toString())
  201. }
  202. createBaseXml.inputs.files configurations.corelibs.resolve()
  203. createBaseXml.outputs.file "jme3-core-baselibs/nbproject/project.xml"
  204. createBaseXml.outputs.file "jme3-core-libraries/nbproject/project.xml"
  205. task copyProjectLibs(dependsOn: [configurations.corelibs, configurations.testdatalibs]) <<{
  206. description "Copies the jar files needed to supply the J2SE Libraries in the "+
  207. "SDK to jme3-project-baselibs and jme3-project-libraries"
  208. // for each dependency in corelibs and optlibs..
  209. def deps = []
  210. deps.addAll(project.configurations.corelibs.dependencies)
  211. deps.addAll(project.configurations.optlibs.dependencies)
  212. deps.each {dep ->
  213. // copy jme3 jar files, sources and javadocs to jme3-project-baselibs
  214. dep.dependencyProject.configurations.archives.allArtifacts.each{ artifact->
  215. if(artifact.classifier == "sources"){
  216. copy {
  217. from artifact.file
  218. into "jme3-project-baselibs/release/libs/"
  219. }
  220. } else if(artifact.classifier == "javadoc"){
  221. copy {
  222. from artifact.file
  223. into "jme3-project-baselibs/release/libs/"
  224. }
  225. } else{
  226. copy {
  227. from artifact.file
  228. into "jme3-project-baselibs/release/libs/"
  229. }
  230. }
  231. }
  232. // copy external jar files to jme3-project-libraries
  233. copy {
  234. from dep.dependencyProject.configurations.compile.copyRecursive({ !(it instanceof ProjectDependency); }).resolve()
  235. into "jme3-project-libraries/release/libs/"
  236. }
  237. }
  238. project.configurations.testdatalibs.dependencies.each {dep ->
  239. // copy jme3 test data to jme3-project-testdata
  240. dep.dependencyProject.configurations.archives.allArtifacts.each{ artifact->
  241. if(artifact.classifier == "sources"){
  242. } else if(artifact.classifier == "javadoc"){
  243. } else{
  244. copy {
  245. from artifact.file
  246. into "jme3-project-testdata/release/libs/"
  247. rename ("jme3-testdata(.*)", "jme3-testdata.jar")
  248. }
  249. }
  250. }
  251. }
  252. }
  253. copyProjectLibs.inputs.files configurations.corelibs.resolve()
  254. copyProjectLibs.inputs.files configurations.optlibs.resolve()
  255. copyProjectLibs.inputs.files configurations.testdatalibs.resolve()
  256. copyProjectLibs.outputs.dir "jme3-project-baselibs/release/libs/"
  257. copyProjectLibs.outputs.dir "jme3-project-libraries/release/libs/"
  258. copyProjectLibs.outputs.dir "jme3-project-testdata/release/libs/"
  259. // workaround method to add a tag with the name "name" and "file" to an XML MarkupBuilder
  260. def makeName(builder, nameR) { builder.name nameR }
  261. def makeFile(builder, nameR) { builder.file(name:nameR, url:nameR) }
  262. task createProjectXml(dependsOn: configurations.corelibs) <<{
  263. description "Creates needed J2SE library and layer XML files in jme3-project-baselibs"
  264. def eol = System.properties.'line.separator'
  265. def j2seLibraries = [] // created J2SE library descriptors
  266. // for each dependency in corelibs..
  267. def deps = []
  268. deps.addAll(project.configurations.corelibs.dependencies)
  269. deps.addAll(project.configurations.optlibs.dependencies)
  270. deps.each {dep ->
  271. def jmeJarFiles = [] // jme3 jar files
  272. def jmeSourceFiles = [] // jme3 sources
  273. def jmeJavadocFiles = [] // jme3 javadoc
  274. def externalJarFiles = [] // external jar files
  275. j2seLibraries.add(dep.dependencyProject.name+".xml")
  276. // collect external jar files
  277. dep.dependencyProject.configurations.compile.copyRecursive({ !(it instanceof ProjectDependency); }).resolve().each{ file->
  278. externalJarFiles.add(file.name)
  279. }
  280. // collect internal jar files (classes, sources and javadoc)
  281. dep.dependencyProject.configurations.archives.allArtifacts.each{ artifact->
  282. if(artifact.classifier == "sources"){
  283. jmeSourceFiles.add(artifact.file.name)
  284. } else if(artifact.classifier == "javadoc"){
  285. jmeJavadocFiles.add(artifact.file.name)
  286. } else{
  287. if(!jmeJarFiles.contains(artifact.file.name)){
  288. jmeJarFiles.add(artifact.file.name)
  289. }
  290. }
  291. }
  292. // create J2SE library descriptor xml file
  293. def libraryWriter = new StringWriter()
  294. def libraryXml = new MarkupBuilder(libraryWriter)
  295. // xml.mkp.xmlDeclaration(version:'1.0')
  296. libraryWriter << '<?xml version="1.0" encoding="UTF-8"?>' << eol
  297. libraryWriter << '<!DOCTYPE library PUBLIC "-//NetBeans//DTD Library Declaration 1.0//EN" "http://www.netbeans.org/dtds/library-declaration-1_0.dtd">' << eol
  298. libraryXml.library(version:"1.0", encoding: "UTF-8"){
  299. makeName(libraryXml, "${dep.dependencyProject.name}")
  300. type "j2se"
  301. "localizing-bundle" "com.jme3.gde.project.baselibs.Bundle"
  302. volume{
  303. type "classpath"
  304. jmeJarFiles.each{jar ->
  305. resource "jar:nbinst://com.jme3.gde.project.baselibs/libs/${jar}!/"
  306. }
  307. externalJarFiles.each{jar ->
  308. resource "jar:nbinst://com.jme3.gde.project.libraries/libs/${jar}!/"
  309. }
  310. }
  311. volume{
  312. type "src"
  313. jmeSourceFiles.each{jar ->
  314. resource "jar:nbinst://com.jme3.gde.project.baselibs/libs/${jar}!/"
  315. }
  316. }
  317. volume{
  318. type "javadoc"
  319. jmeJavadocFiles.each{jar ->
  320. resource "jar:nbinst://com.jme3.gde.project.baselibs/libs/${jar}!/"
  321. }
  322. }
  323. }
  324. // write XML file
  325. File libraryXmlFile = file("jme3-project-baselibs/src/com/jme3/gde/project/baselibs/${dep.dependencyProject.name}.xml");
  326. libraryXmlFile.write(libraryWriter.toString())
  327. }
  328. // create layer.xml file with entries of library xml files
  329. def layerWriter = new StringWriter()
  330. def layerXml = new MarkupBuilder(layerWriter)
  331. // layerXml.mkp.xmlDeclaration(version:'1.0')
  332. layerWriter << '<?xml version="1.0" encoding="UTF-8"?>' << eol
  333. layerWriter << '<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">' << eol
  334. layerXml.filesystem{
  335. folder(name:"org-netbeans-api-project-libraries"){
  336. folder(name:"Libraries"){
  337. j2seLibraries.each{lib ->
  338. makeFile(layerXml, lib)
  339. }
  340. }
  341. }
  342. }
  343. File layerXmlFile = file("jme3-project-baselibs/src/com/jme3/gde/project/baselibs/layer.xml");
  344. layerXmlFile.write(layerWriter.toString())
  345. }
  346. createProjectXml.inputs.files configurations.corelibs.resolve()
  347. createProjectXml.inputs.files configurations.optlibs.resolve()
  348. createProjectXml.outputs.dir "jme3-project-baselibs/src/com/jme3/gde/project/baselibs/"
  349. task copyTestSources <<{
  350. project.configurations.examplelibs.dependencies.each{dep ->
  351. copy{
  352. from dep.dependencyProject.sourceSets*.allSource
  353. into "JME3TestsTemplate/src/"
  354. }
  355. copy{
  356. from dep.dependencyProject.sourceSets*.allSource
  357. into "JME3TestsTemplateAndroid/src/"
  358. }
  359. }
  360. }
  361. copyTestSources.inputs.files project.configurations.examplelibs
  362. copyTestSources.outputs.dir "JME3TestsTemplate/src/"
  363. copyTestSources.outputs.dir "JME3TestsTemplateAndroid/src/"
  364. ant.properties['plugins.version'] = jmeVersion
  365. ant.properties['app.version']= jmeMainVersion + "-" + jmeVersionTag
  366. task buildSdk(dependsOn: [copyBaseLibs, copyProjectLibs, createProjectXml, createBaseXml, copyTestSources]) <<{
  367. ant.propertyfile(file: "nbproject/project.properties") {
  368. entry( key: "plugins.version", value: "${jmeVersion}")
  369. entry( key: "app.version", value: "${jmeMainVersion + "-" + jmeVersionTag}")
  370. }
  371. ant.ant(dir: ".", antfile: "build.xml", target: "build")
  372. }
  373. buildSdk.inputs.files configurations.corelibs.resolve()
  374. buildSdk.inputs.files configurations.optlibs.resolve()
  375. file('.').eachDir{
  376. if(it.name.startsWith("jme3-") && it.isDirectory()){
  377. buildSdk.inputs.dir it
  378. }
  379. }
  380. buildSdk.outputs.dir "build"
  381. task cleanSdk() <<{
  382. ant.ant(dir: ".", antfile: "build.xml", target: "clean")
  383. file("jme3-core-baselibs/release/").deleteDir()
  384. file("jme3-core-libraries/release/").deleteDir()
  385. file("jme3-project-baselibs/release/").deleteDir()
  386. file("jme3-project-libraries/release/").deleteDir()
  387. file("JME3TestsTemplate/src/jmetest/").deleteDir()
  388. file("JME3TestsTemplateAndroid/src/jmetest/").deleteDir()
  389. }
  390. jar.dependsOn(buildSdk)
  391. clean.dependsOn(cleanSdk);