Rakefile 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. include RbConfig
  2. case CONFIG['host_os']
  3. when /mswin|windows|mingw32/i
  4. $HOST_OS = "windows"
  5. when /darwin/i
  6. $HOST_OS = "darwin"
  7. else
  8. abort("Unknown host config: Config::CONFIG['host_os']: #{Config::CONFIG['host_os']}")
  9. end
  10. $RAKE_ROOT = File.dirname(__FILE__)
  11. ATOMICTILED_BUILD_DIR = "#{$RAKE_ROOT}/Artifacts/AtomicTiled_Build"
  12. ATOMICTILED_SOURCE_DIR = "#{$RAKE_ROOT}/../AtomicTiled"
  13. if $HOST_OS == "darwin"
  14. $QT_BIN_DIR = "#{ENV["QT_SDK"]}/bin"
  15. else
  16. $QT_BIN_DIR = "C:\\Qt\\5.4\\msvc2013_64\\bin"
  17. QT_CREATOR_BIN_DIR = "C:\\Qt\\Tools\\QtCreator\\bin"
  18. ENV['PATH'] = "#{QT_CREATOR_BIN_DIR};" + ENV['PATH']
  19. end
  20. namespace :android do
  21. CMAKE_ANDROID_BUILD_FOLDER = "#{$RAKE_ROOT}/Artifacts/Android_Build"
  22. task :player do
  23. if !Dir.exists?("#{CMAKE_ANDROID_BUILD_FOLDER}")
  24. FileUtils.mkdir_p(CMAKE_ANDROID_BUILD_FOLDER)
  25. end
  26. Dir.chdir(CMAKE_ANDROID_BUILD_FOLDER) do
  27. sh "cmake -DCMAKE_TOOLCHAIN_FILE=#{$RAKE_ROOT}/CMake/Toolchains/android.toolchain.cmake -DCMAKE_BUILD_TYPE=Release ../../"
  28. sh "make -j8"
  29. end
  30. end
  31. end
  32. namespace :web do
  33. CMAKE_WEB_BUILD_FOLDER = "#{$RAKE_ROOT}/Artifacts/Web_Build"
  34. task :player do
  35. if !Dir.exists?("#{CMAKE_WEB_BUILD_FOLDER}")
  36. FileUtils.mkdir_p(CMAKE_WEB_BUILD_FOLDER)
  37. end
  38. Dir.chdir(CMAKE_WEB_BUILD_FOLDER) do
  39. sh "cmake -DCMAKE_TOOLCHAIN_FILE=#{$RAKE_ROOT}/CMake/Toolchains/emscripten.toolchain.cmake -DCMAKE_BUILD_TYPE=Release ../../"
  40. sh "make -j8"
  41. end
  42. Dir.chdir("#{CMAKE_WEB_BUILD_FOLDER}/Source/Tools/AtomicPlayer") do
  43. sh "mv AtomicPlayer AtomicPlayer.bc"
  44. sh "emcc -O3 --llvm-lto 1 --memory-init-file 0 -s VERBOSE=0 -s USE_SDL=2 -s ASM_JS=1 -s ASSERTIONS=1 -s OUTLINING_LIMIT=20000 -s TOTAL_MEMORY=520093696 --closure 0 ./AtomicPlayer.bc -o ./AtomicPlayer.html"
  45. end
  46. end
  47. end
  48. namespace :macosx do
  49. ARTIFACTS_FOLDER = "#{$RAKE_ROOT}/Artifacts"
  50. CMAKE_MACOSX_BUILD_FOLDER = "#{$RAKE_ROOT}/Artifacts/MacOSX_Build"
  51. MACOSX_PACKAGE_FOLDER = "#{$RAKE_ROOT}/Artifacts/MacOSX_Package"
  52. task :clean do
  53. folders = ["#{CMAKE_MACOSX_BUILD_FOLDER}", "#{MACOSX_PACKAGE_FOLDER}",
  54. "#{ARTIFACTS_FOLDER}/Android_Build", "#{ARTIFACTS_FOLDER}/Web_Build",
  55. "#{ARTIFACTS_FOLDER}/AtomicExamples", "#{ARTIFACTS_FOLDER}/Docs",
  56. "#{ARTIFACTS_FOLDER}/Examples", "#{ARTIFACTS_FOLDER}/AtomicTiled_Build"]
  57. for index in 0 ... folders.size
  58. if Dir.exists?(folders[index])
  59. puts "rm -rf #{folders[index]}"
  60. sh "rm -rf #{folders[index]}"
  61. end
  62. if Dir.exists?(folders[index])
  63. abort("Unable to clean #{folders[index]}")
  64. end
  65. end
  66. end
  67. task :cmake do
  68. FileUtils.mkdir_p(CMAKE_MACOSX_BUILD_FOLDER)
  69. Dir.chdir(CMAKE_MACOSX_BUILD_FOLDER) do
  70. sh "cmake ../../ -DCMAKE_BUILD_TYPE=Release"
  71. end
  72. end
  73. task :generate_javascript_bindings => "macosx:cmake" do
  74. Dir.chdir(CMAKE_MACOSX_BUILD_FOLDER) do
  75. sh "make -j8 JSBind"
  76. sh "./Source/Tools/JSBind/JSBind #{$RAKE_ROOT}"
  77. end
  78. end
  79. task :generate_docs => "macosx:generate_javascript_bindings" do
  80. Dir.chdir("#{$RAKE_ROOT}/Docs") do
  81. if Dir.exists?("out")
  82. sh "rm -rf out"
  83. end
  84. # add the generated JS bindings
  85. sh "./gendocs.sh"
  86. sh "cp -r out #{$RAKE_ROOT}/Artifacts/Docs"
  87. end
  88. end
  89. task :generate_examples do
  90. Dir.chdir("#{$RAKE_ROOT}/Artifacts") do
  91. if Dir.exists?("AtomicExamples")
  92. sh "rm -rf AtomicExamples"
  93. end
  94. if Dir.exists?("Examples")
  95. sh "rm -rf Examples"
  96. end
  97. sh "mkdir Examples"
  98. sh "git clone https://github.com/AtomicGameEngine/AtomicExamples"
  99. Dir.chdir("AtomicExamples") do
  100. sh "git archive master | tar -x -C #{$RAKE_ROOT}/Artifacts/Examples"
  101. end
  102. end
  103. end
  104. task :player => "macosx:generate_javascript_bindings" do
  105. Dir.chdir(CMAKE_MACOSX_BUILD_FOLDER) do
  106. # add the generated JS bindings
  107. sh "cmake ../../ -DCMAKE_BUILD_TYPE=Release"
  108. sh "make -j8 AtomicPlayer"
  109. end
  110. end
  111. task :editor => ["macosx:player"] do
  112. Dir.chdir(CMAKE_MACOSX_BUILD_FOLDER) do
  113. sh "make -j8 AtomicEditor"
  114. end
  115. end
  116. end
  117. namespace :package do
  118. task :macosx_preflight => ['macosx:clean',
  119. 'android:player',
  120. "atomictiled:osx",
  121. 'macosx:editor',
  122. 'macosx:generate_examples',
  123. 'macosx:generate_docs'] do
  124. FileUtils.mkdir_p(MACOSX_PACKAGE_FOLDER)
  125. MAC_PLAYER_APP_FOLDER_SRC = "#{CMAKE_MACOSX_BUILD_FOLDER}/Source/AtomicPlayer/AtomicPlayer.app"
  126. MAC_EDITOR_APP_FOLDER_SRC = "#{CMAKE_MACOSX_BUILD_FOLDER}/Source/AtomicEditor/AtomicEditor.app"
  127. # Resources
  128. COREDATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicPlayer/Resources/CoreData"
  129. DATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicPlayer/Resources/Data"
  130. EDITORRESOURCES_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicEditor/Resources/EditorData"
  131. EDITORAPPLICATIONDATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicEditor"
  132. # Project Templates
  133. PROJECTTEMPLATES_FOLDER_SRC = "#{EDITORAPPLICATIONDATA_FOLDER_SRC}/ProjectTemplates"
  134. #Examples
  135. #Example info could possibly go in the AtomicExamples repo
  136. EXAMPLEINFO_FOLDER_SRC = "#{EDITORAPPLICATIONDATA_FOLDER_SRC}/ExampleInfo"
  137. EXAMPLES_FOLDER_SRC = "#{$RAKE_ROOT}/Artifacts/Examples"
  138. #Docs
  139. DOCS_FOLDER_SRC = "#{$RAKE_ROOT}/Artifacts/Docs"
  140. MAC_EDITOR_APP_FOLDER_DST = "#{MACOSX_PACKAGE_FOLDER}/AtomicEditor.app"
  141. MAC_EDITOR_APP_RESOURCE_FOLDER_DST = "#{MACOSX_PACKAGE_FOLDER}/AtomicEditor.app/Contents/Resources"
  142. # Copy the Editor application
  143. sh "cp -r #{MAC_EDITOR_APP_FOLDER_SRC} #{MACOSX_PACKAGE_FOLDER}/AtomicEditor.app"
  144. DEPLOYMENT_FOLDER_DST = "#{MAC_EDITOR_APP_RESOURCE_FOLDER_DST}/Deployment"
  145. # Make Deployment folder
  146. FileUtils.mkdir_p("#{DEPLOYMENT_FOLDER_DST}")
  147. # Copy Resources
  148. sh "cp -r #{COREDATA_FOLDER_SRC} #{MAC_EDITOR_APP_RESOURCE_FOLDER_DST}/CoreData"
  149. sh "cp -r #{DATA_FOLDER_SRC} #{MAC_EDITOR_APP_RESOURCE_FOLDER_DST}/Data"
  150. sh "cp -r #{EDITORRESOURCES_FOLDER_SRC} #{MAC_EDITOR_APP_RESOURCE_FOLDER_DST}/EditorData"
  151. # Copy Deployment
  152. # MacOS deployment
  153. FileUtils.mkdir_p("#{DEPLOYMENT_FOLDER_DST}/MacOS")
  154. sh "cp -r #{MAC_PLAYER_APP_FOLDER_SRC} #{DEPLOYMENT_FOLDER_DST}/MacOS/AtomicPlayer.app"
  155. # Android Deployment
  156. sh "cp -r #{EDITORAPPLICATIONDATA_FOLDER_SRC}/Deployment/Android #{DEPLOYMENT_FOLDER_DST}/Android"
  157. FileUtils.mkdir_p("#{DEPLOYMENT_FOLDER_DST}/Android/libs/armeabi-v7a")
  158. sh "cp #{CMAKE_ANDROID_BUILD_FOLDER}/Source/AtomicPlayer/libAtomicPlayer.so #{DEPLOYMENT_FOLDER_DST}/Android/libs/armeabi-v7a/libAtomicPlayer.so"
  159. sh "cp -r #{EXAMPLES_FOLDER_SRC} #{MAC_EDITOR_APP_RESOURCE_FOLDER_DST}/Examples"
  160. sh "cp -r #{DOCS_FOLDER_SRC} #{MAC_EDITOR_APP_RESOURCE_FOLDER_DST}/Docs"
  161. sh "cp -r #{PROJECTTEMPLATES_FOLDER_SRC} #{MAC_EDITOR_APP_RESOURCE_FOLDER_DST}/ProjectTemplates"
  162. sh "cp -r #{EXAMPLEINFO_FOLDER_SRC} #{MAC_EDITOR_APP_RESOURCE_FOLDER_DST}/ExampleInfo"
  163. # DEPLOY TILED
  164. ATOMICTILED_DEPLOYED_DIR = "#{MAC_EDITOR_APP_FOLDER_DST}/Contents/Applications"
  165. FileUtils.mkdir_p(ATOMICTILED_DEPLOYED_DIR)
  166. FileUtils.cp_r("#{ATOMICTILED_BUILD_DIR}/bin/Tiled.app", "#{ATOMICTILED_DEPLOYED_DIR}/Tiled.app")
  167. Dir.chdir(ATOMICTILED_DEPLOYED_DIR) do
  168. sh "#{$QT_BIN_DIR}/macdeployqt #{ATOMICTILED_DEPLOYED_DIR}/Tiled.app"
  169. end
  170. end
  171. task :macosx_editor do
  172. end
  173. task :windows_preflight => ['windows:clean',
  174. 'windows:editor',
  175. 'atomictiled:windows' ] do
  176. EDITOR_APP_FOLDER_DST = "#{WINDOWS_PACKAGE_FOLDER}/AtomicEditor"
  177. FileUtils.mkdir_p(EDITOR_APP_FOLDER_DST)
  178. PLAYER_APP_EXE_SRC = "#{CMAKE_WINDOWS_BUILD_FOLDER}/Source/AtomicPlayer/AtomicPlayer.exe"
  179. EDITOR_APP_EXE_SRC = "#{CMAKE_WINDOWS_BUILD_FOLDER}/Source/AtomicEditor/AtomicEditor.exe"
  180. DEPLOYMENT_FOLDER = "#{EDITOR_APP_FOLDER_DST}/Deployment/Win64"
  181. # Resources
  182. COREDATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicPlayer/Resources/CoreData"
  183. DATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicPlayer/Resources/Data"
  184. EDITORRESOURCES_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicEditor/Resources/EditorData"
  185. EDITORAPPLICATIONDATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicEditor"
  186. # Project Templates
  187. PROJECTTEMPLATES_FOLDER_SRC = "#{EDITORAPPLICATIONDATA_FOLDER_SRC}/ProjectTemplates"
  188. #Examples
  189. #Example info could possibly go in the AtomicExamples repo
  190. EXAMPLEINFO_FOLDER_SRC = "#{EDITORAPPLICATIONDATA_FOLDER_SRC}/ExampleInfo"
  191. FileUtils.cp_r("#{COREDATA_FOLDER_SRC}", "#{EDITOR_APP_FOLDER_DST}/CoreData")
  192. FileUtils.cp_r("#{DATA_FOLDER_SRC}", "#{EDITOR_APP_FOLDER_DST}/Data")
  193. FileUtils.cp_r("#{EDITORRESOURCES_FOLDER_SRC}", "#{EDITOR_APP_FOLDER_DST}/EditorData")
  194. FileUtils.cp_r("#{PROJECTTEMPLATES_FOLDER_SRC}", "#{EDITOR_APP_FOLDER_DST}/ProjectTemplates")
  195. FileUtils.cp_r("#{EXAMPLEINFO_FOLDER_SRC}", "#{EDITOR_APP_FOLDER_DST}/ExampleInfo")
  196. FileUtils.mkdir_p("#{DEPLOYMENT_FOLDER}")
  197. FileUtils.cp("#{PLAYER_APP_EXE_SRC}", "#{DEPLOYMENT_FOLDER}/AtomicPlayer.exe")
  198. FileUtils.cp("#{EDITOR_APP_EXE_SRC}", "#{EDITOR_APP_FOLDER_DST}/AtomicEditor.exe")
  199. # DEPLOY TILED
  200. ATOMICTILED_DEPLOYED_DIR = "#{EDITOR_APP_FOLDER_DST}/Applications/AtomicTiled"
  201. FileUtils.mkdir_p(ATOMICTILED_DEPLOYED_DIR)
  202. FileUtils.cp("#{ATOMICTILED_BUILD_DIR}/tiled.exe", "#{ATOMICTILED_DEPLOYED_DIR}")
  203. FileUtils.cp("#{ATOMICTILED_BUILD_DIR}/tiled.dll", "#{ATOMICTILED_DEPLOYED_DIR}")
  204. ENV['PATH'] = "#{$QT_BIN_DIR};" + ENV['PATH']
  205. Dir.chdir(ATOMICTILED_DEPLOYED_DIR) do
  206. sh "windeployqt.exe --release #{ATOMICTILED_DEPLOYED_DIR}/tiled.exe"
  207. end
  208. end
  209. task :windows_editor do
  210. MAC_ARTIFACTS_SRC = "Z:/Artifacts/MacOSX_Package/AtomicEditor.app/Contents/Resources"
  211. EDITOR_APP_FOLDER_DST = "#{WINDOWS_PACKAGE_FOLDER}/AtomicEditor"
  212. DEPLOYMENT_FOLDER = "#{EDITOR_APP_FOLDER_DST}/Deployment"
  213. FileUtils.cp_r("#{MAC_ARTIFACTS_SRC}/Deployment/Android", "#{EDITOR_APP_FOLDER_DST}/Deployment/Android")
  214. FileUtils.cp_r("#{MAC_ARTIFACTS_SRC}/Deployment/MacOS", "#{EDITOR_APP_FOLDER_DST}/Deployment/MacOS")
  215. FileUtils.cp_r("#{MAC_ARTIFACTS_SRC}/Docs", "#{EDITOR_APP_FOLDER_DST}/Docs")
  216. FileUtils.cp_r("#{MAC_ARTIFACTS_SRC}/Examples", "#{EDITOR_APP_FOLDER_DST}/Examples")
  217. end
  218. end
  219. namespace :windows do
  220. CMAKE_WINDOWS_BUILD_FOLDER = "#{$RAKE_ROOT}/Artifacts/Windows_Build"
  221. WINDOWS_PACKAGE_FOLDER = "#{$RAKE_ROOT}/Artifacts/Windows_Package"
  222. task :clean do
  223. folders = ["#{CMAKE_WINDOWS_BUILD_FOLDER}", "#{WINDOWS_PACKAGE_FOLDER}",
  224. "#{ARTIFACTS_FOLDER}/AtomicExamples", "#{ARTIFACTS_FOLDER}/Docs",
  225. "#{ARTIFACTS_FOLDER}/Examples", "#{ARTIFACTS_FOLDER}/AtomicTiled_Build"]
  226. for index in 0 ... folders.size
  227. if Dir.exists?(folders[index])
  228. FileUtils.rmtree(folders[index])
  229. end
  230. if Dir.exists?(folders[index])
  231. abort("Unable to clean #{folders[index]}")
  232. end
  233. end
  234. end
  235. task :cmake do
  236. FileUtils.mkdir_p(CMAKE_WINDOWS_BUILD_FOLDER)
  237. Dir.chdir(CMAKE_WINDOWS_BUILD_FOLDER) do
  238. sh "cmake ../../ -G\"NMake Makefiles JOM\" -DCMAKE_BUILD_TYPE=Release"
  239. end
  240. end
  241. task :generate_javascript_bindings => "windows:cmake" do
  242. Dir.chdir(CMAKE_WINDOWS_BUILD_FOLDER) do
  243. sh "jom -j4 JSBind"
  244. sh "./Source/Tools/JSBind/JSBind.exe #{$RAKE_ROOT}"
  245. end
  246. end
  247. task :player => "windows:generate_javascript_bindings" do
  248. Dir.chdir(CMAKE_WINDOWS_BUILD_FOLDER) do
  249. # add the generated JS bindings
  250. sh "cmake ../../ -G\"NMake Makefiles JOM\" -DCMAKE_BUILD_TYPE=Release"
  251. sh "jom -j4 AtomicPlayer"
  252. end
  253. end
  254. task :editor => "windows:player" do
  255. Dir.chdir(CMAKE_WINDOWS_BUILD_FOLDER) do
  256. sh "jom -j4 AtomicEditor"
  257. end
  258. end
  259. end
  260. namespace :atomictiled do
  261. task :windows do
  262. ENV['PATH'] = "#{$QT_BIN_DIR};" + ENV['PATH']
  263. FileUtils.mkdir_p(ATOMICTILED_BUILD_DIR)
  264. Dir.chdir(ATOMICTILED_BUILD_DIR) do
  265. sh "qmake.exe -r \"#{ATOMICTILED_SOURCE_DIR}\\tiled.pro\" \"CONFIG+=release\" \"QMAKE_CXXFLAGS+=-DBUILD_INFO_VERSION=ATOMIC_BUILD\""
  266. sh "#{QT_CREATOR_BIN_DIR}\\jom.exe -j8"
  267. end
  268. end
  269. task :osx do
  270. FileUtils.mkdir_p(ATOMICTILED_BUILD_DIR)
  271. Dir.chdir(ATOMICTILED_BUILD_DIR) do
  272. sh "#{$QT_BIN_DIR}/qmake -r \"#{ATOMICTILED_SOURCE_DIR}/tiled.pro\" \"CONFIG+=release\" \"QMAKE_CXXFLAGS+=-DBUILD_INFO_VERSION=ATOMIC_BUILD\""
  273. sh "make -j8"
  274. end
  275. end
  276. end