android-prefab.sh 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. #!/bin/bash
  2. set -e
  3. if ! [ "x$ANDROID_NDK_HOME" != "x" -a -d "$ANDROID_NDK_HOME" ]; then
  4. echo "ANDROID_NDK_HOME environment variable is not set"
  5. exit 1
  6. fi
  7. if ! [ "x$ANDROID_HOME" != "x" -a -d "$ANDROID_HOME" ]; then
  8. echo "ANDROID_HOME environment variable is not set"
  9. exit 1
  10. fi
  11. if [ "x$ANDROID_API" = "x" ]; then
  12. ANDROID_API="$(ls "$ANDROID_HOME/platforms" | grep -E "^android-[0-9]+$" | sed 's/android-//' | sort -n -r | head -1)"
  13. if [ "x$ANDROID_API" = "x" ]; then
  14. echo "No Android platform found in $ANDROID_HOME/platforms"
  15. exit 1
  16. fi
  17. else
  18. if ! [ -d "$ANDROID_HOME/platforms/android-$ANDROID_API" ]; then
  19. echo "Android api version $ANDROID_API is not available ($ANDROID_HOME/platforms/android-$ANDROID_API does not exist)" >2
  20. exit 1
  21. fi
  22. fi
  23. android_platformdir="$ANDROID_HOME/platforms/android-$ANDROID_API"
  24. echo "Building for android api version $ANDROID_API"
  25. echo "android_platformdir=$android_platformdir"
  26. scriptdir=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")
  27. sdl_root=$(cd -P -- "$(dirname -- "$0")/.." && printf '%s\n' "$(pwd -P)")
  28. build_root="${sdl_root}/build-android-prefab"
  29. android_abis="armeabi-v7a arm64-v8a x86 x86_64"
  30. android_api=19
  31. android_ndk=21
  32. android_stl="c++_shared"
  33. sdl_major=$(sed -ne 's/^#define SDL_MAJOR_VERSION *//p' "${sdl_root}/include/SDL3/SDL_version.h")
  34. sdl_minor=$(sed -ne 's/^#define SDL_MINOR_VERSION *//p' "${sdl_root}/include/SDL3/SDL_version.h")
  35. sdl_micro=$(sed -ne 's/^#define SDL_MICRO_VERSION *//p' "${sdl_root}/include/SDL3/SDL_version.h")
  36. sdl_version="${sdl_major}.${sdl_minor}.${sdl_micro}"
  37. echo "Building Android prefab package for SDL version $sdl_version"
  38. prefabhome="${build_root}/prefab-${sdl_version}"
  39. rm -rf "$prefabhome"
  40. mkdir -p "${prefabhome}"
  41. build_cmake_projects() {
  42. for android_abi in $android_abis; do
  43. echo "Configuring CMake project for $android_abi"
  44. cmake -S "$sdl_root" -B "${build_root}/build_${android_abi}" \
  45. -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake" \
  46. -DANDROID_PLATFORM=${android_platform} \
  47. -DANDROID_ABI=${android_abi} \
  48. -DSDL_SHARED=ON \
  49. -DSDL_STATIC=ON \
  50. -DSDL_STATIC_PIC=ON \
  51. -DSDL_TEST=ON \
  52. -DSDL_DISABLE_INSTALL=OFF \
  53. -DCMAKE_INSTALL_PREFIX="${build_root}/build_${android_abi}/prefix" \
  54. -DCMAKE_INSTALL_INCLUDEDIR=include \
  55. -DCMAKE_INSTALL_LIBDIR=lib \
  56. -DCMAKE_BUILD_TYPE=Release \
  57. -GNinja
  58. rm -rf "${build_root}/build_${android_abi}/prefix"
  59. echo "Building CMake project for $android_abi"
  60. cmake --build "${build_root}/build_${android_abi}"
  61. echo "Installing CMake project for $android_abi"
  62. cmake --install "${build_root}/build_${android_abi}"
  63. done
  64. }
  65. classes_sources_jar_path="${prefabhome}/classes-sources.jar"
  66. classes_jar_path="${prefabhome}/classes.jar"
  67. compile_java() {
  68. classes_sources_root="${prefabhome}/classes-sources"
  69. rm -rf "${classes_sources_root}"
  70. mkdir -p "${classes_sources_root}/META-INF"
  71. echo "Copying LICENSE.txt to java build folder"
  72. cp "$sdl_root/LICENSE.txt" "${classes_sources_root}/META-INF"
  73. echo "Copy JAVA sources to java build folder"
  74. cp -r "$sdl_root/android-project/app/src/main/java/org" "${classes_sources_root}"
  75. java_sourceslist_path="${prefabhome}/java_sources.txt"
  76. pushd "${classes_sources_root}"
  77. echo "Collecting sources for classes-sources.jar"
  78. find "." -name "*.java" >"${java_sourceslist_path}"
  79. find "META-INF" -name "*" >>"${java_sourceslist_path}"
  80. echo "Creating classes-sources.jar"
  81. jar -cf "${classes_sources_jar_path}" "@${java_sourceslist_path}"
  82. popd
  83. classes_root="${prefabhome}/classes"
  84. mkdir -p "${classes_root}/META-INF"
  85. cp "$sdl_root/LICENSE.txt" "${classes_root}/META-INF"
  86. java_sourceslist_path="${prefabhome}/java_sources.txt"
  87. echo "Collecting sources for classes.jar"
  88. find "$sdl_root/android-project/app/src/main/java" -name "*.java" >"${java_sourceslist_path}"
  89. echo "Compiling classes"
  90. javac -encoding utf-8 -classpath "$android_platformdir/android.jar" -d "${classes_root}" "@${java_sourceslist_path}"
  91. java_classeslist_path="${prefabhome}/java_classes.txt"
  92. pushd "${classes_root}"
  93. find "." -name "*.class" >"${java_classeslist_path}"
  94. find "META-INF" -name "*" >>"${java_classeslist_path}"
  95. echo "Creating classes.jar"
  96. jar -cf "${classes_jar_path}" "@${java_classeslist_path}"
  97. popd
  98. }
  99. pom_filename="SDL${sdl_major}-${sdl_version}.pom"
  100. pom_filepath="${prefabhome}/${pom_filename}"
  101. create_pom_xml() {
  102. echo "Creating ${pom_filename}"
  103. cat >"${pom_filepath}" <<EOF
  104. <project>
  105. <modelVersion>4.0.0</modelVersion>
  106. <groupId>org.libsdl.android</groupId>
  107. <artifactId>SDL${sdl_major}</artifactId>
  108. <version>${sdl_version}</version>
  109. <packaging>aar</packaging>
  110. <name>SDL${sdl_major}</name>
  111. <description>The AAR for SDL${sdl_major}</description>
  112. <url>https://libsdl.org/</url>
  113. <licenses>
  114. <license>
  115. <name>zlib License</name>
  116. <url>https://github.com/libsdl-org/SDL/blob/main/LICENSE.txt</url>
  117. <distribution>repo</distribution>
  118. </license>
  119. </licenses>
  120. <scm>
  121. <connection>scm:git:https://github.com/libsdl-org/SDL</connection>
  122. <url>https://github.com/libsdl-org/SDL</url>
  123. </scm>
  124. </project>
  125. EOF
  126. }
  127. create_aar_androidmanifest() {
  128. echo "Creating AndroidManifest.xml"
  129. cat >"${aar_root}/AndroidManifest.xml" <<EOF
  130. <manifest
  131. xmlns:android="http://schemas.android.com/apk/res/android"
  132. package="org.libsdl.android" android:versionCode="1"
  133. android:versionName="1.0">
  134. <uses-sdk android:minSdkVersion="16"
  135. android:targetSdkVersion="29"/>
  136. </manifest>
  137. EOF
  138. }
  139. echo "Creating AAR root directory"
  140. aar_root="${prefabhome}/SDL${sdl_major}-${sdl_version}"
  141. mkdir -p "${aar_root}"
  142. aar_metainfdir_path=${aar_root}/META-INF
  143. mkdir -p "${aar_metainfdir_path}"
  144. cp "${sdl_root}/LICENSE.txt" "${aar_metainfdir_path}"
  145. prefabworkdir="${aar_root}/prefab"
  146. mkdir -p "${prefabworkdir}"
  147. cat >"${prefabworkdir}/prefab.json" <<EOF
  148. {
  149. "schema_version": 2,
  150. "name": "SDL$sdl_major",
  151. "version": "$sdl_version",
  152. "dependencies": []
  153. }
  154. EOF
  155. modulesworkdir="${prefabworkdir}/modules"
  156. mkdir -p "${modulesworkdir}"
  157. create_shared_sdl_module() {
  158. echo "Creating SDL${sdl_major} prefab module"
  159. for android_abi in $android_abis; do
  160. sdl_moduleworkdir="${modulesworkdir}/SDL${sdl_major}"
  161. mkdir -p "${sdl_moduleworkdir}"
  162. abi_build_prefix="${build_root}/build_${android_abi}/prefix"
  163. cat >"${sdl_moduleworkdir}/module.json" <<EOF
  164. {
  165. "export_libraries": [],
  166. "library_name": "libSDL${sdl_major}"
  167. }
  168. EOF
  169. mkdir -p "${sdl_moduleworkdir}/include/SDL${sdl_major}"
  170. cp -r "${abi_build_prefix}/include/SDL${sdl_major}/"* "${sdl_moduleworkdir}/include/SDL${sdl_major}"
  171. abi_sdllibdir="${sdl_moduleworkdir}/libs/android.${android_abi}"
  172. mkdir -p "${abi_sdllibdir}"
  173. cat >"${abi_sdllibdir}/abi.json" <<EOF
  174. {
  175. "abi": "${android_abi}",
  176. "api": ${android_api},
  177. "ndk": ${android_ndk},
  178. "stl": "${android_stl}",
  179. "static": false
  180. }
  181. EOF
  182. cp "${abi_build_prefix}/lib/libSDL${sdl_major}.so" "${abi_sdllibdir}"
  183. done
  184. }
  185. create_static_sdl_module() {
  186. echo "Creating SDL${sdl_major}-static prefab module"
  187. for android_abi in $android_abis; do
  188. sdl_moduleworkdir="${modulesworkdir}/SDL${sdl_major}-static"
  189. mkdir -p "${sdl_moduleworkdir}"
  190. abi_build_prefix="${build_root}/build_${android_abi}/prefix"
  191. cat >"${sdl_moduleworkdir}/module.json" <<EOF
  192. {
  193. "export_libraries": ["-ldl", "-lGLESv1_CM", "-lGLESv2", "-llog", "-landroid", "-lOpenSLES"]
  194. "library_name": "libSDL${sdl_major}"
  195. }
  196. EOF
  197. mkdir -p "${sdl_moduleworkdir}/include/SDL${sdl_major}"
  198. cp -r "${abi_build_prefix}/include/SDL${sdl_major}/"* "${sdl_moduleworkdir}/include/SDL${sdl_major}"
  199. abi_sdllibdir="${sdl_moduleworkdir}/libs/android.${android_abi}"
  200. mkdir -p "${abi_sdllibdir}"
  201. cat >"${abi_sdllibdir}/abi.json" <<EOF
  202. {
  203. "abi": "${android_abi}",
  204. "api": ${android_api},
  205. "ndk": ${android_ndk},
  206. "stl": "${android_stl}",
  207. "static": true
  208. }
  209. EOF
  210. cp "${abi_build_prefix}/lib/libSDL${sdl_major}.a" "${abi_sdllibdir}"
  211. done
  212. }
  213. create_sdltest_module() {
  214. echo "Creating SDL${sdl_major}test prefab module"
  215. for android_abi in $android_abis; do
  216. sdl_moduleworkdir="${modulesworkdir}/SDL${sdl_major}test"
  217. mkdir -p "${sdl_moduleworkdir}"
  218. abi_build_prefix="${build_root}/build_${android_abi}/prefix"
  219. cat >"${sdl_moduleworkdir}/module.json" <<EOF
  220. {
  221. "export_libraries": [],
  222. "library_name": "libSDL${sdl_major}_test"
  223. }
  224. EOF
  225. abi_sdllibdir="${sdl_moduleworkdir}/libs/android.${android_abi}"
  226. mkdir -p "${abi_sdllibdir}"
  227. cat >"${abi_sdllibdir}/abi.json" <<EOF
  228. {
  229. "abi": "${android_abi}",
  230. "api": ${android_api},
  231. "ndk": ${android_ndk},
  232. "stl": "${android_stl}",
  233. "static": true
  234. }
  235. EOF
  236. cp "${abi_build_prefix}/lib/libSDL${sdl_major}_test.a" "${abi_sdllibdir}"
  237. done
  238. }
  239. build_cmake_projects
  240. compile_java
  241. create_pom_xml
  242. create_aar_androidmanifest
  243. create_shared_sdl_module
  244. create_static_sdl_module
  245. create_sdltest_module
  246. pushd "${aar_root}"
  247. aar_filename="SDL${sdl_major}-${sdl_version}.aar"
  248. cp "${classes_jar_path}" ./classes.jar
  249. cp "${classes_sources_jar_path}" ./classes-sources.jar
  250. zip -r "${aar_filename}" AndroidManifest.xml classes.jar classes-sources.jar prefab META-INF
  251. zip -Tv "${aar_filename}" 2>/dev/null ;
  252. mv "${aar_filename}" "${prefabhome}"
  253. popd
  254. maven_filename="SDL${sdl_major}-${sdl_version}.zip"
  255. pushd "${prefabhome}"
  256. zip_filename="SDL${sdl_major}-${sdl_version}.zip"
  257. zip "${maven_filename}" "${aar_filename}" "${pom_filename}" 2>/dev/null;
  258. zip -Tv "${zip_filename}" 2>/dev/null;
  259. popd
  260. echo "Prefab zip is ready at ${prefabhome}/${aar_filename}"
  261. echo "Maven archive is ready at ${prefabhome}/${zip_filename}"