package.sh 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #!/bin/sh
  2. # SPDX-License-Identifier: GPL-3.0-or-later
  3. # Copyright (c) 2012-2024 Daniele Bartolini et al.
  4. if [ $# -lt 1 ]; then
  5. echo "Usage: $0 <platform> <arch> [version]"
  6. echo ""
  7. echo "e.g."
  8. echo "$0 linux x64 0.38.0" # Create package for linux x64, v0.38.0
  9. echo "$0 android arm64" # Version is inferred from last Git tag
  10. exit
  11. fi
  12. PLATFORM=$1
  13. ARCH=$2
  14. VERSION=$3
  15. # Validate platform/arch combination.
  16. if [ "${PLATFORM}" = "android" ]; then
  17. if [ "${ARCH}" != "arm" ] && [ "${ARCH}" != "arm64" ]; then
  18. echo "Invalid architecture ${ARCH}"
  19. exit 1
  20. fi
  21. elif [ "${PLATFORM}" = "html5" ]; then
  22. if [ "${ARCH}" != "wasm" ]; then
  23. echo "Invalid architecture ${ARCH}"
  24. exit 1
  25. fi
  26. elif [ "${PLATFORM}" = "linux" ]; then
  27. if [ "${ARCH}" != "x64" ]; then
  28. echo "Invalid architecture ${ARCH}"
  29. exit 1
  30. fi
  31. elif [ "${PLATFORM}" = "windows" ]; then
  32. if [ "${ARCH}" != "x64" ]; then
  33. echo "Invalid architecture ${ARCH}"
  34. exit 1
  35. fi
  36. else
  37. echo "Invalid platform ${PLATFORM}"
  38. exit 1
  39. fi
  40. # If version is not specified, extract it from most recent tag name.
  41. if [ -z "${VERSION}" ]; then
  42. VERSION=$(git tag | tail -n 1| cut -c2-)
  43. fi
  44. BUILD_JOBS=$(nproc)
  45. if [ "${PLATFORM}" = "windows" ]; then
  46. EXE_SUFFIX=.exe
  47. else
  48. EXE_SUFFIX=
  49. fi
  50. # Destination folder.
  51. PACKAGENAME=crown-"${VERSION}"
  52. # Tarball name.
  53. ZIP="tar -zcf"
  54. TARBALLEXTENSION=tar.gz
  55. if [ "${PLATFORM}" = "windows" ]; then
  56. ZIP="zip -rq"
  57. TARBALLEXTENSION=zip
  58. fi
  59. TARBALLNAME="crown-${VERSION}-${PLATFORM}-${ARCH}.${TARBALLEXTENSION}"
  60. echo "Crown '${VERSION}' will be packaged as '${TARBALLNAME}'"
  61. echo "Continue? [y/N]"
  62. read -r answer
  63. if [ "${answer}" != "y" ] && [ "${answer}" != "Y" ]; then
  64. echo "Bye."
  65. exit;
  66. fi
  67. # Cleanup previous builds.
  68. make clean
  69. rm -rf "${TARBALLNAME}"
  70. rm -rf "${PACKAGENAME}"
  71. # Switch to desired tag.
  72. if [ "${VERSION}" = "master" ]; then
  73. git checkout "${VERSION}"
  74. else
  75. git checkout v"${VERSION}"
  76. fi
  77. # Build engine and tools.
  78. if [ "${PLATFORM}" = "android" ]; then
  79. export ANDROID_NDK_ROOT="$HOME"/android-sdk/ndk/21.4.7075529
  80. export ANDROID_NDK_ABI=23
  81. make android-"${ARCH}"-development MAKE_JOBS="${BUILD_JOBS}"
  82. make android-"${ARCH}"-release MAKE_JOBS="${BUILD_JOBS}"
  83. elif [ "${PLATFORM}" = "html5" ]; then
  84. export EMSCRIPTEN="$HOME"/emsdk/upstream/emscripten
  85. make wasm-development MAKE_JOBS="${BUILD_JOBS}"
  86. make wasm-release MAKE_JOBS="${BUILD_JOBS}"
  87. elif [ "${PLATFORM}" = "linux" ]; then
  88. make tools-linux-release32 MAKE_JOBS="${BUILD_JOBS}"
  89. make tools-linux-release64 MAKE_JOBS="${BUILD_JOBS}"
  90. make linux-release64 MAKE_JOBS="${BUILD_JOBS}"
  91. elif [ "${PLATFORM}" = "windows" ]; then
  92. /c/Windows/System32/cmd.exe //C "scripts\\dist\\windows-release.bat"
  93. # Build 64bit tools first.
  94. export MINGW=/mingw64
  95. export PATH="${MINGW}/bin:${PATH}"
  96. make tools-mingw-release64 MAKE_JOBS="${BUILD_JOBS}"
  97. # Copy required DLLs.
  98. ldd build/mingw64/bin/level-editor-release.exe | grep '\/mingw.*\.dll' -o | xargs -I{} cp "{}" build/mingw64/bin
  99. # Copy GTK-related executables.
  100. cp /mingw64/bin/fc-cache.exe build/mingw64/bin
  101. cp /mingw64/bin/fc-cat.exe build/mingw64/bin
  102. cp /mingw64/bin/fc-list.exe build/mingw64/bin
  103. cp /mingw64/bin/fc-match.exe build/mingw64/bin
  104. cp /mingw64/bin/fc-pattern.exe build/mingw64/bin
  105. cp /mingw64/bin/fc-query.exe build/mingw64/bin
  106. cp /mingw64/bin/fc-scan.exe build/mingw64/bin
  107. cp /mingw64/bin/fc-validate.exe build/mingw64/bin
  108. cp /mingw64/bin/gdbus.exe build/mingw64/bin
  109. cp /mingw64/bin/gdk-pixbuf-query-loaders.exe build/mingw64/bin
  110. cp /mingw64/bin/gspawn-win64-helper-console.exe build/mingw64/bin
  111. cp /mingw64/bin/gspawn-win64-helper.exe build/mingw64/bin
  112. cp /mingw64/bin/gtk-query-immodules-3.0.exe build/mingw64/bin
  113. cp /mingw64/bin/gtk-update-icon-cache.exe build/mingw64/bin
  114. # Copy additional DLLs.
  115. cp /mingw64/bin/liblzma-5.dll build/mingw64/bin
  116. cp /mingw64/bin/librsvg-2-2.dll build/mingw64/bin
  117. cp /mingw64/bin/libxml2-2.dll build/mingw64/bin
  118. # Copy GDK pixbuf loaders.
  119. mkdir -p build/mingw64/lib/gdk-pixbuf-2.0/2.10.0/loaders
  120. cp -r /mingw64/lib/gdk-pixbuf-2.0/2.10.0/loaders/*pixbufloader*.dll build/mingw64/lib/gdk-pixbuf-2.0/2.10.0/loaders
  121. cp -r /mingw64/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache build/mingw64/lib/gdk-pixbuf-2.0/2.10.0
  122. # Copy GLib schemas.
  123. mkdir -p build/mingw64/share/glib-2.0/schemas
  124. cp -r /mingw64/share/glib-2.0/schemas/gschemas.compiled build/mingw64/share/glib-2.0/schemas
  125. # Copy Adwaita and hicolor icons.
  126. mkdir -p build/mingw64/share/icons/Adwaita/scalable
  127. mkdir -p build/mingw64/share/icons/Adwaita/symbolic
  128. mkdir -p build/mingw64/share/icons/Adwaita/cursors
  129. cp -r /mingw64/share/icons/Adwaita/icon-theme.cache build/mingw64/share/icons/Adwaita
  130. cp -r /mingw64/share/icons/Adwaita/index.theme build/mingw64/share/icons/Adwaita
  131. cp -r /mingw64/share/icons/Adwaita/scalable/* build/mingw64/share/icons/Adwaita/scalable
  132. cp -r /mingw64/share/icons/Adwaita/symbolic/* build/mingw64/share/icons/Adwaita/symbolic
  133. cp -r /mingw64/share/icons/Adwaita/cursors/* build/mingw64/share/icons/Adwaita/cursors
  134. cp -r /mingw64/share/icons/hicolor build/mingw64/share/icons
  135. # Switch to 32bit toolchain, re-generate projects and build 32bit tools.
  136. export MINGW=/mingw32
  137. export PATH="${MINGW}/bin:${PATH}"
  138. make -B tools-mingw-release32 MAKE_JOBS="${BUILD_JOBS}"
  139. # Rename mingw* to windows*.
  140. cp -r build/mingw64/* build/windows64 # windows64 exists already, just copy mingw stuff into it (see: windows-release.bat).
  141. rm -r build/mingw64
  142. mv build/mingw32 build/windows32
  143. fi
  144. # Strip unnecessary files from build dir.
  145. find build -iname 'obj' \
  146. -o -iname 'projects' \
  147. -o -wholename 'android-*/bin/jit' \
  148. -o -iname '*.a' \
  149. -o -iname '*.exp' \
  150. -o -iname '*.ilk' \
  151. -o -iname '*.lib' \
  152. -o -iname 'bgfx-*' \
  153. -o -iname 'bimg_decode-*' \
  154. -o -iname 'bimg_encode-*' \
  155. -o -iname 'bimg-*' \
  156. -o -iname 'bullet-*' \
  157. -o -iname 'bx-*' \
  158. | tr '\n' '\0' \
  159. | xargs -0 -n1 rm -rf
  160. # Create release package from build dir.
  161. mv build platforms
  162. mkdir "${PACKAGENAME}"
  163. mv platforms "${PACKAGENAME}"
  164. if [ "${PLATFORM}" = "linux" ] || [ "${PLATFORM}" = "windows" ]; then
  165. # Add target platforms binaries to package.
  166. for platform_tar in *.tar.gz; do
  167. if [ -f "${platform_tar}" ]; then
  168. tar xf "${platform_tar}" --directory=./
  169. fi
  170. done
  171. # Copy exporters, samples etc. to package dir.
  172. cp LICENSE "${PACKAGENAME}"
  173. cp -r exporters "${PACKAGENAME}"
  174. cp -r samples "${PACKAGENAME}"
  175. mv "${PACKAGENAME}"/samples/core "${PACKAGENAME}"
  176. # Create script that launches the editor.
  177. if [ "${PLATFORM}" = "linux" ]; then
  178. {
  179. echo "#!/bin/sh"
  180. echo "PROJECT=\$1"
  181. echo "LEVEL=\$2"
  182. echo "if [ ! -z \$PROJECT ]; then"
  183. echo " PROJECT=\$(readlink -f \${PROJECT})"
  184. echo "fi"
  185. # https://stackoverflow.com/questions/59895/how-to-get-the-source-directory-of-a-bash-script-from-within-the-script-itself
  186. echo "DIR=\"\$( cd \"\$( dirname \"\$0\" )\" >/dev/null 2>&1 && pwd )\""
  187. echo "cd \${DIR}/platforms/linux64/bin"
  188. echo "export UBUNTU_MENUPROXY="
  189. echo "./level-editor-release \${PROJECT} \${LEVEL}"
  190. } > "${PACKAGENAME}"/crown
  191. chmod +x "${PACKAGENAME}"/crown
  192. elif [ "${PLATFORM}" = "windows" ]; then
  193. {
  194. echo "@echo off"
  195. echo "call :ABSOLUTEPATH %1"
  196. echo "set PROJECT=%RETVAL%"
  197. echo "set LEVEL=%2"
  198. echo ""
  199. echo "cd platforms\windows64\bin"
  200. echo "start level-editor-release.exe %PROJECT% %LEVEL%"
  201. echo ""
  202. echo "exit"
  203. echo ""
  204. echo ":ABSOLUTEPATH"
  205. echo " SET RETVAL=%~dpfn1"
  206. echo " EXIT /B"
  207. } > "${PACKAGENAME}"/crown.bat
  208. fi
  209. fi
  210. # Compress package.
  211. ${ZIP} "${TARBALLNAME}" "${PACKAGENAME}"
  212. # Copy package to server.
  213. if [ ! -z "${PACKAGESERVER}" ]; then
  214. if [ "${PLATFORM}" = "linux" ]; then
  215. ssh "${PACKAGESERVER}" "mkdir -p ~/Data/vms/${PACKAGENAME}"
  216. fi
  217. scp "${TARBALLNAME}" "${PACKAGESERVER}":~/Data/vms/"${PACKAGENAME}"
  218. fi