build.gradle 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. //ant.importBuild 'build.xml'
  2. import groovy.xml.MarkupBuilder
  3. import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
  4. import java.util.zip.ZipFile
  5. plugins {
  6. id "de.undercouch.download" version "5.1.0"
  7. }
  8. apply from: 'gradle/libs/digest.gradle'
  9. apply from: file('version.gradle')
  10. if (!hasProperty('mainClass')) {
  11. ext.mainClass = ''
  12. }
  13. repositories {
  14. mavenCentral()
  15. maven { url = "https://jitpack.io" }
  16. maven {
  17. url = "https://maven.google.com/"
  18. }
  19. }
  20. configurations {
  21. corelibs
  22. optlibs
  23. testdatalibs
  24. examplelibs
  25. }
  26. configurations.examplelibs {
  27. transitive = false
  28. }
  29. dependencies {
  30. corelibs dep("com.badlogicgames.gdx:gdx-ai:1.8.2", true, true)
  31. corelibs dep("javax.help:javahelp:2.0.05", false, false)
  32. corelibs dep("org.jmonkeyengine:jme3-core:$jmeVersion-$jmeVersionTag", true, true)
  33. corelibs dep("org.jmonkeyengine:jme3-desktop:$jmeVersion-$jmeVersionTag", true, true)
  34. corelibs dep("org.jmonkeyengine:jme3-awt-dialogs:$jmeVersion-$jmeVersionTag", true, true)
  35. corelibs dep("org.jmonkeyengine:jme3-plugins-json:$jmeVersion-$jmeVersionTag", true, true)
  36. corelibs dep("org.jmonkeyengine:jme3-plugins-json-gson:$jmeVersion-$jmeVersionTag", true, true)
  37. corelibs dep("org.jmonkeyengine:jme3-lwjgl:$jmeVersion-$jmeVersionTag", true, true)
  38. corelibs dep("org.jmonkeyengine:jme3-effects:$jmeVersion-$jmeVersionTag", true, true)
  39. corelibs dep("com.github.stephengold:Minie:8.2.0", true, true) // replacement for bullet-native
  40. corelibs dep("com.github.stephengold:Heart:9.1.0", true, true) // requirement for Minie
  41. corelibs dep(fileTree("lib"), false, false)
  42. corelibs dep("org.jmonkeyengine:jme3-jogg:$jmeVersion-$jmeVersionTag", true, true)
  43. corelibs dep("org.jmonkeyengine:jme3-networking:$jmeVersion-$jmeVersionTag", true, true)
  44. corelibs dep("org.jmonkeyengine:jme3-niftygui:$jmeVersion-$jmeVersionTag", true, true)
  45. corelibs dep("org.jmonkeyengine:jme3-plugins:$jmeVersion-$jmeVersionTag", true, true)
  46. corelibs dep("org.jmonkeyengine:jme3-terrain:$jmeVersion-$jmeVersionTag", true, true)
  47. optlibs dep("com.simsilica:lemur:1.16.0", true, true)
  48. optlibs dep("com.simsilica:lemur-props:1.2.0", true, true)
  49. optlibs dep("com.simsilica:sio2:1.8.0", true, true)
  50. optlibs dep("com.simsilica:sim-math:1.6.0", true, true)
  51. optlibs dep("com.simsilica:zay-es:1.5.0", true, true)
  52. optlibs dep("org.jmonkeyengine:jme3-jbullet:$jmeVersion-$jmeVersionTag", true, true)
  53. optlibs dep("org.jmonkeyengine:jme3-android:$jmeVersion-$jmeVersionTag", true, true)
  54. optlibs dep("org.jmonkeyengine:jme3-ios:$jmeVersion-$jmeVersionTag", true, true)
  55. optlibs dep("org.jmonkeyengine:jme3-android-native:$jmeVersion-$jmeVersionTag", true, true)
  56. optlibs dep("org.jmonkeyengine:jme3-lwjgl3:$jmeVersion-$jmeVersionTag", true, true)
  57. optlibs dep("com.github.stephengold:Wes:0.8.1", true, true)
  58. testdatalibs dep("org.jmonkeyengine:jme3-testdata:$jmeVersion-$jmeVersionTag", false, false)
  59. examplelibs dep("org.jmonkeyengine:jme3-examples:$jmeVersion-$jmeVersionTag", false, true)
  60. }
  61. def dep(coords, javadoc = false, sources = false) {
  62. def result = [dependencies.create(coords)]
  63. if (javadoc) result << dependencies.create("$coords:javadoc")
  64. if (sources) result << dependencies.create("$coords:sources")
  65. result
  66. }
  67. artifacts {
  68. // jar null
  69. }
  70. tasks.register('checkPlatformConfig') {
  71. description = "Downloads the NetBeans platform base and registers it in the SDK project if needed"
  72. def platformFile = file("nbproject/private/platform-private.properties")
  73. if (!platformFile.exists()) {
  74. def netbeansFolder = file("netbeans")
  75. if (!netbeansFolder.exists() || netbeansFolder.list().length == 0) {
  76. println "Downloading NetBeans Platform base, this only has to be done once.."
  77. /* The following method is discouraged as it does not handle HTTP 301 Redirects
  78. * def f = file("netbeans.zip")
  79. * new URL(netbeansUrl).withInputStream{ i -> f.withOutputStream{ it << i }}
  80. */
  81. download.run {
  82. src netbeansUrl
  83. dest "netbeans.zip"
  84. overwrite false // however if overwrite matters the build failed anyway
  85. }
  86. copy {
  87. from zipTree(file("netbeans.zip"))
  88. into "."
  89. }
  90. file("netbeans.zip").delete()
  91. }
  92. file("nbproject/private/").mkdirs()
  93. platformFile.createNewFile()
  94. platformFile.write("nbplatform.default.netbeans.dest.dir=${netbeansFolder.absolutePath.replace('\\', '/')}\r\n" + \
  95. "nbplatform.default.harness.dir=${netbeansFolder.absolutePath.replace('\\', '/')}/harness\r\n")
  96. }
  97. }
  98. tasks.register('copyBaseLibs') {
  99. dependsOn configurations.corelibs
  100. doLast {
  101. description = "Copies the library files needed to run the SDK to " +
  102. "jme3-core-baselibs and jme3-core-libraries"
  103. // for each dependency in corelibs..
  104. //project.configurations.corelibs.dependencies.each {dep ->
  105. //println(project.configurations.corelibs.dependencies)
  106. project.configurations.corelibs.collect { file ->
  107. // copy built jme3 jar files to jme3-core-baselibs
  108. if (file.name.startsWith("jme3") && !isSourceOrJavadoc(file.name)) {
  109. copy {
  110. from file
  111. into "jme3-core-baselibs/release/modules/ext/"
  112. }
  113. } else if (file.name.contains("Minie") && !isSourceOrJavadoc(file.name)) {
  114. // Special handling of Minie, since it doesn't follow the name convention
  115. copy {
  116. from file
  117. into "jme3-core-baselibs/release/modules/ext/"
  118. }
  119. } else if (file.name.contains("Heart") && !isSourceOrJavadoc(file.name)) {
  120. // Special handling of Minie, since it doesn't follow the name convention
  121. copy {
  122. from file
  123. into "jme3-core-baselibs/release/modules/ext/"
  124. }
  125. } else if (!isSourceOrJavadoc(file.name)) {
  126. copy {
  127. from file
  128. into "jme3-core-libraries/release/modules/ext/"
  129. }
  130. }
  131. }
  132. }
  133. }
  134. copyBaseLibs.inputs.files configurations.corelibs.resolve()
  135. copyBaseLibs.outputs.dir "jme3-core-baselibs/release/modules/ext/"
  136. copyBaseLibs.outputs.dir "jme3-core-libraries/release/modules/ext/"
  137. static def isSourceOrJavadoc(dep){
  138. return isSource(dep) || isJavadoc(dep)
  139. }
  140. static def isSource(dep){
  141. return dep.endsWith("-sources.jar")
  142. }
  143. static def isJavadoc(dep){
  144. return dep.endsWith("-javadoc.jar")
  145. }
  146. static def isJmeDep(dep) {
  147. return dep.startsWith("jme3")
  148. }
  149. tasks.register('createBaseXml') {
  150. dependsOn configurations.corelibs
  151. doLast {
  152. description = "Creates the project.xml files for " +
  153. "jme3-core-baselibs and jme3-core-libraries"
  154. def jmeJarFiles = [] // jme3 jar files
  155. def externalJarFiles = [] // external jar files
  156. // collect jar files
  157. project.configurations.corelibs.collect { file ->
  158. // copy built jme3 jar files to jme3-core-baselibs
  159. if (file.name.startsWith("jme3") && !isSourceOrJavadoc(file.name)) {
  160. //collect jme jars
  161. if (!jmeJarFiles.contains(file)) {
  162. jmeJarFiles.add(file)
  163. }
  164. } else if (file.name.contains("Minie") && !isSourceOrJavadoc(file.name)) {
  165. // Special handling of Minie, since it doesn't follow the name convention
  166. if (!jmeJarFiles.contains(file)) {
  167. jmeJarFiles.add(file)
  168. }
  169. } else if (file.name.contains("Heart") && !isSourceOrJavadoc(file.name)) {
  170. // Special handling of Minie, since it doesn't follow the name convention
  171. if (!jmeJarFiles.contains(file)) {
  172. jmeJarFiles.add(file)
  173. }
  174. } else if (!isSourceOrJavadoc(file.name)) {
  175. //collect external jars
  176. externalJarFiles.add(file)
  177. }
  178. }
  179. // collect base packages
  180. def packages = []
  181. jmeJarFiles.each { jarFile ->
  182. ZipFile file = new ZipFile(jarFile)
  183. file.entries().each { entry ->
  184. if (!entry.name.startsWith('META-INF') && entry.name.endsWith('.class')) {
  185. // TODO: "/" works on windows?
  186. def pathPart = entry.name.substring(0, Math.max(0, entry.name.lastIndexOf('/')))
  187. def classPath = pathPart.replace('/', '.');
  188. if (!classPath.empty && !packages.contains(classPath)) {
  189. packages.add(classPath)
  190. }
  191. }
  192. }
  193. }
  194. // collect library packages
  195. def extPackages = []
  196. externalJarFiles.each { jarFile ->
  197. ZipFile file = new ZipFile(jarFile)
  198. file.entries().each { entry ->
  199. if (!entry.name.startsWith('META-INF') && entry.name.endsWith('.class')) {
  200. // TODO: "/" works on windows?
  201. def pathPart = entry.name.substring(0, Math.max(0, entry.name.lastIndexOf('/')))
  202. def classPath = pathPart.replace('/', '.');
  203. if (!classPath.empty && !extPackages.contains(classPath)) {
  204. extPackages.add(classPath)
  205. }
  206. }
  207. }
  208. }
  209. def writer = new StringWriter()
  210. def xml = new MarkupBuilder(writer)
  211. xml.mkp.xmlDeclaration(version: '1.0')
  212. xml.project(xmlns: "http://www.netbeans.org/ns/project/1") {
  213. type "org.netbeans.modules.apisupport.project"
  214. configuration {
  215. data(xmlns: "http://www.netbeans.org/ns/nb-module-project/3") {
  216. "code-name-base" "com.jme3.gde.core.baselibs"
  217. "suite-component" {}
  218. "module-dependencies" {
  219. dependency {
  220. "code-name-base" "com.jme3.gde.core.libraries"
  221. "build-prerequisite" {}
  222. "compile-dependency" {}
  223. "run-dependency" {
  224. "release-version" "1"
  225. "specification-version" jmeVersion
  226. }
  227. }
  228. }
  229. "public-packages" {
  230. packages.each {
  231. "package" it
  232. }
  233. }
  234. jmeJarFiles.each { jarFile ->
  235. "class-path-extension" {
  236. "runtime-relative-path" "ext/${jarFile.name}"
  237. "binary-origin" "release/modules/ext/${jarFile.name}"
  238. }
  239. }
  240. }
  241. }
  242. }
  243. // write XML file
  244. File baselibsProjectFile = file("jme3-core-baselibs/nbproject/project.xml");
  245. baselibsProjectFile.write(writer.toString())
  246. def extWriter = new StringWriter()
  247. def extXml = new MarkupBuilder(extWriter)
  248. // extXml.mkp.xmlDeclaration(version:'1.0')
  249. extXml.project(xmlns: "http://www.netbeans.org/ns/project/1") {
  250. type "org.netbeans.modules.apisupport.project"
  251. configuration {
  252. data(xmlns: "http://www.netbeans.org/ns/nb-module-project/3") {
  253. "code-name-base" "com.jme3.gde.core.libraries"
  254. "suite-component" {}
  255. "module-dependencies" {}
  256. "public-packages" {
  257. extPackages.each {
  258. "package" it
  259. }
  260. }
  261. externalJarFiles.each { jarFile ->
  262. "class-path-extension" {
  263. "runtime-relative-path" "ext/${jarFile.name}"
  264. "binary-origin" "release/modules/ext/${jarFile.name}"
  265. }
  266. }
  267. }
  268. }
  269. }
  270. // write XML file
  271. File librariesProjectFile = file("jme3-core-libraries/nbproject/project.xml");
  272. librariesProjectFile.write(extWriter.toString())
  273. }
  274. }
  275. createBaseXml.inputs.files configurations.corelibs.resolve()
  276. createBaseXml.outputs.file "jme3-core-baselibs/nbproject/project.xml"
  277. createBaseXml.outputs.file "jme3-core-libraries/nbproject/project.xml"
  278. tasks.register('copyProjectLibs') {
  279. dependsOn configurations.corelibs, configurations.testdatalibs
  280. doLast {
  281. description = "Copies the jar files needed to supply the J2SE Libraries in the " +
  282. "SDK to jme3-project-baselibs and jme3-project-libraries"
  283. // for each dependency in corelibs and optlibs..
  284. def deps = []
  285. deps.addAll(project.configurations.corelibs.files)
  286. deps.addAll(project.configurations.optlibs.files)
  287. deps.each { dep ->
  288. // copy jme3 jar files, sources and javadocs to jme3-project-baselibs
  289. if (isSource(dep.name)) {
  290. copy {
  291. from dep
  292. into "jme3-project-baselibs/release/libs/"
  293. }
  294. } else if (isJavadoc(dep.name)) {
  295. copy {
  296. from dep
  297. into "jme3-project-baselibs/release/libs/"
  298. }
  299. } else if (isJmeDep(dep.name)) {
  300. copy {
  301. from dep
  302. into "jme3-project-baselibs/release/libs/"
  303. }
  304. } else {
  305. copy {
  306. from dep
  307. into "jme3-project-libraries/release/libs/"
  308. }
  309. }
  310. }
  311. project.configurations.testdatalibs.files.each { dep ->
  312. // copy jme3 test data to jme3-project-testdata
  313. if (isJmeDep(dep.name)) {
  314. copy {
  315. from dep
  316. into "jme3-project-testdata/release/modules/ext/"
  317. rename("jme3-testdata(.*)", "jme3-testdata.jar")
  318. }
  319. }
  320. }
  321. }
  322. }
  323. copyProjectLibs.inputs.files configurations.corelibs.resolve()
  324. copyProjectLibs.inputs.files configurations.optlibs.resolve()
  325. copyProjectLibs.inputs.files configurations.testdatalibs.resolve()
  326. copyProjectLibs.outputs.dir "jme3-project-baselibs/release/libs/"
  327. copyProjectLibs.outputs.dir "jme3-project-libraries/release/libs/"
  328. copyProjectLibs.outputs.dir "jme3-project-testdata/release/modules/ext/"
  329. // workaround method to add a tag with the name "name" and "file" to an XML MarkupBuilder
  330. static def makeName(builder, nameR) { builder.name nameR }
  331. static def makeFile(builder, nameR) { builder.file(name:nameR, url:nameR) }
  332. tasks.register('createProjectXml') {
  333. dependsOn configurations.corelibs
  334. doLast {
  335. description = "Creates needed J2SE library and layer XML files in jme3-project-baselibs"
  336. def eol = System.properties.'line.separator'
  337. def j2seLibraries = [] // created J2SE library descriptors
  338. // for each dependency in corelibs..
  339. def deps = []
  340. deps.addAll(project.configurations.corelibs.dependencies)
  341. deps.addAll(project.configurations.optlibs.dependencies)
  342. deps.each { dep ->
  343. def jmeJarFiles = [] // jme3 jar files
  344. def jmeSourceFiles = [] // jme3 sources
  345. def jmeJavadocFiles = [] // jme3 javadoc
  346. def externalJarFiles = [] // external jar files
  347. if (j2seLibraries.contains(dep.name + ".xml")) {
  348. return;
  349. }
  350. j2seLibraries.add(dep.name + ".xml")
  351. project.configurations.corelibs.files.findAll { d -> return d.name == dep.name }.each { file ->
  352. if (isSource(file.name)) {
  353. if (!jmeSourceFiles.contains(file.name)) {
  354. jmeSourceFiles.add(file.name)
  355. }
  356. } else if (isJavadoc(file.name)) {
  357. if (!jmeJavadocFiles.contains(file.name)) {
  358. jmeJavadocFiles.add(file.name)
  359. }
  360. } else if (isJmeDep(file.name)) {
  361. if (!jmeJarFiles.contains(file.name)) {
  362. jmeJarFiles.add(file.name)
  363. }
  364. } else {
  365. if (!externalJarFiles.contains(file.name)) {
  366. externalJarFiles.add(file.name)
  367. }
  368. }
  369. }
  370. project.configurations.optlibs.files.findAll { d -> return d.name == dep.name }.each { file ->
  371. if (isSource(file.name)) {
  372. if (!jmeSourceFiles.contains(file.name)) {
  373. jmeSourceFiles.add(file.name)
  374. }
  375. } else if (isJavadoc(file.name)) {
  376. if (!jmeJavadocFiles.contains(file.name)) {
  377. jmeJavadocFiles.add(file.name)
  378. }
  379. } else if (isJmeDep(file.name)) {
  380. if (!jmeJarFiles.contains(file.name)) {
  381. jmeJarFiles.add(file.name)
  382. }
  383. } else {
  384. if (!externalJarFiles.contains(file.name)) {
  385. externalJarFiles.add(file.name)
  386. }
  387. }
  388. }
  389. // Workarounds where the automatic dependency detection did not work. This is mainly when there are runtime dependencies which are not available as artifacts
  390. if (dep.name.equals("jme3-jbullet")) {
  391. externalJarFiles.add("jbullet.jar")
  392. externalJarFiles.add("stack-alloc.jar")
  393. }
  394. // create J2SE library descriptor xml file
  395. def libraryWriter = new StringWriter()
  396. def libraryXml = new MarkupBuilder(libraryWriter)
  397. // xml.mkp.xmlDeclaration(version:'1.0')
  398. libraryWriter << '<?xml version="1.0" encoding="UTF-8"?>' << eol
  399. libraryWriter << '<!DOCTYPE library PUBLIC "-//NetBeans//DTD Library Declaration 1.0//EN" "http://www.netbeans.org/dtds/library-declaration-1_0.dtd">' << eol
  400. libraryXml.library(version: "1.0", encoding: "UTF-8") {
  401. makeName(libraryXml, "${dep.name}")
  402. type "j2se"
  403. "localizing-bundle" "com.jme3.gde.project.baselibs.Bundle"
  404. volume {
  405. type "classpath"
  406. resource "jar:nbinst://com.jme3.gde.project.baselibs/libs/${jmeJarFiles[0]}!/"
  407. /* Usually we don't add all the jmeJarFiles, this is because e.g. each library depends on core,
  408. * some depend on jme3-terrain etc, but it's the users duty to add the correct libraries.
  409. * If we would add all those each library would have it's one jme3-core, which might even lead
  410. * to build errors then.
  411. */
  412. if (dep.name.equals("jme3_xbuf")) {
  413. jmeJarFiles.each { jar ->
  414. if (jar.startsWith("jme3_xbuf")) {
  415. /* Technically you would only need the loaders, not the spatial viewer,
  416. * but users can edit the library if they want to strip off
  417. * the last few possible kilobytes */
  418. resource "jar:nbinst://com.jme3.gde.project.baselibs/libs/$jar!/"
  419. }
  420. }
  421. }
  422. externalJarFiles.each { jar ->
  423. resource "jar:nbinst://com.jme3.gde.project.libraries/libs/${jar}!/"
  424. }
  425. }
  426. volume {
  427. type "src"
  428. jmeSourceFiles.each { jar ->
  429. resource "jar:nbinst://com.jme3.gde.project.baselibs/libs/${jar}!/"
  430. }
  431. }
  432. volume {
  433. type "javadoc"
  434. jmeJavadocFiles.each { jar ->
  435. resource "jar:nbinst://com.jme3.gde.project.baselibs/libs/${jar}!/"
  436. }
  437. }
  438. }
  439. // write XML file
  440. File libraryXmlFile = file("jme3-project-baselibs/src/com/jme3/gde/project/baselibs/${dep.name}.xml");
  441. libraryXmlFile.write(libraryWriter.toString())
  442. }
  443. // create layer.xml file with entries of library xml files
  444. def layerWriter = new StringWriter()
  445. def layerXml = new MarkupBuilder(layerWriter)
  446. // layerXml.mkp.xmlDeclaration(version:'1.0')
  447. layerWriter << '<?xml version="1.0" encoding="UTF-8"?>' << eol
  448. layerWriter << '<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">' << eol
  449. layerXml.filesystem {
  450. folder(name: "org-netbeans-api-project-libraries") {
  451. folder(name: "Libraries") {
  452. j2seLibraries.each { lib ->
  453. makeFile(layerXml, lib)
  454. }
  455. }
  456. }
  457. }
  458. File layerXmlFile = file("jme3-project-baselibs/src/com/jme3/gde/project/baselibs/layer.xml");
  459. layerXmlFile.write(layerWriter.toString())
  460. }
  461. }
  462. createProjectXml.inputs.files configurations.corelibs.resolve()
  463. createProjectXml.inputs.files configurations.optlibs.resolve()
  464. createProjectXml.outputs.dir "jme3-project-baselibs/src/com/jme3/gde/project/baselibs/"
  465. tasks.register('copyTestSources') {
  466. doLast {
  467. project.configurations.examplelibs.files.each { dep ->
  468. if (isSource(dep.name)) {
  469. copy {
  470. from {
  471. zipTree(dep)
  472. }
  473. into "JME3TestsTemplate/src/"
  474. }
  475. copy {
  476. from {
  477. zipTree(dep)
  478. }
  479. into "JME3TestsTemplateAndroid/src/"
  480. }
  481. }
  482. }
  483. }
  484. }
  485. copyTestSources.inputs.files project.configurations.examplelibs
  486. copyTestSources.outputs.dir "JME3TestsTemplate/src/"
  487. copyTestSources.outputs.dir "JME3TestsTemplateAndroid/src/"
  488. ant.properties['plugins.version'] = jmeVersion
  489. ant.properties['app.version']= jmePomVersion
  490. ant.properties['nbm.revision']= jmeNbmRevision
  491. tasks.register('overrideHarness') {
  492. dependsOn 'checkPlatformConfig', 'updateNetbeans'
  493. doLast {
  494. def props = new Properties()
  495. props.load(new FileInputStream("$rootDir/harness-override/override.properties"))
  496. def patch_file = { f ->
  497. def g = file("harness-override/" + f.getName())
  498. if (!f.exists()) {
  499. throw new GradleException('Cannot find targetFile: ' + f.getAbsolutePath());
  500. }
  501. if (!g.exists()) {
  502. throw new GradleException('Cannot find sourceFile: ' + g.getAbsolutePath());
  503. }
  504. if (getSHA256Hash(f) == props[f.getName() + ".hashAfter"]) {
  505. println "> Harness file \"" + f.getName() + "\" is already patched!"
  506. return; /* Already patched */
  507. }
  508. if (getSHA256Hash(f) == props[f.getName() + ".hashBefore"]) {
  509. println "> Will patch harness file \"" + f.getName() + "\"!"
  510. if (getSHA256Hash(g) != props[g.getName() + ".hashAfter"]) {
  511. 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.")
  512. }
  513. copy {
  514. from g
  515. into f.getParent()
  516. }
  517. } else {
  518. throw new GradleException('Checksum Mismatch: targetFile ' + f.getName() + ' has invalid hash ' + getSHA256Hash(f) + '. Did you update Netbeans without changing harness-override/override.properties?');
  519. }
  520. }
  521. patch_file(file("netbeans/harness/launchers/app.exe"));
  522. patch_file(file("netbeans/harness/launchers/app64.exe"));
  523. patch_file(file("netbeans/harness/launchers/pre7_app.exe"));
  524. }
  525. }
  526. overrideHarness.outputs.files([ 'netbeans/harness/launchers/app.exe', 'netbeans/harness/launchers/app64.exe', 'netbeans/harness/launchers/pre7_app.exe'])
  527. overrideHarness.inputs.files([ 'netbeans/harness/launchers/app.exe', 'netbeans/harness/launchers/app64.exe', 'netbeans/harness/launchers/pre7_app.exe', 'harness-override/override.properties'])
  528. tasks.register('updateNetbeans', Exec) {
  529. dependsOn checkPlatformConfig
  530. ignoreExitValue = true
  531. // We make netbeans fail by specifying "exit" which is no java file to open (this command would open the whole IDE)
  532. if (DefaultNativePlatform.currentOperatingSystem.isWindows()) {
  533. commandLine 'netbeans/bin/netbeans.exe', '--update-all', '--modules', '--refresh', '--nosplash', '--nogui', 'exit'
  534. } else {
  535. commandLine 'netbeans/bin/netbeans', '--update-all', '--modules', '--refresh', '--nosplash', '--nogui', 'exit'
  536. }
  537. }
  538. tasks.register('buildSdk') {
  539. dependsOn copyBaseLibs, copyProjectLibs, createProjectXml, createBaseXml, copyTestSources, checkPlatformConfig
  540. doLast {
  541. ant.propertyfile(file: "nbproject/project.properties") {
  542. entry(key: "plugins.version", value: "${jmeVersion}")
  543. entry(key: "app.version", value: "${jmePomVersion}")
  544. entry(key: "nbm.revision", value: "${jmeNbmRevision}")
  545. }
  546. ant.ant(dir: ".", antfile: "build.xml", target: "build")
  547. }
  548. }
  549. buildSdk.inputs.files configurations.corelibs.resolve()
  550. buildSdk.inputs.files configurations.optlibs.resolve()
  551. file('.').eachDir{
  552. if(it.name.startsWith("jme3-") && it.isDirectory()){
  553. buildSdk.inputs.dir it
  554. }
  555. }
  556. //buildSdk.outputs.dir "build"
  557. tasks.register('run') {
  558. dependsOn buildSdk
  559. doLast {
  560. ant.ant(dir: ".", antfile: "build.xml", target: "run")
  561. }
  562. }
  563. tasks.register('cleanSdk') {
  564. doLast {
  565. ant.ant(dir: ".", antfile: "build.xml", target: "clean")
  566. file("jme3-core-baselibs/release/").deleteDir()
  567. file("jme3-core-libraries/release/").deleteDir()
  568. file("jme3-core-baselibs/nbproject/project.xml").delete()
  569. file("jme3-core-libraries/nbproject/project.xml").delete()
  570. file("jme3-project-baselibs/release/").deleteDir()
  571. file("jme3-project-libraries/release/").deleteDir()
  572. file("jme3-project-testdata/release/").deleteDir()
  573. file("JME3TestsTemplate/src/jme3test/").deleteDir()
  574. file("JME3TestsTemplateAndroid/src/jme3test/").deleteDir()
  575. }
  576. }
  577. wrapper {
  578. gradleVersion = '9.2.1'
  579. }
  580. //jar.dependsOn(buildSdk)
  581. //clean.dependsOn(cleanSdk)