2
0

build.gradle 20 KB

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