diff --git a/.github/workflows/nightly-android.yml b/.github/workflows/nightly-android.yml index 82d98cbd65f..1a9f7f3d506 100644 --- a/.github/workflows/nightly-android.yml +++ b/.github/workflows/nightly-android.yml @@ -18,7 +18,7 @@ jobs: run: | sudo dpkg --add-architecture i386 sudo apt-get -yqq update - sudo apt-get -ym install curl expect git libc6:i386 libgcc1:i386 libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk wget unzip vim make subversion zip + sudo apt-get -ym install curl expect git libc6:i386 libgcc1:i386 libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-17-jdk wget unzip vim make subversion zip - name: Setup Android SDK environment variables run: | @@ -26,6 +26,7 @@ jobs: echo "ANDROID_SDK_HOME=/opt/android-sdk-linux" >> $GITHUB_ENV echo "ANDROID_SDK_ROOT=/opt/android-sdk-linux" >> $GITHUB_ENV echo "ANDROID_SDK=/opt/android-sdk-linux" >> $GITHUB_ENV + echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" >> $GITHUB_ENV - name: Create working directory for next steps run: | @@ -47,99 +48,76 @@ jobs: mv latest cmdline-tools/latest echo "$ANDROID_HOME/cmdline-tools/latest/bin" >> $GITHUB_PATH - # licenses required for Android SDK must be found somewhere; them being rather simple they are hardcoded here, but they could also be stored as files - - name: Setup licenses files for Android SDK - working-directory: /opt/android-sdk-linux - run: | - mkdir licenses - echo "\n8933bad161af4178b1185d1a37fbf41ea5269c55\n24333f8a63b6825ea9c5514f83c2829b004d1fee" >> licenses/android-sdk-license - echo "\n84831b9409646a918e30573bab4c9c91346d8abd" >> licenses/android-sdk-preview-license - - name: Install Android SDK dependencies working-directory: /opt/android-sdk-linux run: | + yes | sdkmanager --licenses yes | sdkmanager --install "platform-tools" echo "$ANDROID_HOME/platform-tools" >> $GITHUB_PATH - yes | sdkmanager --install "build-tools;30.0.3" - echo "$ANDROID_HOME/build-tools/30.0.3" >> $GITHUB_PATH - yes | sdkmanager --install "cmake;3.18.1" - echo "$ANDROID_HOME/cmake/3.18.1/bin" >> $GITHUB_PATH - yes | sdkmanager --install "ndk;23.0.7599858" - echo "$ANDROID_HOME/ndk/23.0.7599858" >> $GITHUB_PATH - echo "$ANDROID_HOME/ndk/23.0.7599858/toolchains/llvm/prebuilt/linux-x86_64/bin/" >> $GITHUB_PATH - ln -s llvm-objdump ${ANDROID_HOME}/ndk/23.0.7599858/toolchains/llvm/prebuilt/linux-x86_64/bin/objdump + yes | sdkmanager --install "build-tools;34.0.0-rc3" + echo "$ANDROID_HOME/build-tools/34.0.0-rc3" >> $GITHUB_PATH + yes | sdkmanager --install "cmake;3.22.1" + echo "$ANDROID_HOME/cmake/3.22.1/bin" >> $GITHUB_PATH + yes | sdkmanager --install "ndk;25.1.8937393" + echo "$ANDROID_HOME/ndk/25.1.8937393" >> $GITHUB_PATH + echo "$ANDROID_HOME/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/" >> $GITHUB_PATH + ln -s llvm-objdump ${ANDROID_HOME}/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/objdump - name: Install keystore for Android APK signing run: | mkdir /home/runner/.android/ keytool -genkey -v -keystore /home/runner/.android/debug.keystore -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 -keypass android -storepass android -dname "cn=example.com,ou=exampleou,dc=example,dc=com" - - name: Checkout lib Android SDL by pelya (hard coded version) - working-directory: /android-sdl - run: | - ls -l - pwd - git init && git remote add origin https://github.com/krosk/commandergenius.git && git fetch origin e84e645ca309e56db84a211b484be7df6f3b03ca && git reset --hard FETCH_HEAD - - - name: Setup licenses for Gradle + - name: Set up android project working-directory: /android-sdl run: | - ln -s $ANDROID_HOME/licenses project/licenses - - # pelya building script expects that 1/ simutrans is found inside /android-sdl/project/jni/application/simutrans/simutrans and 2/ that it is a svn repo, as revision.h is populated by svn command line - # the content of actions/checkout is a git repo so it is not compatible - # so we just checkout the meta informations - - name: Setup Android SDL working folder to host Simutrans (current branch) - working-directory: /android-sdl - run: | - CURRENT_BRANCH=$GITHUB_REF_NAME - echo $CURRENT_BRANCH - echo $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/$CURRENT_BRANCH - mv $GITHUB_WORKSPACE/gh-clone/simutrans project/jni/application/simutrans/ - chmod +755 project/jni/application/simutrans/simutrans/tools/get_revision.sh - echo $(ls -al project/jni/application/simutrans/simutrans/android) - cp -f project/jni/application/simutrans/simutrans/src/android/AndroidAppSettings.cfg project/jni/application/simutrans/ - cp -f project/jni/application/simutrans/simutrans/src/android/AndroidBuild.sh project/jni/application/simutrans/ - cp -f project/jni/application/simutrans/simutrans/src/android/AndroidPreBuild.sh project/jni/application/simutrans/ - cp -f project/jni/application/simutrans/simutrans/src/android/icon.png project/jni/application/simutrans/ - # End of environment setup (dependencies installed, source code at correct location) - - # some temporary changes to Android SDL are stored in /.github/android - - name: (Temporary) Patch Android SDL and replace version - working-directory: /android-sdl + git clone https://github.com/simutrans/simutrans-android-project + cd simutrans-android-project + git submodule init + git submodule update + cp -r $GITHUB_WORKSPACE/gh-clone/simutrans simutrans/jni/simutrans + cp -r simutrans/jni/SDL/android-project/app/src/main/java simutrans/src/main + cd simutrans/jni + ./simutrans/src/android/AndroidPreBuild.sh + cp -rf simutrans/simutrans/. ../src/main/assets + + + - name: Build libraries + working-directory: /android-sdl/simutrans-android-project/simutrans/jni run: | - if [ -f $GITHUB_WORKSPACE/.github/android/*.patch ]; then cp -r $GITHUB_WORKSPACE/.github/android/*.patch .; fi; - if [ -f *.patch ]; then git apply *.patch; fi; - sed -i "s/^AppVersionCode=[0-9]\+/AppVersionCode=$(cd project/jni/application/simutrans/simutrans; tools/get_revision.sh)/" ./project/jni/application/simutrans/AndroidAppSettings.cfg - sed -i "s/^AppVersionName=\"[0-9]\+.[0-9]\+\"/AppVersionName=\"r$(cd project/jni/application/simutrans/simutrans; tools/get_revision.sh)\"/" ./project/jni/application/simutrans/AndroidAppSettings.cfg + ./build_libraries.sh + # Fluidsynth is a PITA to build; using the prebuilt release instead + wget https://github.com/FluidSynth/fluidsynth/releases/download/v2.3.1/fluidsynth-2.3.1-android24.zip + unzip fluidsynth-*.zip -d fluidsynth - - name: Build Simutrans Bundle + - name: Build Simutrans env: STORE_ALIAS: ${{ secrets.ANDROID_UPLOAD_KEYSTORE_ALIAS }} STORE_PASS: ${{ secrets.ANDROID_UPLOAD_KEYSTORE_PASS }} + working-directory: /android-sdl/simutrans-android-project run: | - cd /android-sdl echo "action_state=yellow" >> $GITHUB_ENV - rm -f ./signBundle.sh - cp project/jni/application/simutrans/simutrans/src/android/signBundle.sh . - chmod 555 ./signBundle.sh - ./build.sh -b simutrans + #cp project/jni/simutrans/src/android/signBundle.sh . + #chmod 555 ./signBundle.sh + #./build.sh -b simutrans + ./gradlew assembleRelease + ./gradlew bundleRelease - name: Update binaries of Nightly Release aab - uses: svenstaro/upload-release-action@v1-release + uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: /android-sdl/project/app/build/outputs/bundle/release/simutrans-nightly.aab - asset_name: simutrans-nightly.aab + file: /android-sdl/simutrans-android-project/simutrans/build/outputs/bundle/release/simutrans-release.aab + asset_name: simuandroid-nightly.aab tag: Nightly overwrite: true - name: Update binaries of Nightly Release apk - uses: svenstaro/upload-release-action@v1-release + uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: /android-sdl/project/app/build/outputs/bundle/release/simuandroid-multi-nightly.apk - asset_name: simuandroid-multi-nightly.apk + file: /android-sdl/simutrans-android-project/simutrans/build/outputs/apk/release/simutrans-release-unsigned.apk + asset_name: simuandroid-nightly.apk tag: Nightly overwrite: true @@ -149,8 +127,8 @@ jobs: with: serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }} packageName: com.simutrans - releaseFiles: /android-sdl/project/app/build/outputs/bundle/release/simutrans-nightly-r*.aab + releaseFiles: /android-sdl/simutrans-android-project/simutrans/build/outputs/bundle/release/simutrans-release.aab track: beta status: completed - whatsNewDirectory: /android-sdl/project/app/build/outputs/bundle/release/whatsNewDirectory + whatsNewDirectory: /android-sdl/project/simutrans/build/outputs/bundle/release/whatsNewDirectory diff --git a/.github/workflows/nightly-macos.yml b/.github/workflows/nightly-macos.yml index 4954a196c62..5efa576422a 100644 --- a/.github/workflows/nightly-macos.yml +++ b/.github/workflows/nightly-macos.yml @@ -5,7 +5,7 @@ on: [push] jobs: build: - runs-on: macos-10.15 + runs-on: macos-latest steps: - uses: actions/checkout@v3 @@ -27,7 +27,7 @@ jobs: zip -r simumac-nightly.zip simutrans - name: Update binaries of Nightly Release - uses: svenstaro/upload-release-action@v1-release + uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: build/simumac-nightly.zip diff --git a/.github/workflows/nightly-ubuntu.yml b/.github/workflows/nightly-ubuntu.yml index 73f522c92d7..dabc36dff92 100644 --- a/.github/workflows/nightly-ubuntu.yml +++ b/.github/workflows/nightly-ubuntu.yml @@ -38,7 +38,7 @@ jobs: zip -r simulinux-x64-nightly.zip simutrans - name: Update binaries of Nightly Release - uses: svenstaro/upload-release-action@v1-release + uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: build/simulinux-x64-nightly.zip diff --git a/.github/workflows/nightly-windows.yml b/.github/workflows/nightly-windows.yml index 3803c16a137..54186640838 100644 --- a/.github/workflows/nightly-windows.yml +++ b/.github/workflows/nightly-windows.yml @@ -22,7 +22,7 @@ jobs: shell: powershell - name: Create nsis installer - uses: joncloud/makensis-action@v2.0 + uses: joncloud/makensis-action@v4 with: arguments: "/V3" additional-plugin-paths: NSIS_Plugins/Plugins @@ -33,7 +33,7 @@ jobs: shell: msys2 {0} - name: Update binaries of Nightly Release - uses: svenstaro/upload-release-action@v1-release + uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: ./simuwin-gdi32-nightly.zip diff --git a/.github/workflows/nightly-windows64-SDL2.yml b/.github/workflows/nightly-windows64-SDL2.yml index fdf3ff0e4c2..a41b6a4ae33 100644 --- a/.github/workflows/nightly-windows64-SDL2.yml +++ b/.github/workflows/nightly-windows64-SDL2.yml @@ -22,7 +22,7 @@ jobs: shell: powershell - name: Create nsis installer - uses: joncloud/makensis-action@v2.0 + uses: joncloud/makensis-action@v4 with: arguments: "/V3" additional-plugin-paths: NSIS_Plugins/Plugins @@ -33,7 +33,7 @@ jobs: shell: msys2 {0} - name: Update binaries of Nightly Release - uses: svenstaro/upload-release-action@v1-release + uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: ./simuwin64-SDL2-nightly.zip diff --git a/.gitignore b/.gitignore index 0ca480f2156..0d8a2da2073 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,5 @@ revision.h *.d *.res /autom4te.cache -*.exe \ No newline at end of file +*.exe +.ccls-cache \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 7f762e2ddd6..8f528d7ca02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ endif (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) set(CMAKE_WARN_DEPRECATED ON) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/") -include(SimutransVcpkgTriplet) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/SimutransVcpkgTriplet.cmake) project(simutrans LANGUAGES C CXX) @@ -42,32 +42,14 @@ endif () # # Dependencies # -find_package(CCache) -find_package(ZLIB REQUIRED) -find_package(BZip2 REQUIRED) -find_package(PNG REQUIRED) -find_package(MiniUPNP) -if (MSVC) - find_package(ZSTD) - find_package(SDL2) - find_package(Freetype) - find_package(FluidSynth) -else () - find_package(PkgConfig MODULE REQUIRED) - pkg_check_modules(ZSTD IMPORTED_TARGET libzstd) - pkg_check_modules(SDL2 IMPORTED_TARGET sdl2) - pkg_check_modules(Freetype IMPORTED_TARGET freetype2) - pkg_check_modules(FluidSynth IMPORTED_TARGET fluidsynth>=2.1.0) -endif () +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/SimutransFindDependencies.cmake) -set(CMAKE_THREAD_PREFER_PTHREAD ON) -find_package(Threads) # # Configuration options # -include(SimutransBackend) # Select backend (SDL2 / GDI) -include(SimutransCompileOptions) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/SimutransBackend.cmake) # Select backend (SDL2 / GDI) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/SimutransCompileOptions.cmake) # CMake does not fill in CMAKE_BUILD_TYPE automatically. @@ -82,12 +64,18 @@ endif (NOT MSVC) # # sources # -add_executable(simutrans MACOSX_BUNDLE) +if(ANDROID) + add_library(simutrans SHARED) + target_link_libraries(simutrans PRIVATE android log) + target_sources(simutrans PRIVATE src/android/android.cc) +else () + add_executable(simutrans MACOSX_BUNDLE) +endif () if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug") set_target_properties(simutrans PROPERTIES WIN32_EXECUTABLE 1) endif () -include(SimutransSourceList) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/SimutransSourceList.cmake) # @@ -101,19 +89,19 @@ set_target_properties( simutrans PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BIN # Generate revision on compile time (so only if needed) if no revision is given # if (${SIMUTRANS_USE_REVISION}) - file(WRITE ${CMAKE_SOURCE_DIR}/src/simutrans/revision.h "#define REVISION ${SIMUTRANS_USE_REVISION}\n") + file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}src/simutrans/revision.h "#define REVISION ${SIMUTRANS_USE_REVISION}\n") message(STATUS "Compiling Simutrans with manually specified revision ${SIMUTRANS_USE_REVISION}") else () string(FIND ${CMAKE_GENERATOR} "Visual Studio" VS ) if (${VS} EQUAL 0) # using a script for MSVC project files - file(WRITE ${CMAKE_SOURCE_DIR}/src/simutrans/revision.h "#define REVISION \n") - add_custom_command(TARGET simutrans PRE_BUILD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND cscript.exe /Nologo tools/revision.jse COMMENT "Find SVN revision") + file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/src/simutrans/revision.h "#define REVISION \n") + add_custom_command(TARGET simutrans PRE_BUILD WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND cscript.exe /Nologo tools/revision.jse COMMENT "Find SVN revision") else () # using custom target svnhear that is always built to update the revision.h file using cmake script add_custom_target(svnheader ALL DEPENDS svn_header) - add_custom_command(OUTPUT svn_header COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_SOURCE_DIR} -P ${CMAKE_MODULE_PATH}/SimutransRevision.cmake) - set_source_files_properties(${CMAKE_SOURCE_DIR}/src/simutrans/revision.h PROPERTIES GENERATED TRUE HEADER_FILE_ONLY TRUE) + add_custom_command(OUTPUT svn_header COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/SimutransRevision.cmake) + set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/src/simutrans/revision.h PROPERTIES GENERATED TRUE HEADER_FILE_ONLY TRUE) add_dependencies(simutrans svnheader) endif () endif () @@ -168,7 +156,9 @@ if (SIMUTRANS_BACKEND STREQUAL "sdl2") elseif (APPLE) target_link_libraries(simutrans PRIVATE ${SDL2_LIBRARIES}) elseif (MSVC) - target_link_libraries(simutrans PRIVATE SDL2::SDL2) + target_link_libraries(simutrans PRIVATE SDL2) + elseif (ANDROID) + target_link_libraries(simutrans PRIVATE SDL2 SDL2main) else () target_link_libraries(simutrans PRIVATE PkgConfig::SDL2) endif () @@ -201,7 +191,7 @@ if (SIMUTRANS_USE_FREETYPE) target_link_libraries(simutrans PRIVATE ${Freetype_STATIC_LIBRARIES}) elseif (APPLE) target_link_libraries(simutrans PRIVATE ${Freetype_LIBRARIES}) - elseif (MSVC) + elseif (MSVC OR ANDROID) target_link_libraries(simutrans PRIVATE Freetype::Freetype) else () target_link_libraries(simutrans PRIVATE PkgConfig::Freetype) @@ -223,6 +213,8 @@ if (SIMUTRANS_USE_ZSTD) elseif (MINGW) # only 64 bit cmake, 32 bit is broken target_link_libraries(simutrans PRIVATE -lzstd) + elseif (ANDROID) + target_link_libraries(simutrans PRIVATE ZSTD::ZSTD) else() target_link_libraries(simutrans PRIVATE PkgConfig::ZSTD) endif () @@ -238,6 +230,8 @@ if ((SIMUTRANS_BACKEND STREQUAL "sdl2") OR (SIMUTRANS_BACKEND STREQUAL "gdi")) target_link_libraries(simutrans PRIVATE ${FluidSynth_STATIC_LIBRARIES} -liconv -lgomp) elseif (MSVC) target_link_libraries(simutrans PRIVATE ${FluidSynth_LIBRARIES}) + elseif (ANDROID) + target_link_libraries(simutrans PRIVATE fluidsynth) else () target_link_libraries(simutrans PRIVATE PkgConfig::FluidSynth) endif (MINGW) @@ -297,6 +291,10 @@ if (SIMUTRANS_STEAM_BUILT) target_compile_definitions(simutrans PRIVATE STEAM_BUILT=1) endif () +if (SIMUTRANS_USE_OWN_PAKINSTALL) + target_compile_definitions(simutrans PRIVATE USE_OWN_PAKINSTAL=1) +endif () + if (APPLE) target_compile_definitions(simutrans PRIVATE ALT_SDL_DIR=1) endif (APPLE) @@ -327,12 +325,12 @@ add_custom_target(test # # Installation # -include(SimutransInstall) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/SimutransInstall.cmake) # # Nettool/Makeobj # -add_subdirectory(src/makeobj EXCLUDE_FROM_ALL) -add_subdirectory(src/nettool EXCLUDE_FROM_ALL) - - +if (NOT ANDROID) + add_subdirectory(src/makeobj EXCLUDE_FROM_ALL) + add_subdirectory(src/nettool EXCLUDE_FROM_ALL) +endif () diff --git a/cmake/SimutransCompileOptions.cmake b/cmake/SimutransCompileOptions.cmake index de5c8e6cd92..4f47327cb70 100644 --- a/cmake/SimutransCompileOptions.cmake +++ b/cmake/SimutransCompileOptions.cmake @@ -48,6 +48,7 @@ option(DEBUG_FLUSH_BUFFER "Highlite areas changes since last redraw" OFF) option(ENABLE_WATERWAY_SIGNS "Allow private signs on watersways" OFF) option(AUTOJOIN_PUBLIC "Join when making things public" OFF) option(SIMUTRANS_USE_REVISION "Use the given revision number" OFF) +option(SIMUTRANS_USE_OWN_PAKINSTALL "Use built-in pakset installer instead of scripted" OFF) if(NOT SIMUTRANS_DEBUG_LEVEL) set(SIMUTRANS_DEBUG_LEVEL $) diff --git a/cmake/SimutransFindDependencies.cmake b/cmake/SimutransFindDependencies.cmake new file mode 100644 index 00000000000..3ffffe46365 --- /dev/null +++ b/cmake/SimutransFindDependencies.cmake @@ -0,0 +1,151 @@ +if (NOT ANDROID) + find_package(CCache) + find_package(ZLIB REQUIRED) + find_package(BZip2 REQUIRED) + find_package(PNG REQUIRED) + find_package(MiniUPNP) + if (MSVC) + find_package(ZSTD) + find_package(SDL2) + find_package(Freetype) + find_package(FluidSynth) + else () + find_package(PkgConfig MODULE REQUIRED) + pkg_check_modules(ZSTD REQUIRED IMPORTED_TARGET libzstd) + pkg_check_modules(SDL2 IMPORTED_TARGET sdl2) + pkg_check_modules(Freetype IMPORTED_TARGET freetype2) + pkg_check_modules(FluidSynth IMPORTED_TARGET fluidsynth>=2.1.0) + endif () + + set(CMAKE_THREAD_PREFER_PTHREAD ON) + find_package(Threads) +else () + + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(PREBUILT_DIR "debug") + else () + set(PREBUILT_DIR "release") + endif () + + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../zlib/) + add_library(ZLIB::ZLIB SHARED IMPORTED) + set(SHARED_LIBRARY_SO ${CMAKE_CURRENT_SOURCE_DIR}/../zlib/prebuilt/${PREBUILT_DIR}/${CMAKE_ANDROID_ARCH_ABI}/libz.so) + set_target_properties(ZLIB::ZLIB PROPERTIES IMPORTED_LOCATION ${SHARED_LIBRARY_SO}) + + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../bzip2/) + add_library(BZip2::BZip2 SHARED IMPORTED) + set(SHARED_LIBRARY_SO ${CMAKE_CURRENT_SOURCE_DIR}/../bzip2/prebuilt/${PREBUILT_DIR}/${CMAKE_ANDROID_ARCH_ABI}/libbz2.so) + set_target_properties(BZip2::BZip2 PROPERTIES IMPORTED_LOCATION ${SHARED_LIBRARY_SO}) + + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../libpng/) + add_library(PNG::PNG SHARED IMPORTED) + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(SHARED_LIBRARY_SO ${CMAKE_CURRENT_SOURCE_DIR}/../libpng/prebuilt/${PREBUILT_DIR}/${CMAKE_ANDROID_ARCH_ABI}/libpng16d.so) + else () + set(SHARED_LIBRARY_SO ${CMAKE_CURRENT_SOURCE_DIR}/../libpng/prebuilt/release/${CMAKE_ANDROID_ARCH_ABI}/libpng16.so) + endif () + set_target_properties(PNG::PNG PROPERTIES IMPORTED_LOCATION ${SHARED_LIBRARY_SO}) + + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../zstd/lib/) + add_library(ZSTD::ZSTD SHARED IMPORTED) + set(SHARED_LIBRARY_SO ${CMAKE_CURRENT_SOURCE_DIR}/../zstd/prebuilt/${PREBUILT_DIR}/${CMAKE_ANDROID_ARCH_ABI}/libzstd.so) + set_target_properties(ZSTD::ZSTD PROPERTIES IMPORTED_LOCATION ${SHARED_LIBRARY_SO}) + + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../freetype/include/) + add_library(Freetype::Freetype SHARED IMPORTED) + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(SHARED_LIBRARY_SO ${CMAKE_CURRENT_SOURCE_DIR}/../freetype/prebuilt/${PREBUILT_DIR}/${CMAKE_ANDROID_ARCH_ABI}/libfreetyped.so) + else () + set(SHARED_LIBRARY_SO ${CMAKE_CURRENT_SOURCE_DIR}/../freetype/prebuilt/${PREBUILT_DIR}/${CMAKE_ANDROID_ARCH_ABI}/libfreetype.so) + endif () + set_target_properties(Freetype::Freetype PROPERTIES IMPORTED_LOCATION ${SHARED_LIBRARY_SO}) + + find_library(SDL2 SDL2) + + # Fluidsynth dependencies are a big family + # We may be able to reduce the family numbers by compiling Fluidsynth ourselves + # But such process is long and tedious (see: https://github.com/FluidSynth/fluidsynth/blob/master/.azure/azure-pipelines-android.yml ) + # For now we use the release libraries + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/include/) + + find_package(OpenMP REQUIRED) + + add_library(libfluidsynth SHARED IMPORTED) + set(SHARED_LIBRARY_SO ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libfluidsynth.so) + set_target_properties(libfluidsynth PROPERTIES IMPORTED_LOCATION ${SHARED_LIBRARY_SO}) + + add_library(libFLAC SHARED IMPORTED) + set_target_properties(libFLAC PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libFLAC.so) + + add_library(libfluidsynth-assetloader SHARED IMPORTED) + set_target_properties(libfluidsynth-assetloader PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libfluidsynth-assetloader.so) + + add_library(libgio-2.0 SHARED IMPORTED) + set_target_properties(libgio-2.0 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libgio-2.0.so) + + add_library(libglib-2.0 SHARED IMPORTED) + set_target_properties(libglib-2.0 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libglib-2.0.so) + + add_library(libgmodule-2.0 SHARED IMPORTED) + set_target_properties(libgmodule-2.0 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libgmodule-2.0.so) + + add_library(libgobject-2.0 SHARED IMPORTED) + set_target_properties(libgobject-2.0 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libgobject-2.0.so) + + add_library(libgthread-2.0 SHARED IMPORTED) + set_target_properties(libgthread-2.0 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libgthread-2.0.so) + + add_library(libinstpatch-1.0 SHARED IMPORTED) + set_target_properties(libinstpatch-1.0 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libinstpatch-1.0.so) + + add_library(liboboe SHARED IMPORTED) + set_target_properties(liboboe PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/liboboe.so) + + add_library(libogg SHARED IMPORTED) + set_target_properties(libogg PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libogg.so) + + add_library(libopus SHARED IMPORTED) + set_target_properties(libopus PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libopus.so) + + add_library(libpcre SHARED IMPORTED) + set_target_properties(libpcre PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libpcre.so) + + add_library(libpcreposix SHARED IMPORTED) + set_target_properties(libpcreposix PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libpcreposix.so) + + add_library(libsndfile SHARED IMPORTED) + set_target_properties(libsndfile PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libsndfile.so) + + add_library(libvorbis SHARED IMPORTED) + set_target_properties(libvorbis PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libvorbis.so) + + add_library(libvorbisenc SHARED IMPORTED) + set_target_properties(libvorbisenc PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libvorbisenc.so) + + add_library(libvorbisfile SHARED IMPORTED) + set_target_properties(libvorbisfile PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../fluidsynth/lib/${CMAKE_ANDROID_ARCH_ABI}/libvorbisfile.so) + + add_library(fluidsynth INTERFACE) + target_link_libraries(fluidsynth INTERFACE + libFLAC + libfluidsynth-assetloader + libgio-2.0 + libglib-2.0 + libgmodule-2.0 + libgobject-2.0 + libgthread-2.0 + libinstpatch-1.0 + liboboe + libogg + libopus + libpcre + libpcreposix + libsndfile + libvorbis + libvorbisenc + libvorbisfile + libfluidsynth + OpenMP::OpenMP_CXX + ) + +endif () diff --git a/src/android/AndroidAppSettings.cfg b/src/android/AndroidAppSettings.cfg index 6b20657d853..410b9503bd5 100644 --- a/src/android/AndroidAppSettings.cfg +++ b/src/android/AndroidAppSettings.cfg @@ -281,7 +281,7 @@ NDK_TOOLCHAIN_VERSION= # android-16 = Android 4.1, the earliest supported version in NDK r18. # android-18 = Android 4.3, the first version supporting GLES3. # android-21 = Android 5.1, the first version with SO_REUSEPORT defined. -APP_PLATFORM=31 +APP_PLATFORM= # Specify architectures to compile, 'all' or 'y' to compile for all architectures. # Available architectures: armeabi-v7a arm64-v8a x86 x86_64 diff --git a/src/android/AndroidPreBuild.sh b/src/android/AndroidPreBuild.sh index 7c434f875cc..b204d43437e 100755 --- a/src/android/AndroidPreBuild.sh +++ b/src/android/AndroidPreBuild.sh @@ -10,8 +10,8 @@ cd simutrans echo "Get pak64" ../tools/get_pak.sh pak64 || exit 1 -echo "Get pak64.german" -../tools/get_pak.sh pak.german || exit 1 +#echo "Get pak64.german" +#../tools/get_pak.sh pak.german || exit 1 echo "Get pak64.japan" ../tools/get_pak.sh pak64.japan || exit 1 @@ -41,7 +41,7 @@ echo "`pwd`" echo "`ls -l`" echo "`ls -l *`" -mkdir simutrans/music +mkdir -p simutrans/music [ -e simutrans/music/TimGM6mb.sf2 ] || (download_with_retry https://sourceforge.net/p/mscore/code/HEAD/tree/trunk/mscore/share/sound/TimGM6mb.sf2?format=raw TimGM6mb.sf2 && cp ./TimGM6mb.sf2 simutrans/music/TimGM6mb.sf2) || exit 1 #[ -e ../simutrans/font/RobotoCondensed-Regular.ttf ] || (download_with_retry https://fonts.google.com/download?family=Roboto%20Condensed Roboto_Condensed.zip && unzip -n Roboto_Condensed.zip -d ../simutrans/font) || exit 1 [ -e simutrans/font/Roboto-Regular.ttf ] || (download_with_retry https://fonts.google.com/download?family=Roboto Roboto.zip && unzip -n Roboto.zip Roboto-Regular.ttf -d simutrans/font) || exit 1 @@ -50,16 +50,4 @@ mkdir simutrans/music -echo 'Done adding assets' -cd .. - -mkdir -p AndroidData -echo Generating data.zip -cd simutrans/simutrans - -rm -f ../../AndroidData/data.zip -zip -r -0 ../../AndroidData/data.zip * >/dev/null -cd ../.. -echo Generating data.zip done - -[ -e AndroidData/TimGM6mb.sf2 ] || cp simutrans/TimGM6mb.sf2 AndroidData/ || exit 1 +echo 'Done adding assets' \ No newline at end of file diff --git a/src/android/android.cc b/src/android/android.cc new file mode 100644 index 00000000000..3b54d06d7a3 --- /dev/null +++ b/src/android/android.cc @@ -0,0 +1,9 @@ +#include "android.h" +#include "../simutrans/sys/simsys.h" + +extern "C" { +JNIEXPORT jstring JNICALL Java_com_simutrans_simutrans_Simutrans_getVersion(JNIEnv* env, jobject thisObject) { + return env->NewStringUTF(get_version()); +} + +} \ No newline at end of file diff --git a/src/android/android.h b/src/android/android.h new file mode 100644 index 00000000000..5064c796b28 --- /dev/null +++ b/src/android/android.h @@ -0,0 +1,6 @@ +#include + +extern "C" { +JNIEXPORT jstring JNICALL Java_com_simutrans_simutrans_Simutrans_getVersion(JNIEnv* env, jobject thisObject); + +} \ No newline at end of file diff --git a/src/simutrans/gui/banner.cc b/src/simutrans/gui/banner.cc index debdfab6277..2b72726aff7 100644 --- a/src/simutrans/gui/banner.cc +++ b/src/simutrans/gui/banner.cc @@ -29,14 +29,6 @@ #define L_BANNER_TEXT_INDENT ( 4 ) // Scroll text padding (left/right) #define L_BANNER_HEIGHT ( L_BANNER_ROWS * LINESPACE + 2 ) // Banner control height in pixels -#ifdef _OPTIMIZED - #define L_DEBUG_TEXT " (optimized)" -#elif defined DEBUG -# define L_DEBUG_TEXT " (debug)" -#else -# define L_DEBUG_TEXT -#endif - // colors #define COLOR_RAMP_SIZE ( 5 ) // Number or fade colors + normal color at index 0 @@ -65,15 +57,7 @@ banner_t::banner_t() : gui_frame_t("") new_component("This is Simutrans" SIM_VERSION_BUILD_STRING, SYSCOL_TEXT_TITLE, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true); -#ifdef REVISION - new_component("Version " VERSION_NUMBER " " VERSION_DATE " r" QUOTEME(REVISION) -#else - new_component("Version " VERSION_NUMBER " " VERSION_DATE -#endif -#ifdef GIT_HASH - " hash " QUOTEME(GIT_HASH) -#endif - L_DEBUG_TEXT, SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true); + new_component(get_version(), SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true); add_table(5,0); { diff --git a/src/simutrans/music/fluidsynth.cc b/src/simutrans/music/fluidsynth.cc index cfba665c773..2c0fd0996e7 100644 --- a/src/simutrans/music/fluidsynth.cc +++ b/src/simutrans/music/fluidsynth.cc @@ -9,7 +9,7 @@ #include "../dataobj/environment.h" #include "music.h" #ifndef _WIN32 -#ifndef __APPLE__ +#if !defined __APPLE__ && !defined __ANDROID__ #include #else #include diff --git a/src/simutrans/simmain.cc b/src/simutrans/simmain.cc index 2407bed8598..dedbf407466 100644 --- a/src/simutrans/simmain.cc +++ b/src/simutrans/simmain.cc @@ -621,7 +621,7 @@ int simu_main(int argc, char** argv) } } dr_chdir( env_t::base_dir ); - + // parsing config/simuconf.tab to find out single user install bool found_settings = false; bool found_simuconf = false; diff --git a/src/simutrans/sound/sdl2_sound.cc b/src/simutrans/sound/sdl2_sound.cc index 4c366efbc5e..e812db5a935 100644 --- a/src/simutrans/sound/sdl2_sound.cc +++ b/src/simutrans/sound/sdl2_sound.cc @@ -5,7 +5,7 @@ /// sdl-sound without SDL_mixer.dll -#ifndef __APPLE__ +#if !defined __APPLE__ && !defined __ANDROID__ #include #else #include diff --git a/src/simutrans/sys/clipboard_s2.cc b/src/simutrans/sys/clipboard_s2.cc index 9e12e9f924a..36b9b38daab 100644 --- a/src/simutrans/sys/clipboard_s2.cc +++ b/src/simutrans/sys/clipboard_s2.cc @@ -10,7 +10,7 @@ #include "../simdebug.h" #include "../dataobj/translator.h" -#ifndef __APPLE__ +#if !defined __APPLE__ && !defined __ANDROID__ #include #else #include diff --git a/src/simutrans/sys/simsys.cc b/src/simutrans/sys/simsys.cc index bf3f8bdf1b2..b966c6457d0 100644 --- a/src/simutrans/sys/simsys.cc +++ b/src/simutrans/sys/simsys.cc @@ -28,6 +28,7 @@ #include "../utils/simstring.h" #include "../simdebug.h" #include "../simevent.h" +#include "../simversion.h" #ifdef _WIN32 # include @@ -48,7 +49,7 @@ # include # endif # ifdef __ANDROID__ -# include +# include # endif #endif @@ -56,6 +57,14 @@ #include #endif +#ifdef _OPTIMIZED + #define L_DEBUG_TEXT " (optimized)" +#elif defined DEBUG +# define L_DEBUG_TEXT " (debug)" +#else +# define L_DEBUG_TEXT +#endif + sys_event_t sys_event; @@ -420,8 +429,6 @@ char const *dr_query_homedir() strcat(buffer, PATH_SEPARATOR); return buffer; } - - char const *dr_query_installdir() { static char buffer[PATH_MAX + 24]; @@ -452,7 +459,7 @@ char const *dr_query_installdir() find_directory(B_USER_DIRECTORY, &userDir); sprintf(buffer, "%s/simutrans/paksets", userDir.Path()); #elif defined __ANDROID__ - tstrncpy(buffer,SDL_GetPrefPath("Simutrans Team","simutrans"),lengthof(buffer)); + tstrncpy(buffer,SDL_AndroidGetInternalStoragePath(),lengthof(buffer)); #else if( getenv("XDG_DATA_HOME") == NULL ) { sprintf(buffer, "%s/simutrans/paksets", getenv("HOME")); @@ -464,9 +471,7 @@ char const *dr_query_installdir() // create directory and subdirectories dr_mkdir(buffer); -#ifndef __ANDROID__ strcat(buffer, PATH_SEPARATOR); -#endif return buffer; } @@ -1081,9 +1086,35 @@ bool dr_download_pakset( const char *data_dir, bool portable ) #endif } +const char* get_version() +{ + return "Version " VERSION_NUMBER " " VERSION_DATE +#ifdef REVISION + " r" QUOTEME(REVISION) +#endif +#ifdef GIT_HASH + " hash " QUOTEME(GIT_HASH) +#endif + L_DEBUG_TEXT; +} + +/** + * Copy argv because some systems (e.g. Android) do not allow to write them +*/ +char **copy_argv(int argc, char *argv[]) { + char** new_argv = new char*[argc+1]; + for(int i=0; i < argc; i++) { + int len = strlen(argv[i]) + 1; + new_argv[i] = new char[len]; + strcpy(new_argv[i], argv[i]); + } + new_argv[argc] = NULL; + return new_argv; +} int sysmain(int const argc, char** const argv) { + char ** argv_copy = copy_argv(argc,argv); sys_event.type = SIM_NOEVENT; sys_event.code = 0; @@ -1108,7 +1139,7 @@ int sysmain(int const argc, char** const argv) WideCharToMultiByte(CP_UTF8, 0, wpathname, -1, pathname, pathnamesize, NULL, NULL); delete[] wpathname; - argv[0] = pathname; + argv_copy[0] = pathname; #elif !defined __BEOS__ # if defined __GLIBC__ && !defined __AMIGA__ /* glibc has a non-standard extension */ @@ -1121,21 +1152,21 @@ int sysmain(int const argc, char** const argv) ssize_t const length = readlink("/proc/self/exe", buffer, lengthof(buffer) - 1); if (length != -1) { buffer[length] = '\0'; /* readlink() does not NUL-terminate */ - argv[0] = buffer; - } else if (strchr(argv[0], '/') == NULL) { + argv_copy[0] = buffer; + } else if (strchr(argv_copy[0], '/') == NULL) { // no /proc, no '/' in argv[0] => search PATH const char* path = getenv("PATH"); if (path != NULL) { - size_t flen = strlen(argv[0]); + size_t flen = strlen(argv_copy[0]); for (;;) { /* for each directory in PATH */ size_t dlen = strcspn(path, ":"); if (dlen > 0 && dlen + flen + 2 < lengthof(buffer)) { // buffer = dir '/' argv[0] '\0' memcpy(buffer, path, dlen); buffer[dlen] = '/'; - memcpy(buffer + dlen + 1, argv[0], flen + 1); + memcpy(buffer + dlen + 1, argv_copy[0], flen + 1); if (access(buffer, X_OK) == 0) { - argv[0] = buffer; + argv_copy[0] = buffer; break; /* found it! */ } } @@ -1148,12 +1179,12 @@ int sysmain(int const argc, char** const argv) # endif // no process file system => need to parse argv[0] /* should work on most unix or gnu systems */ - argv[0] = realpath(argv[0], buffer2); + argv_copy[0] = realpath(argv_copy[0], buffer2); #endif setlocale( LC_CTYPE, "" ); setlocale( LC_NUMERIC, "en_US.UTF-8" ); - return simu_main(argc, argv); + return simu_main(argc, argv_copy); #ifdef _WIN32 // Cleanup for dynamic allocation, probably unnescescary. diff --git a/src/simutrans/sys/simsys.h b/src/simutrans/sys/simsys.h index ae46d45f768..4d34b1651ad 100644 --- a/src/simutrans/sys/simsys.h +++ b/src/simutrans/sys/simsys.h @@ -252,6 +252,8 @@ sint16 dr_toggle_borderless(); sint16 dr_suspend_fullscreen(); void dr_restore_fullscreen(sint16 old_fullscreen); +const char* get_version(); + int sysmain(int argc, char** argv); #endif diff --git a/src/simutrans/sys/simsys_s2.cc b/src/simutrans/sys/simsys_s2.cc index 147fb951cbc..92e1859b922 100644 --- a/src/simutrans/sys/simsys_s2.cc +++ b/src/simutrans/sys/simsys_s2.cc @@ -3,7 +3,7 @@ * (see LICENSE.txt) */ -#ifndef __APPLE__ +#if !defined __APPLE__ && !defined __ANDROID__ #include #else #include