package.sh 7.7 KB

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