| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 | #!/bin/bashset -eif ! [ "x$ANDROID_NDK_HOME" != "x" -a -d "$ANDROID_NDK_HOME" ]; then    echo "ANDROID_NDK_HOME environment variable is not set"    exit 1fiif ! [ "x$ANDROID_HOME" != "x" -a -d "$ANDROID_HOME" ]; then    echo "ANDROID_HOME environment variable is not set"    exit 1fiif [ "x$ANDROID_API" = "x" ]; then    ANDROID_API="$(ls "$ANDROID_HOME/platforms" | grep -E "^android-[0-9]+$" | sed 's/android-//' | sort -n -r | head -1)"    if [ "x$ANDROID_API" = "x" ]; then        echo "No Android platform found in $ANDROID_HOME/platforms"        exit 1    fielse    if ! [ -d "$ANDROID_HOME/platforms/android-$ANDROID_API" ]; then        echo "Android api version $ANDROID_API is not available ($ANDROID_HOME/platforms/android-$ANDROID_API does not exist)" >2        exit 1    fifiandroid_platformdir="$ANDROID_HOME/platforms/android-$ANDROID_API"echo "Building for android api version $ANDROID_API"echo "android_platformdir=$android_platformdir"scriptdir=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")sdl_root=$(cd -P -- "$(dirname -- "$0")/.." && printf '%s\n' "$(pwd -P)")build_root="${sdl_root}/build-android-prefab"android_abis="armeabi-v7a arm64-v8a x86 x86_64"android_api=19android_ndk=21android_stl="c++_shared"sdl_major=$(sed -ne 's/^#define SDL_MAJOR_VERSION  *//p' "${sdl_root}/include/SDL_version.h")sdl_minor=$(sed -ne 's/^#define SDL_MINOR_VERSION  *//p' "${sdl_root}/include/SDL_version.h")sdl_patch=$(sed -ne 's/^#define SDL_PATCHLEVEL  *//p' "${sdl_root}/include/SDL_version.h")sdl_version="${sdl_major}.${sdl_minor}.${sdl_patch}"echo "Building Android prefab package for SDL version $sdl_version"prefabhome="${build_root}/prefab-${sdl_version}"rm -rf "$prefabhome"mkdir -p "${prefabhome}"build_cmake_projects() {    for android_abi in $android_abis; do        echo "Configuring CMake project for $android_abi"        cmake -S "$sdl_root" -B "${build_root}/build_${android_abi}" \            -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake" \            -DANDROID_PLATFORM=${android_platform} \            -DANDROID_ABI=${android_abi} \            -DSDL_SHARED=ON \            -DSDL_STATIC=ON \            -DSDL_STATIC_PIC=ON \            -DSDL_TEST=ON \            -DSDL2_DISABLE_SDL2MAIN=OFF \            -DSDL2_DISABLE_INSTALL=OFF \            -DCMAKE_INSTALL_PREFIX="${build_root}/build_${android_abi}/prefix" \            -DCMAKE_INSTALL_INCLUDEDIR=include \            -DCMAKE_INSTALL_LIBDIR=lib \            -DCMAKE_BUILD_TYPE=Release \            -GNinja        rm -rf "${build_root}/build_${android_abi}/prefix"        echo "Building CMake project for $android_abi"        cmake --build "${build_root}/build_${android_abi}"        echo "Installing CMake project for $android_abi"        cmake --install "${build_root}/build_${android_abi}"    done}classes_sources_jar_path="${prefabhome}/classes-sources.jar"classes_jar_path="${prefabhome}/classes.jar"compile_java() {    classes_sources_root="${prefabhome}/classes-sources"    rm -rf "${classes_sources_root}"    mkdir -p "${classes_sources_root}/META-INF"    echo "Copying LICENSE.txt to java build folder"    cp "$sdl_root/LICENSE.txt" "${classes_sources_root}/META-INF"    echo "Copy JAVA sources to java build folder"    cp -r "$sdl_root/android-project/app/src/main/java/org" "${classes_sources_root}"    java_sourceslist_path="${prefabhome}/java_sources.txt"    pushd "${classes_sources_root}"        echo "Collecting sources for classes-sources.jar"        find "." -name "*.java" >"${java_sourceslist_path}"        find "META-INF" -name "*" >>"${java_sourceslist_path}"        echo "Creating classes-sources.jar"        jar -cf "${classes_sources_jar_path}" "@${java_sourceslist_path}"    popd    classes_root="${prefabhome}/classes"    mkdir -p "${classes_root}/META-INF"    cp "$sdl_root/LICENSE.txt" "${classes_root}/META-INF"    java_sourceslist_path="${prefabhome}/java_sources.txt"    echo "Collecting sources for classes.jar"    find "$sdl_root/android-project/app/src/main/java" -name "*.java" >"${java_sourceslist_path}"    echo "Compiling classes"    javac -encoding utf-8 -classpath "$android_platformdir/android.jar" -d "${classes_root}" "@${java_sourceslist_path}"    java_classeslist_path="${prefabhome}/java_classes.txt"    pushd "${classes_root}"        find "." -name "*.class" >"${java_classeslist_path}"        find "META-INF" -name "*" >>"${java_classeslist_path}"        echo "Creating classes.jar"        jar -cf "${classes_jar_path}" "@${java_classeslist_path}"    popd}pom_filename="SDL${sdl_major}-${sdl_version}.pom"pom_filepath="${prefabhome}/${pom_filename}"create_pom_xml() {    echo "Creating ${pom_filename}"    cat >"${pom_filepath}" <<EOF<project>  <modelVersion>4.0.0</modelVersion>  <groupId>org.libsdl.android</groupId>  <artifactId>SDL${sdl_major}</artifactId>  <version>${sdl_version}</version>  <packaging>aar</packaging>  <name>SDL${sdl_major}</name>  <description>The AAR for SDL${sdl_major}</description>  <url>https://libsdl.org/</url>  <licenses>    <license>      <name>zlib License</name>      <url>https://github.com/libsdl-org/SDL/blob/main/LICENSE.txt</url>      <distribution>repo</distribution>    </license>  </licenses>  <scm>    <connection>scm:git:https://github.com/libsdl-org/SDL</connection>    <url>https://github.com/libsdl-org/SDL</url>  </scm></project>EOF}create_aar_androidmanifest() {    echo "Creating AndroidManifest.xml"    cat >"${aar_root}/AndroidManifest.xml" <<EOF<manifest    xmlns:android="http://schemas.android.com/apk/res/android"    package="org.libsdl.android" android:versionCode="1"    android:versionName="1.0">	<uses-sdk android:minSdkVersion="16"              android:targetSdkVersion="29"/></manifest>EOF}echo "Creating AAR root directory"aar_root="${prefabhome}/SDL${sdl_major}-${sdl_version}"mkdir -p "${aar_root}"aar_metainfdir_path=${aar_root}/META-INFmkdir -p "${aar_metainfdir_path}"cp "${sdl_root}/LICENSE.txt" "${aar_metainfdir_path}"prefabworkdir="${aar_root}/prefab"mkdir -p "${prefabworkdir}"cat >"${prefabworkdir}/prefab.json" <<EOF{  "schema_version": 2,  "name": "SDL$sdl_major",  "version": "$sdl_version",  "dependencies": []}EOFmodulesworkdir="${prefabworkdir}/modules"mkdir -p "${modulesworkdir}"create_shared_sdl_module() {    echo "Creating SDL${sdl_major} prefab module"    for android_abi in $android_abis; do        sdl_moduleworkdir="${modulesworkdir}/SDL${sdl_major}"        mkdir -p "${sdl_moduleworkdir}"        abi_build_prefix="${build_root}/build_${android_abi}/prefix"        cat >"${sdl_moduleworkdir}/module.json" <<EOF{  "export_libraries": [],  "library_name": "libSDL${sdl_major}"}EOF        mkdir -p "${sdl_moduleworkdir}/include"        cp -r "${abi_build_prefix}/include/SDL${sdl_major}/"* "${sdl_moduleworkdir}/include/"        rm "${sdl_moduleworkdir}/include/SDL_config.h"        cp "$sdl_root/include/SDL_config.h" "$sdl_root/include/SDL_config_android.h" "${sdl_moduleworkdir}/include/"        abi_sdllibdir="${sdl_moduleworkdir}/libs/android.${android_abi}"        mkdir -p "${abi_sdllibdir}"        cat >"${abi_sdllibdir}/abi.json" <<EOF{  "abi": "${android_abi}",  "api": ${android_api},  "ndk": ${android_ndk},  "stl": "${android_stl}",  "static": false}EOF        cp "${abi_build_prefix}/lib/libSDL${sdl_major}.so" "${abi_sdllibdir}"    done}create_static_sdl_module() {    echo "Creating SDL${sdl_major}-static prefab module"    for android_abi in $android_abis; do        sdl_moduleworkdir="${modulesworkdir}/SDL${sdl_major}-static"        mkdir -p "${sdl_moduleworkdir}"        abi_build_prefix="${build_root}/build_${android_abi}/prefix"        cat >"${sdl_moduleworkdir}/module.json" <<EOF{  "export_libraries": ["-ldl", "-lGLESv1_CM", "-lGLESv2", "-llog", "-landroid", "-lOpenSLES"]  "library_name": "libSDL${sdl_major}"}EOF        mkdir -p "${sdl_moduleworkdir}/include"        cp -r "${abi_build_prefix}/include/SDL${sdl_major}/"* "${sdl_moduleworkdir}/include"        rm "${sdl_moduleworkdir}/include/SDL_config.h"        cp "$sdl_root/include/SDL_config.h" "$sdl_root/include/SDL_config_android.h" "${sdl_moduleworkdir}/include/"        abi_sdllibdir="${sdl_moduleworkdir}/libs/android.${android_abi}"        mkdir -p "${abi_sdllibdir}"        cat >"${abi_sdllibdir}/abi.json" <<EOF{  "abi": "${android_abi}",  "api": ${android_api},  "ndk": ${android_ndk},  "stl": "${android_stl}",  "static": true}EOF        cp "${abi_build_prefix}/lib/libSDL${sdl_major}.a" "${abi_sdllibdir}"    done}create_sdlmain_module() {    echo "Creating SDL${sdl_major}main prefab module"    for android_abi in $android_abis; do        sdl_moduleworkdir="${modulesworkdir}/SDL${sdl_major}main"        mkdir -p "${sdl_moduleworkdir}"        abi_build_prefix="${build_root}/build_${android_abi}/prefix"        cat >"${sdl_moduleworkdir}/module.json" <<EOF{  "export_libraries": [],  "library_name": "libSDL${sdl_major}main"}EOF        abi_sdllibdir="${sdl_moduleworkdir}/libs/android.${android_abi}"        mkdir -p "${abi_sdllibdir}"        cat >"${abi_sdllibdir}/abi.json" <<EOF{  "abi": "${android_abi}",  "api": ${android_api},  "ndk": ${android_ndk},  "stl": "${android_stl}",  "static": true}EOF        cp "${abi_build_prefix}/lib/libSDL${sdl_major}main.a" "${abi_sdllibdir}"    done}create_sdltest_module() {    echo "Creating SDL${sdl_major}test prefab module"    for android_abi in $android_abis; do        sdl_moduleworkdir="${modulesworkdir}/SDL${sdl_major}test"        mkdir -p "${sdl_moduleworkdir}"        abi_build_prefix="${build_root}/build_${android_abi}/prefix"        cat >"${sdl_moduleworkdir}/module.json" <<EOF{  "export_libraries": [],  "library_name": "libSDL${sdl_major}_test"}EOF        abi_sdllibdir="${sdl_moduleworkdir}/libs/android.${android_abi}"        mkdir -p "${abi_sdllibdir}"        cat >"${abi_sdllibdir}/abi.json" <<EOF{  "abi": "${android_abi}",  "api": ${android_api},  "ndk": ${android_ndk},  "stl": "${android_stl}",  "static": true}EOF        cp "${abi_build_prefix}/lib/libSDL${sdl_major}_test.a" "${abi_sdllibdir}"    done}build_cmake_projectscompile_javacreate_pom_xmlcreate_aar_androidmanifestcreate_shared_sdl_modulecreate_static_sdl_modulecreate_sdlmain_modulecreate_sdltest_modulepushd "${aar_root}"    aar_filename="SDL${sdl_major}-${sdl_version}.aar"    cp "${classes_jar_path}" ./classes.jar    cp "${classes_sources_jar_path}" ./classes-sources.jar    zip -r "${aar_filename}" AndroidManifest.xml classes.jar classes-sources.jar prefab META-INF    zip -Tv "${aar_filename}" 2>/dev/null ;    mv "${aar_filename}" "${prefabhome}"popdmaven_filename="SDL${sdl_major}-${sdl_version}.zip"pushd "${prefabhome}"    zip_filename="SDL${sdl_major}-${sdl_version}.zip"    zip "${maven_filename}" "${aar_filename}" "${pom_filename}" 2>/dev/null;    zip -Tv "${zip_filename}" 2>/dev/null;popdecho "Prefab zip is ready at ${prefabhome}/${aar_filename}"echo "Maven archive is ready at ${prefabhome}/${zip_filename}"
 |