build.gradle 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. //ant.importBuild 'build.xml'
  2. import groovy.xml.MarkupBuilder
  3. import java.util.zip.ZipFile
  4. apply from: 'gradle/libs/digest.gradle'
  5. apply from: file('version.gradle')
  6. if (!hasProperty('mainClass')) {
  7. ext.mainClass = ''
  8. }
  9. repositories {
  10. mavenLocal()
  11. jcenter {
  12. url "http://jcenter.bintray.com/"
  13. }
  14. maven {
  15. url "http://updates.jmonkeyengine.org/maven/"
  16. }
  17. maven {
  18. url 'http://nifty-gui.sourceforge.net/nifty-maven-repo/'
  19. }
  20. maven { url "https://jitpack.io" }
  21. }
  22. if (ext.jmeGitTag != null)
  23. ext.jmeEngineVersion = "3.1.0-" + ext.jmeGitTag + "-SNAPSHOT"
  24. else
  25. ext.jmeEngineVersion = "3.1.0-master-SNAPSHOT" // Specify the Engine Version to be used.
  26. configurations {
  27. corelibs
  28. optlibs
  29. testdatalibs
  30. examplelibs
  31. }
  32. dependencies {
  33. corelibs dep("com.github.xbuf:jme3_xbuf:0.8.4", false, false)
  34. corelibs dep("org.jmonkeyengine:jme3-core:$jmeEngineVersion", true, true)
  35. corelibs dep("org.jmonkeyengine:jme3-desktop:$jmeEngineVersion", true, true)
  36. corelibs dep("org.jmonkeyengine:jme3-lwjgl:$jmeEngineVersion", true, true)
  37. corelibs dep("org.jmonkeyengine:jme3-effects:$jmeEngineVersion", true, true)
  38. corelibs dep("org.jmonkeyengine:jme3-blender:$jmeEngineVersion", true, true)
  39. corelibs dep("org.jmonkeyengine:jme3-jbullet:$jmeEngineVersion", true, true)
  40. corelibs dep(fileTree("lib"), false, false)
  41. corelibs dep("org.jmonkeyengine:jme3-jogg:$jmeEngineVersion", true, true)
  42. corelibs dep("org.jmonkeyengine:jme3-networking:$jmeEngineVersion", true, true)
  43. corelibs dep("org.jmonkeyengine:jme3-niftygui:$jmeEngineVersion", true, true)
  44. corelibs dep("org.jmonkeyengine:jme3-plugins:$jmeEngineVersion", true, true)
  45. corelibs dep("org.jmonkeyengine:jme3-terrain:$jmeEngineVersion", true, true)
  46. optlibs dep("org.jmonkeyengine:jme3-bullet:$jmeEngineVersion", true, true)
  47. optlibs dep("org.jmonkeyengine:jme3-jogl:$jmeEngineVersion", true, true)
  48. optlibs dep("org.jmonkeyengine:jme3-android:$jmeEngineVersion", true, true)
  49. optlibs dep("org.jmonkeyengine:jme3-ios:$jmeEngineVersion", true, true)
  50. optlibs dep("org.jmonkeyengine:jme3-android-native:$jmeEngineVersion", true, true)
  51. optlibs dep("org.jmonkeyengine:jme3-bullet-native:$jmeEngineVersion", true, true)
  52. optlibs dep("org.jmonkeyengine:jme3-bullet-native-android:$jmeEngineVersion", true, true)
  53. testdatalibs dep("org.jmonkeyengine:jme3-testdata:$jmeEngineVersion", false, false)
  54. examplelibs dep("org.jmonkeyengine:jme3-examples:$jmeEngineVersion", false, true)
  55. }
  56. def dep(coords, javadoc = false, sources = false) {
  57. def result = [dependencies.create(coords)]
  58. if (javadoc) result << dependencies.create("$coords:javadoc")
  59. if (sources) result << dependencies.create("$coords:sources")
  60. result
  61. }
  62. artifacts {
  63. // jar null
  64. }
  65. task checkPlatformConfig {
  66. description = "Downloads the NetBeans platform base and registers it in the SDK project if needed"
  67. def platformFile = file("nbproject/private/platform-private.properties")
  68. if(!platformFile.exists()){
  69. def netbeansFolder = file("netbeans")
  70. if(!netbeansFolder.exists() || netbeansFolder.list().length == 0){
  71. println "Downloading NetBeans Platform base, this only has to be done once.."
  72. def f = file("netbeans.zip")
  73. new URL(netbeansUrl).withInputStream{ i -> f.withOutputStream{ it << i }}
  74. copy{
  75. from zipTree(f)
  76. into "."
  77. }
  78. f.delete()
  79. }
  80. file("nbproject/private/").mkdirs()
  81. platformFile.createNewFile()
  82. platformFile.write("nbplatform.default.netbeans.dest.dir=${netbeansFolder.absolutePath.replace('\\','/')}\r\n"+\
  83. "nbplatform.default.harness.dir=${netbeansFolder.absolutePath.replace('\\','/')}/harness\r\n")
  84. }
  85. }
  86. task copyBaseLibs(dependsOn:configurations.corelibs) <<{
  87. description "Copies the library files needed to run the SDK to "+
  88. "jme3-core-baselibs and jme3-core-libraries"
  89. // for each dependency in corelibs..
  90. //project.configurations.corelibs.dependencies.each {dep ->
  91. //println(project.configurations.corelibs.dependencies)
  92. project.configurations.corelibs.collect {file ->
  93. // copy built jme3 jar files to jme3-core-baselibs
  94. if (file.name.startsWith("jme3") && !isSourceOrJavadoc(file.name)){
  95. copy {
  96. from file
  97. into "jme3-core-baselibs/release/modules/ext/"
  98. }
  99. }else if( !isSourceOrJavadoc(file.name)){
  100. copy {
  101. from file
  102. into "jme3-core-libraries/release/modules/ext/"
  103. }
  104. }
  105. }
  106. }
  107. copyBaseLibs.inputs.files configurations.corelibs.resolve()
  108. copyBaseLibs.outputs.dir "jme3-core-baselibs/release/modules/ext/"
  109. copyBaseLibs.outputs.dir "jme3-core-libraries/release/modules/ext/"
  110. def isSourceOrJavadoc(dep){
  111. return isSource(dep) || isJavadoc(dep)
  112. }
  113. def isSource(dep){
  114. return dep.endsWith("-sources.jar")
  115. }
  116. def isJavadoc(dep){
  117. return dep.endsWith("-javadoc.jar")
  118. }
  119. def isJmeDep(dep) {
  120. return dep.startsWith("jme3")
  121. }
  122. task createBaseXml(dependsOn: configurations.corelibs) <<{
  123. description "Creates the project.xml files for "+
  124. "jme3-core-baselibs and jme3-core-libraries"
  125. def jmeJarFiles = [] // jme3 jar files
  126. def externalJarFiles = [] // external jar files
  127. // collect jar files
  128. project.configurations.corelibs.collect {file ->
  129. // copy built jme3 jar files to jme3-core-baselibs
  130. if (file.name.startsWith("jme3") && !isSourceOrJavadoc(file.name)){
  131. //collect jme jars
  132. if(!jmeJarFiles.contains(file)){
  133. jmeJarFiles.add(file)
  134. }
  135. }else if( !isSourceOrJavadoc(file.name)){
  136. //collect external jars
  137. externalJarFiles.add(file)
  138. }
  139. }
  140. // collect base packages
  141. def packages = []
  142. jmeJarFiles.each{jarFile ->
  143. ZipFile file = new ZipFile(jarFile)
  144. file.entries().each { entry ->
  145. if(entry.name.endsWith('.class')){
  146. // TODO: "/" works on windows?
  147. def pathPart = entry.name.substring(0,entry.name.lastIndexOf('/'))
  148. def classPath = pathPart.replace('/','.');
  149. if(!packages.contains(classPath)){
  150. packages.add(classPath)
  151. }
  152. }
  153. }
  154. }
  155. // collect library packages
  156. def extPackages = []
  157. externalJarFiles.each{jarFile ->
  158. ZipFile file = new ZipFile(jarFile)
  159. file.entries().each { entry ->
  160. if(entry.name.endsWith('.class')){
  161. // TODO: "/" works on windows?
  162. def pathPart = entry.name.substring(0,entry.name.lastIndexOf('/'))
  163. def classPath = pathPart.replace('/','.');
  164. if(!extPackages.contains(classPath)){
  165. extPackages.add(classPath)
  166. }
  167. }
  168. }
  169. }
  170. def writer = new StringWriter()
  171. def xml = new MarkupBuilder(writer)
  172. xml.mkp.xmlDeclaration(version:'1.0')
  173. xml.project(xmlns:"http://www.netbeans.org/ns/project/1"){
  174. type "org.netbeans.modules.apisupport.project"
  175. configuration {
  176. data(xmlns:"http://www.netbeans.org/ns/nb-module-project/3") {
  177. "code-name-base" "com.jme3.gde.core.baselibs"
  178. "suite-component"{}
  179. "module-dependencies"{
  180. dependency{
  181. "code-name-base" "com.jme3.gde.core.libraries"
  182. "build-prerequisite"{}
  183. "compile-dependency"{}
  184. "run-dependency"{
  185. "release-version" "1"
  186. "specification-version" jmeVersion
  187. }
  188. }
  189. }
  190. "public-packages"{
  191. packages.each{
  192. "package" it
  193. }
  194. }
  195. jmeJarFiles.each{jarFile ->
  196. "class-path-extension"{
  197. "runtime-relative-path" "ext/${jarFile.name}"
  198. "binary-origin" "release/modules/ext/${jarFile.name}"
  199. }
  200. }
  201. }
  202. }
  203. }
  204. // write XML file
  205. File baselibsProjectFile = file("jme3-core-baselibs/nbproject/project.xml");
  206. baselibsProjectFile.write(writer.toString())
  207. def extWriter = new StringWriter()
  208. def extXml = new MarkupBuilder(extWriter)
  209. // extXml.mkp.xmlDeclaration(version:'1.0')
  210. extXml.project(xmlns:"http://www.netbeans.org/ns/project/1"){
  211. type "org.netbeans.modules.apisupport.project"
  212. configuration {
  213. data(xmlns:"http://www.netbeans.org/ns/nb-module-project/3") {
  214. "code-name-base" "com.jme3.gde.core.libraries"
  215. "suite-component"{}
  216. "module-dependencies"{}
  217. "public-packages"{
  218. extPackages.each{
  219. "package" it
  220. }
  221. }
  222. externalJarFiles.each{jarFile ->
  223. "class-path-extension"{
  224. "runtime-relative-path" "ext/${jarFile.name}"
  225. "binary-origin" "release/modules/ext/${jarFile.name}"
  226. }
  227. }
  228. }
  229. }
  230. }
  231. // write XML file
  232. File librariesProjectFile = file("jme3-core-libraries/nbproject/project.xml");
  233. librariesProjectFile.write(extWriter.toString())
  234. }
  235. createBaseXml.inputs.files configurations.corelibs.resolve()
  236. createBaseXml.outputs.file "jme3-core-baselibs/nbproject/project.xml"
  237. createBaseXml.outputs.file "jme3-core-libraries/nbproject/project.xml"
  238. task copyProjectLibs(dependsOn: [configurations.corelibs, configurations.testdatalibs]) <<{
  239. description "Copies the jar files needed to supply the J2SE Libraries in the "+
  240. "SDK to jme3-project-baselibs and jme3-project-libraries"
  241. // for each dependency in corelibs and optlibs..
  242. def deps = []
  243. deps.addAll(project.configurations.corelibs.files)
  244. deps.addAll(project.configurations.optlibs.files)
  245. deps.each {dep ->
  246. // copy jme3 jar files, sources and javadocs to jme3-project-baselibs
  247. if(isSource(dep.name)){
  248. copy {
  249. from dep
  250. into "jme3-project-baselibs/release/libs/"
  251. }
  252. } else if(isJavadoc(dep.name)){
  253. copy {
  254. from dep
  255. into "jme3-project-baselibs/release/libs/"
  256. }
  257. } else if(isJmeDep(dep.name)){
  258. copy {
  259. from dep
  260. into "jme3-project-baselibs/release/libs/"
  261. }
  262. }else{
  263. copy {
  264. from dep
  265. into "jme3-project-libraries/release/libs/"
  266. }
  267. }
  268. }
  269. project.configurations.testdatalibs.files.each {dep ->
  270. // copy jme3 test data to jme3-project-testdata
  271. if(isJmeDep(dep.name)){
  272. copy {
  273. from dep
  274. into "jme3-project-testdata/release/libs/"
  275. rename ("jme3-testdata(.*)", "jme3-testdata.jar")
  276. }
  277. }
  278. }
  279. }
  280. copyProjectLibs.inputs.files configurations.corelibs.resolve()
  281. copyProjectLibs.inputs.files configurations.optlibs.resolve()
  282. copyProjectLibs.inputs.files configurations.testdatalibs.resolve()
  283. copyProjectLibs.outputs.dir "jme3-project-baselibs/release/libs/"
  284. copyProjectLibs.outputs.dir "jme3-project-libraries/release/libs/"
  285. copyProjectLibs.outputs.dir "jme3-project-testdata/release/libs/"
  286. // workaround method to add a tag with the name "name" and "file" to an XML MarkupBuilder
  287. def makeName(builder, nameR) { builder.name nameR }
  288. def makeFile(builder, nameR) { builder.file(name:nameR, url:nameR) }
  289. task createProjectXml(dependsOn: configurations.corelibs) <<{
  290. description "Creates needed J2SE library and layer XML files in jme3-project-baselibs"
  291. def eol = System.properties.'line.separator'
  292. def j2seLibraries = [] // created J2SE library descriptors
  293. // for each dependency in corelibs..
  294. def deps = []
  295. deps.addAll(project.configurations.corelibs.dependencies)
  296. deps.addAll(project.configurations.optlibs.dependencies)
  297. deps.each {dep ->
  298. def jmeJarFiles = [] // jme3 jar files
  299. def jmeSourceFiles = [] // jme3 sources
  300. def jmeJavadocFiles = [] // jme3 javadoc
  301. def externalJarFiles = [] // external jar files
  302. if(j2seLibraries.contains(dep.name+".xml")){
  303. return;
  304. }
  305. j2seLibraries.add(dep.name+".xml")
  306. project.configurations.corelibs.files{ d -> return d.name == dep.name}.each{ file ->
  307. if(isSource(file.name)){
  308. if(!jmeSourceFiles.contains(file.name)){
  309. jmeSourceFiles.add(file.name)
  310. }
  311. } else if(isJavadoc(file.name)){
  312. if(!jmeJavadocFiles.contains(file.name)){
  313. jmeJavadocFiles.add(file.name)
  314. }
  315. } else if(isJmeDep(file.name)){
  316. if(!jmeJarFiles.contains(file.name)){
  317. jmeJarFiles.add(file.name)
  318. }
  319. }else{
  320. if(!externalJarFiles.contains(file.name)){
  321. externalJarFiles.add(file.name)
  322. }
  323. }
  324. }
  325. project.configurations.optlibs.files{ d -> return d.name == dep.name}.each{ file ->
  326. if(isSource(file.name)){
  327. if(!jmeSourceFiles.contains(file.name)){
  328. jmeSourceFiles.add(file.name)
  329. }
  330. } else if(isJavadoc(file.name)){
  331. if(!jmeJavadocFiles.contains(file.name)){
  332. jmeJavadocFiles.add(file.name)
  333. }
  334. } else if(isJmeDep(file.name)){
  335. if(!jmeJarFiles.contains(file.name)){
  336. jmeJarFiles.add(file.name)
  337. }
  338. }else{
  339. if(!externalJarFiles.contains(file.name)){
  340. externalJarFiles.add(file.name)
  341. }
  342. }
  343. }
  344. // create J2SE library descriptor xml file
  345. def libraryWriter = new StringWriter()
  346. def libraryXml = new MarkupBuilder(libraryWriter)
  347. // xml.mkp.xmlDeclaration(version:'1.0')
  348. libraryWriter << '<?xml version="1.0" encoding="UTF-8"?>' << eol
  349. libraryWriter << '<!DOCTYPE library PUBLIC "-//NetBeans//DTD Library Declaration 1.0//EN" "http://www.netbeans.org/dtds/library-declaration-1_0.dtd">' << eol
  350. libraryXml.library(version:"1.0", encoding: "UTF-8"){
  351. makeName(libraryXml, "${dep.name}")
  352. type "j2se"
  353. "localizing-bundle" "com.jme3.gde.project.baselibs.Bundle"
  354. volume{
  355. type "classpath"
  356. resource "jar:nbinst://com.jme3.gde.project.baselibs/libs/${jmeJarFiles[0]}!/"
  357. externalJarFiles.each{jar ->
  358. resource "jar:nbinst://com.jme3.gde.project.libraries/libs/${jar}!/"
  359. }
  360. }
  361. volume{
  362. type "src"
  363. jmeSourceFiles.each{jar ->
  364. resource "jar:nbinst://com.jme3.gde.project.baselibs/libs/${jar}!/"
  365. }
  366. }
  367. volume{
  368. type "javadoc"
  369. jmeJavadocFiles.each{jar ->
  370. resource "jar:nbinst://com.jme3.gde.project.baselibs/libs/${jar}!/"
  371. }
  372. }
  373. }
  374. // write XML file
  375. File libraryXmlFile = file("jme3-project-baselibs/src/com/jme3/gde/project/baselibs/${dep.name}.xml");
  376. libraryXmlFile.write(libraryWriter.toString())
  377. }
  378. // create layer.xml file with entries of library xml files
  379. def layerWriter = new StringWriter()
  380. def layerXml = new MarkupBuilder(layerWriter)
  381. // layerXml.mkp.xmlDeclaration(version:'1.0')
  382. layerWriter << '<?xml version="1.0" encoding="UTF-8"?>' << eol
  383. layerWriter << '<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">' << eol
  384. layerXml.filesystem{
  385. folder(name:"org-netbeans-api-project-libraries"){
  386. folder(name:"Libraries"){
  387. j2seLibraries.each{lib ->
  388. makeFile(layerXml, lib)
  389. }
  390. }
  391. }
  392. }
  393. File layerXmlFile = file("jme3-project-baselibs/src/com/jme3/gde/project/baselibs/layer.xml");
  394. layerXmlFile.write(layerWriter.toString())
  395. }
  396. createProjectXml.inputs.files configurations.corelibs.resolve()
  397. createProjectXml.inputs.files configurations.optlibs.resolve()
  398. createProjectXml.outputs.dir "jme3-project-baselibs/src/com/jme3/gde/project/baselibs/"
  399. task copyTestSources <<{
  400. project.configurations.examplelibs.files.each{dep ->
  401. if(isSource(dep.name)){
  402. copy{
  403. from {
  404. zipTree(dep)
  405. }
  406. into "JME3TestsTemplate/src/"
  407. }
  408. copy{
  409. from {
  410. zipTree(dep)
  411. }
  412. into "JME3TestsTemplateAndroid/src/"
  413. }
  414. }
  415. }
  416. }
  417. copyTestSources.inputs.files project.configurations.examplelibs
  418. copyTestSources.outputs.dir "JME3TestsTemplate/src/"
  419. copyTestSources.outputs.dir "JME3TestsTemplateAndroid/src/"
  420. ant.properties['plugins.version'] = jmeVersion
  421. ant.properties['app.version']= jmePomVersion
  422. ant.properties['nbm.revision']= jmeNbmRevision
  423. task overrideHarness(dependsOn: checkPlatformConfig) << {
  424. def props = new Properties()
  425. props.load(new FileInputStream("harness-override/override.properties"))
  426. def patch_file = { f ->
  427. def g = file("harness-override/" + f.getName())
  428. if (!f.exists()) {
  429. throw new GradleException('Cannot find targetFile: ' + f.getAbsolutePath());
  430. }
  431. if (!g.exists()) {
  432. throw new GradleException('Cannot find sourceFile: ' + g.getAbsolutePath());
  433. }
  434. if (getSHA256Hash(f) == props[f.getName() + ".hashAfter"]) {
  435. println "> Harness file \"" + f.getName() + "\" is already patched!"
  436. return; /* Already patched */
  437. }
  438. if (getSHA256Hash(f) == props[f.getName() + ".hashBefore"]) {
  439. println "> Will patch harness file \"" + f.getName() + "\"!"
  440. if (getSHA256Hash(g) != props[g.getName() + ".hashAfter"]) {
  441. throw new GradleException("Dangerous Checksum Mismatch: sourceFile \"" + g.getName() + "\" doesn't equal to its hashAfter hash. This probably means someone changed this file but forgot to update said hash or someone tried to invade the SDK by spreading his exe.")
  442. }
  443. copy {
  444. from g
  445. into f.getParent()
  446. }
  447. } else {
  448. throw new GradleException('Checksum Mismatch: targetFile ' + f.getName() + ' has invalid hash ' + getSHA256Hash(f) + '. Did you update Netbeans without changing harness-override/override.properties?');
  449. }
  450. }
  451. patch_file(file("netbeans/harness/launchers/app.exe"));
  452. patch_file(file("netbeans/harness/launchers/app64.exe"));
  453. patch_file(file("netbeans/harness/launchers/pre7_app.exe"));
  454. }
  455. overrideHarness.outputs.files([ 'netbeans/harness/launchers/app.exe', 'netbeans/harness/launchers/app64.exe', 'netbeans/harness/launchers/pre7_app.exe'])
  456. overrideHarness.inputs.files([ 'netbeans/harness/launchers/app.exe', 'netbeans/harness/launchers/app64.exe', 'netbeans/harness/launchers/pre7_app.exe', 'harness-override/override.properties'])
  457. task buildSdk(dependsOn: [copyBaseLibs, copyProjectLibs, createProjectXml, createBaseXml, copyTestSources, overrideHarness]) <<{
  458. ant.propertyfile(file: "nbproject/project.properties") {
  459. entry( key: "plugins.version", value: "${jmeVersion}")
  460. entry( key: "app.version", value: "${jmePomVersion}")
  461. entry( key: "nbm.revision", value: "${jmeNbmRevision}")
  462. }
  463. ant.ant(dir: ".", antfile: "build.xml", target: "build")
  464. }
  465. buildSdk.inputs.files configurations.corelibs.resolve()
  466. buildSdk.inputs.files configurations.optlibs.resolve()
  467. file('.').eachDir{
  468. if(it.name.startsWith("jme3-") && it.isDirectory()){
  469. buildSdk.inputs.dir it
  470. }
  471. }
  472. buildSdk.outputs.dir "build"
  473. task cleanSdk() <<{
  474. ant.ant(dir: ".", antfile: "build.xml", target: "clean")
  475. file("jme3-core-baselibs/release/").deleteDir()
  476. file("jme3-core-libraries/release/").deleteDir()
  477. file("jme3-core-baselibs/nbproject/project.xml").delete()
  478. file("jme3-core-libraries/nbproject/project.xml").delete()
  479. file("jme3-project-baselibs/release/").deleteDir()
  480. file("jme3-project-libraries/release/").deleteDir()
  481. file("jme3-project-testdata/release/").deleteDir()
  482. file("JME3TestsTemplate/src/jme3test/").deleteDir()
  483. file("JME3TestsTemplateAndroid/src/jme3test/").deleteDir()
  484. }
  485. //jar.dependsOn(buildSdk)
  486. //clean.dependsOn(cleanSdk)