From 2c45593015df849130e9005adb1fbcfdd5f28783 Mon Sep 17 00:00:00 2001 From: MoNTE48 Date: Thu, 11 Jul 2019 01:04:18 +0200 Subject: [PATCH] Android: add ARM64 and clang support --- .gitignore | 1 + build/android/Makefile | 1007 +++++++++-------- build/android/build.gradle | 31 +- build/android/gradle.properties | 2 + build/android/jni/Android.mk | 33 +- build/android/jni/Application.mk | 39 +- build/android/jni/Deps.mk | 9 +- build/android/jni/Irrlicht.mk | 15 +- .../patches/irrlicht-optimization.patch | 19 - .../patches/irrlicht-texturehack.patch | 240 ---- .../com/multicraft/game/GameActivity.java | 13 +- .../com/multicraft/game/MainActivity.java | 2 +- .../main/res/xml/network_security_config.xml | 1 + src/config.h | 26 +- src/defaultsettings.cpp | 11 +- src/guiFormSpecMenu.cpp | 15 +- src/main.cpp | 4 - src/porting_ios.cpp | 4 +- src/version.cpp | 6 +- 19 files changed, 635 insertions(+), 843 deletions(-) create mode 100644 build/android/gradle.properties delete mode 100644 build/android/patches/irrlicht-optimization.patch delete mode 100644 build/android/patches/irrlicht-texturehack.patch diff --git a/.gitignore b/.gitignore index 48f49ee03..2aced7851 100644 --- a/.gitignore +++ b/.gitignore @@ -102,6 +102,7 @@ build/android/obj build/android/local.properties build/android/.gradle timestamp +.idea ## iOS build files build/iOS/MultiCraft/MultiCraft.xcodeproj/xcuserdata diff --git a/build/android/Makefile b/build/android/Makefile index 34b323f39..c53ba4985 100644 --- a/build/android/Makefile +++ b/build/android/Makefile @@ -1,54 +1,126 @@ -################################################################################ - -OS := $(shell uname) -SHELL := /bin/bash +###################################################################################### # compile with GPROF # GPROF = 1 -# build for build platform +###################################################################################### +# toolchain config for ARMv7 (gcc, NDK r17c) +###################################################################################### + +#API = 16 +#TARGET_HOST = arm-linux +#TARGET_ABI = armeabi-v7a +#TARGET_ARCH = arm +#TARGET_TOOLCHAIN = arm-linux-androideabi +#TARGET_CFLAGS_ADDON = -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Ofast -fdata-sections -ffunction-sections -fvisibility=hidden -fexceptions -D__ANDROID_API__=$(API) +#TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON) -frtti +#CROSS_PREFIX = arm-linux-androideabi +#CROSS_CC = ${CROSS_PREFIX}-gcc +#CROSS_CXX = ${CROSS_PREFIX}-g++ +#HOST_CC = "gcc -m32" # required for LuaJIT +#COMPILER_VERSION = 4.9 +#APP_STL = gnustl_static +#APP_STL_LIB = gnustl + +###################################################################################### +# toolchain config for ARMv7 (Clang) +###################################################################################### + API = 16 -APP_PLATFORM = android-$(API) -COMPILER_VERSION = 4.9 - -ANDR_ROOT = $(shell pwd) -PROJ_ROOT = $(shell realpath $(ANDR_ROOT)/../..) -APP_ROOT = $(ANDR_ROOT)/src/main - -VERSION_MAJOR := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \ - grep ^set\(VERSION_MAJOR\ | sed 's/)/ /' | cut -f2 -d' ') -VERSION_MINOR := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \ - grep ^set\(VERSION_MINOR\ | sed 's/)/ /' | cut -f2 -d' ') -VERSION_PATCH := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \ - grep ^set\(VERSION_PATCH\ | sed 's/)/ /' | cut -f2 -d' ') - -################################################################################ -# toolchain config for ARMv7 -################################################################################ - TARGET_HOST = arm-linux TARGET_ABI = armeabi-v7a +TARGET_ARCH = arm TARGET_TOOLCHAIN = arm-linux-androideabi -TARGET_CFLAGS_ADDON = -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Ofast -fdata-sections -ffunction-sections -fvisibility=hidden -flto -D__ANDROID_API__=$(API) -TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON) -TARGET_LDFLAGS_ADDON = -Wl,--no-warn-mismatch,--gc-sections,--icf=safe +TARGET_CFLAGS_ADDON = -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Ofast -fdata-sections -ffunction-sections -fvisibility=hidden -fexceptions -D__ANDROID_API__=$(API) -fpic +TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON) -frtti CROSS_PREFIX = arm-linux-androideabi +CROSS_CC = clang +CROSS_CXX = clang++ +HOST_CC = "gcc -m32" # required for LuaJIT +COMPILER_VERSION = clang +APP_STL = c++_shared +APP_STL_LIB = libc++ -################################################################################ -# toolchain config for x86 -################################################################################ +###################################################################################### +# toolchain config for ARM64 (gcc, NDK r17c) +###################################################################################### +#API = 21 +#TARGET_HOST = arm-linux +#TARGET_ABI = arm64-v8a +#TARGET_ARCH = arm64 +#TARGET_TOOLCHAIN = aarch64-linux-android +#TARGET_CFLAGS_ADDON = -Ofast -fvisibility=hidden -fexceptions -D__ANDROID_API__=$(API) +#TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON) -frtti +#CROSS_PREFIX = aarch64-linux-android +#CROSS_CC = ${CROSS_PREFIX}-gcc +#CROSS_CXX = ${CROSS_PREFIX}-g++ +#HOST_CC = "gcc -m64" # required for LuaJIT +#COMPILER_VERSION = 4.9 +#APP_STL = gnustl_static +#APP_STL_LIB = gnustl + +###################################################################################### +# toolchain config for ARM64 (Clang) +###################################################################################### + +#API = 21 +#TARGET_HOST = arm-linux +#TARGET_ABI = arm64-v8a +#TARGET_ARCH = arm64 +#TARGET_TOOLCHAIN = aarch64-linux-android +#TARGET_CFLAGS_ADDON = -Ofast -fvisibility=hidden -fexceptions -D__ANDROID_API__=$(API) +#TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON) -frtti +#CROSS_PREFIX = aarch64-linux-android +#CROSS_CC = clang +#CROSS_CXX = clang++ +#HOST_CC = "gcc -m64" # required for LuaJIT +#COMPILER_VERSION = clang +#APP_STL = c++_shared +#APP_STL_LIB = libc++ + +###################################################################################### +# toolchain config for x86 (gcc, NDK r17c) +###################################################################################### + +#API = 16 #TARGET_HOST = x86-linux #TARGET_ABI = x86 +#TARGET_ARCH = x86 #TARGET_TOOLCHAIN = x86 -#TARGET_CFLAGS_ADDON = -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -Ofast -funroll-loops -fdata-sections -ffunction-sections -fvisibility=hidden -flto -D__ANDROID_API__=$(API) -#TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON) -#TARGET_LDFLAGS_ADDON = -Wl,--no-warn-mismatch,--gc-sections,--icf=safe +#TARGET_CFLAGS_ADDON = -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -Ofast -funroll-loops -fdata-sections -ffunction-sections -fvisibility=hidden -fexceptions -D__ANDROID_API__=$(API) +#TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON) -frtti #CROSS_PREFIX = i686-linux-android +#CROSS_CC = ${CROSS_PREFIX}-gcc +#CROSS_CXX = ${CROSS_PREFIX}-g++ +#HOST_CC = "gcc -m32" # required for LuaJIT +#COMPILER_VERSION = 4.9 +#APP_STL = gnustl_static +#APP_STL_LIB = gnustl -################################################################################ +###################################################################################### +# toolchain config for x86 (clang) +###################################################################################### -ASSETS_TIMESTAMP = $(ANDR_ROOT)/deps/assets_timestamp +#API = 16 +#TARGET_HOST = x86-linux +#TARGET_ABI = x86 +#TARGET_ARCH = x86 +#TARGET_TOOLCHAIN = x86 +#TARGET_CFLAGS_ADDON = -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -Ofast -funroll-loops -fdata-sections -ffunction-sections -fvisibility=hidden -fexceptions -D__ANDROID_API__=$(API) +#TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON) -frtti +#CROSS_PREFIX = i686-linux-android +#CROSS_CC = clang +#CROSS_CXX = clang++ +#HOST_CC = "gcc -m32" # required for LuaJIT +#COMPILER_VERSION = clang +#APP_STL = c++_shared +#APP_STL_LIB = libc++ + +###################################################################################### + +SHELL := /bin/bash +ANDR_ROOT = $(shell pwd) LEVELDB_VERSION = 1.20 LEVELDB_DIR = $(ANDR_ROOT)/deps/leveldb @@ -77,19 +149,19 @@ IRRLICHT_TIMESTAMP = $(IRRLICHT_DIR)/timestamp IRRLICHT_TIMESTAMP_INT = $(ANDR_ROOT)/deps/irrlicht_timestamp IRRLICHT_URL_HTTP = https://github.com/zaki/irrlicht/archive/$(IRRLICHT_COMMIT).zip -CURL_VERSION = 7.64.1 +CURL_VERSION = 7.65.1 CURL_DIR = $(ANDR_ROOT)/deps/curl CURL_LIB = $(CURL_DIR)/lib/.libs/libcurl.a CURL_TIMESTAMP = $(CURL_DIR)/timestamp CURL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/curl_timestamp CURL_URL_HTTP = http://dl.uxnr.de/mirror/curl/curl-${CURL_VERSION}.tar.bz2 -FREETYPE_VERSION = 2.10.0 +FREETYPE_VERSION = 2.10.1 FREETYPE_DIR = $(ANDR_ROOT)/deps/freetype FREETYPE_LIB = $(FREETYPE_DIR)/objs/.libs/libfreetype.a FREETYPE_TIMESTAMP = $(FREETYPE_DIR)/timestamp FREETYPE_TIMESTAMP_INT = $(ANDR_ROOT)/deps/freetype_timestamp -FREETYPE_URL_HTTP = https://sourceforge.net/projects/freetype/files/freetype2/$(FREETYPE_VERSION)/freetype-$(FREETYPE_VERSION).tar.bz2 +FREETYPE_URL_HTTP = https://sourceforge.net/projects/freetype/files/freetype2/$(FREETYPE_VERSION)/freetype-$(FREETYPE_VERSION).tar.xz ICONV_VERSION = 1.16 ICONV_DIR = $(ANDR_ROOT)/deps/libiconv @@ -102,21 +174,28 @@ LUAJIT_TIMESTAMP = $(LUAJIT_DIR)/timestamp LUAJIT_TIMESTAMP_INT = $(ANDR_ROOT)/deps/luajit_timestamp LUAJIT_URL_GIT = https://github.com/LuaJIT/LuaJIT.git -################################################################################ +ASSETS_TIMESTAMP = $(ANDR_ROOT)/deps/assets_timestamp + +###################################################################################### + +PROJ_ROOT = $(shell realpath $(ANDR_ROOT)/../..) +APP_ROOT = $(ANDR_ROOT)/src/main + +APP_PLATFORM = android-$(API) ANDROID_SDK = $(shell grep '^sdk\.dir' local.properties | sed 's/^.*=[[:space:]]*//') ANDROID_NDK = $(shell grep '^ndk\.dir' local.properties | sed 's/^.*=[[:space:]]*//') debug : local.properties - export NDEBUG=; \ - export BUILD_TYPE=debug; \ + export NDEBUG=; \ + export BUILD_TYPE=debug; \ $(MAKE) apk all : debug release release : local.properties - @export NDEBUG=1; \ - export BUILD_TYPE=release; \ + @export NDEBUG=1; \ + export BUILD_TYPE=release; \ $(MAKE) apk reconfig: delconfig @@ -126,74 +205,81 @@ delconfig: $(RM) local.properties local.properties: - @echo "Please specify path of ANDROID NDK"; \ - echo "e.g. $$HOME/Android/ndk-r17b/"; \ - read ANDROID_NDK ; \ - if [ ! -d $$ANDROID_NDK ] ; then \ - echo "$$ANDROID_NDK is not a valid folder"; \ - exit 1; \ - fi; \ - echo "ndk.dir = $$ANDROID_NDK" > local.properties; \ - echo "Please specify path of ANDROID SDK"; \ - echo "e.g. $$HOME/Android/sdk/"; \ - read SDKFLDR ; \ - if [ ! -d $$SDKFLDR ] ; then \ - echo "$$SDKFLDR is not a valid folder"; \ - exit 1; \ - fi; \ + @echo "Please specify path of ANDROID NDK"; \ + echo "e.g. $$HOME/Android/ndk-r17b/"; \ + read ANDROID_NDK ; \ + if [ ! -d $$ANDROID_NDK ] ; then \ + echo "$$ANDROID_NDK is not a valid folder"; \ + exit 1; \ + fi; \ + echo "ndk.dir = $$ANDROID_NDK" > local.properties; \ + echo "Please specify path of ANDROID SDK"; \ + echo "e.g. $$HOME/Android/sdk/"; \ + read SDKFLDR ; \ + if [ ! -d $$SDKFLDR ] ; then \ + echo "$$SDKFLDR is not a valid folder"; \ + exit 1; \ + fi; \ echo "sdk.dir = $$SDKFLDR" >> local.properties; $(OPENAL_TIMESTAMP) : openal_download @LAST_MODIF=$$(find ${OPENAL_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ - if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ - touch ${OPENAL_TIMESTAMP}; \ + if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ + touch ${OPENAL_TIMESTAMP}; \ fi openal_download : - @if [ ! -d ${OPENAL_DIR} ] ; then \ - echo "openal sources missing, downloading..."; \ - mkdir -p ${ANDR_ROOT}/deps; \ - cd ${ANDR_ROOT}/deps ; \ - wget ${OPENAL_URL} || exit 1; \ - unzip openal-soft-${OPENAL_VERSION}.zip || exit 1; \ - rm openal-soft-${OPENAL_VERSION}.zip || exit 1; \ - mv openal-soft-openal-soft-${OPENAL_VERSION} openal-soft || exit 1; \ - cd ${OPENAL_DIR}; \ - sed '/CMAKE_FIND_ROOT_PATH / s/^/#/' -i XCompile-Android.txt; \ - sed '/CMAKE_C_COMPILER/ s/-gcc"/-clang"/' -i XCompile-Android.txt; \ + @if [ ! -d ${OPENAL_DIR} ] ; then \ + echo "openal sources missing, downloading..."; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd ${ANDR_ROOT}/deps ; \ + wget ${OPENAL_URL} || exit 1; \ + unzip openal-soft-${OPENAL_VERSION}.zip || exit 1; \ + rm openal-soft-${OPENAL_VERSION}.zip || exit 1; \ + mv openal-soft-openal-soft-${OPENAL_VERSION} openal-soft || exit 1; \ + cd ${OPENAL_DIR}; \ + sed '/CMAKE_FIND_ROOT_PATH / s/^/#/' -i XCompile-Android.txt; \ + sed '/CMAKE_C_COMPILER/ s/-gcc"/-clang"/' -i XCompile-Android.txt; \ + sed '/CMAKE_CXX_COMPILER/ s/-g++"/-clang++"/' -i XCompile-Android.txt; \ fi openal : $(OPENAL_LIB) $(OPENAL_LIB): $(OPENAL_TIMESTAMP) - +@REFRESH=0; \ - if [ ! -e ${OPENAL_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ ${OPENAL_TIMESTAMP} -nt ${OPENAL_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ $$REFRESH -ne 0 ] ; then \ - echo "changed timestamp for openal detected building..."; \ - cd ${OPENAL_DIR}; \ - export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-openal; \ - ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ - --toolchain=${TARGET_TOOLCHAIN}-${COMPILER_VERSION} \ - --platform=${APP_PLATFORM} \ - --install-dir=$${TOOLCHAIN}; \ - export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ - cmake . \ - -DCMAKE_TOOLCHAIN_FILE=XCompile-Android.txt -DLIBTYPE=STATIC \ - -DCMAKE_C_FLAGS="${TARGET_CFLAGS_ADDON} -fno-lto" \ - -DHOST=${CROSS_PREFIX} -DCMAKE_FIND_ROOT_PATH=$${TOOLCHAIN} \ - -DALSOFT_NO_CONFIG_UTIL=TRUE || exit 1; \ - $(MAKE) || exit 1; \ - touch ${OPENAL_TIMESTAMP}; \ - touch ${OPENAL_TIMESTAMP_INT}; \ - $(RM) -rf $${TOOLCHAIN}; \ - else \ - echo "nothing to be done for openal"; \ + +@REFRESH=0; \ + if [ ! -e ${OPENAL_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ ${OPENAL_TIMESTAMP} -nt ${OPENAL_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ $$REFRESH -ne 0 ] ; then \ + echo "changed timestamp for openal detected building..."; \ + cd ${OPENAL_DIR}; \ + export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-openal; \ + ${ANDROID_NDK}/build/tools/make_standalone_toolchain.py \ + --arch ${TARGET_ARCH} \ + --api ${API} \ + --stl=${APP_STL_LIB} \ + --install-dir=$${TOOLCHAIN}; \ + if [[ ${COMPILER_VERSION} == "clang" && ${API} -lt 18 ]] ; then \ + cd "$${TOOLCHAIN}/sysroot/usr/local/include"; \ + sed '/log2f/ s/^/\/\//' -i math.h; \ + cd ${OPENAL_DIR}; \ + fi; \ + export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ + cmake . \ + -DCMAKE_TOOLCHAIN_FILE=XCompile-Android.txt -DLIBTYPE=STATIC \ + -DCMAKE_C_FLAGS="${TARGET_CFLAGS_ADDON}" \ + -DHOST=${CROSS_PREFIX} -DCMAKE_FIND_ROOT_PATH=$${TOOLCHAIN} \ + -DALSOFT_NO_CONFIG_UTIL=TRUE || exit 1; \ + $(MAKE) || exit 1; \ + touch ${OPENAL_TIMESTAMP}; \ + touch ${OPENAL_TIMESTAMP_INT}; \ + $(RM) -rf $${TOOLCHAIN}; \ + else \ + echo "nothing to be done for openal"; \ fi clean_openal : @@ -201,38 +287,43 @@ clean_openal : $(VORBIS_TIMESTAMP) : vorbis_download @LAST_MODIF=$$(find ${VORBIS_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ - if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ - touch ${VORBIS_TIMESTAMP}; \ + if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ + touch ${VORBIS_TIMESTAMP}; \ fi vorbis_download : - @if [ ! -d ${VORBIS_DIR} ] ; then \ - echo "vorbis sources missing, downloading..."; \ - mkdir -p ${ANDR_ROOT}/deps; \ - cd ${ANDR_ROOT}/deps ; \ - git clone ${VORBIS_URL_GIT} || exit 1; \ + @if [ ! -d ${VORBIS_DIR} ] ; then \ + echo "vorbis sources missing, downloading..."; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd ${ANDR_ROOT}/deps ; \ + git clone ${VORBIS_URL_GIT} || exit 1; \ fi vorbis : $(VORBIS_LIB) $(VORBIS_LIB): $(VORBIS_TIMESTAMP) - +@REFRESH=0; \ - if [ ! -e ${VORBIS_TIMESTAMP_INT} ] ; then \ - echo "${VORBIS_TIMESTAMP_INT} doesn't exist"; \ - REFRESH=1; \ - fi; \ - if [ ${VORBIS_TIMESTAMP} -nt ${VORBIS_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ $$REFRESH -ne 0 ] ; then \ - echo "changed timestamp for vorbis detected building..."; \ - cd ${VORBIS_DIR}; \ - ${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG} TARGET_ABI=${TARGET_ABI} \ - NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Deps.mk || exit 1; \ - touch ${VORBIS_TIMESTAMP}; \ - touch ${VORBIS_TIMESTAMP_INT}; \ - else \ - echo "nothing to be done for libvorbis"; \ + +@REFRESH=0; \ + if [ ! -e ${VORBIS_TIMESTAMP_INT} ] ; then \ + echo "${VORBIS_TIMESTAMP_INT} doesn't exist"; \ + REFRESH=1; \ + fi; \ + if [ ${VORBIS_TIMESTAMP} -nt ${VORBIS_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ $$REFRESH -ne 0 ] ; then \ + echo "changed timestamp for vorbis detected building..."; \ + cd ${VORBIS_DIR}; \ + ${ANDROID_NDK}/ndk-build \ + NDEBUG=${NDEBUG} \ + APP_PLATFORM=${APP_PLATFORM} \ + TARGET_ABI=${TARGET_ABI} \ + APP_STL=${APP_STL} \ + COMPILER_VERSION=${COMPILER_VERSION} \ + NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Deps.mk || exit 1; \ + touch ${VORBIS_TIMESTAMP}; \ + touch ${VORBIS_TIMESTAMP_INT}; \ + else \ + echo "nothing to be done for libvorbis"; \ fi clean_vorbis : @@ -240,51 +331,51 @@ clean_vorbis : $(LEVELDB_TIMESTAMP) : leveldb_download @LAST_MODIF=$$(find ${LEVELDB_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ - if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ - touch ${LEVELDB_TIMESTAMP}; \ + if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ + touch ${LEVELDB_TIMESTAMP}; \ fi leveldb_download : - @if [ ! -d ${LEVELDB_DIR} ] ; then \ - echo "leveldb sources missing, downloading..."; \ - mkdir -p ${ANDR_ROOT}/deps; \ - cd ${ANDR_ROOT}/deps ; \ - wget ${LEVELDB_URL} || exit 1; \ - unzip v${LEVELDB_VERSION}.zip || exit 1; \ - rm v${LEVELDB_VERSION}.zip || exit 1; \ - mv leveldb-${LEVELDB_VERSION} leveldb || exit 1; \ + @if [ ! -d ${LEVELDB_DIR} ] ; then \ + echo "leveldb sources missing, downloading..."; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd ${ANDR_ROOT}/deps ; \ + wget ${LEVELDB_URL} || exit 1; \ + unzip v${LEVELDB_VERSION}.zip || exit 1; \ + rm v${LEVELDB_VERSION}.zip || exit 1; \ + mv leveldb-${LEVELDB_VERSION} leveldb || exit 1; \ fi leveldb : $(LEVELDB_LIB) $(LEVELDB_LIB): $(LEVELDB_TIMESTAMP) - @REFRESH=0; \ - if [ ! -e ${LEVELDB_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ ${LEVELDB_TIMESTAMP} -nt ${LEVELDB_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ $$REFRESH -ne 0 ] ; then \ - echo "changed timestamp for leveldb detected building..."; \ - cd deps/leveldb; \ - export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-leveldb; \ - ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ - --toolchain=${TARGET_TOOLCHAIN}-${COMPILER_VERSION} \ - --platform=${APP_PLATFORM} \ - --install-dir=$${TOOLCHAIN}; \ - export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ - export CC=${CROSS_PREFIX}-gcc; \ - export CXX=${CROSS_PREFIX}-g++; \ - export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \ - export CXXFLAGS="$${CPPFLAGS} ${TARGET_CXXFLAGS_ADDON} -fno-lto"; \ - export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \ - export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON} -fno-lto"; \ - $(MAKE) out-static/libleveldb.a || exit 1; \ - touch ${LEVELDB_TIMESTAMP}; \ - touch ${LEVELDB_TIMESTAMP_INT}; \ - $(RM) -rf $${TOOLCHAIN}; \ - else \ - echo "nothing to be done for leveldb"; \ + @REFRESH=0; \ + if [ ! -e ${LEVELDB_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ ${LEVELDB_TIMESTAMP} -nt ${LEVELDB_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ $$REFRESH -ne 0 ] ; then \ + echo "changed timestamp for leveldb detected building..."; \ + cd deps/leveldb; \ + export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-leveldb; \ + ${ANDROID_NDK}/build/tools/make_standalone_toolchain.py \ + --arch ${TARGET_ARCH} \ + --api ${API} \ + --stl=${APP_STL_LIB} \ + --install-dir=$${TOOLCHAIN}; \ + export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ + export CC=${CROSS_CC}; \ + export CXX=${CROSS_CXX}; \ + export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \ + export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \ + export CXXFLAGS="$${CPPFLAGS} ${TARGET_CXXFLAGS_ADDON}"; \ + $(MAKE) out-static/libleveldb.a || exit 1; \ + touch ${LEVELDB_TIMESTAMP}; \ + touch ${LEVELDB_TIMESTAMP_INT}; \ + $(RM) -rf $${TOOLCHAIN}; \ + else \ + echo "nothing to be done for leveldb"; \ fi clean_leveldb : @@ -292,140 +383,140 @@ clean_leveldb : $(FREETYPE_TIMESTAMP) : freetype_download @LAST_MODIF=$$(find ${FREETYPE_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ - if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ - touch ${FREETYPE_TIMESTAMP}; \ + if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ + touch ${FREETYPE_TIMESTAMP}; \ fi freetype_download : - @if [ ! -d ${FREETYPE_DIR} ] ; then \ - echo "freetype sources missing, downloading..."; \ - mkdir -p ${ANDR_ROOT}/deps; \ - cd deps; \ - wget ${FREETYPE_URL_HTTP} || exit 1; \ - tar -xjf freetype-${FREETYPE_VERSION}.tar.bz2 || exit 1; \ - rm freetype-${FREETYPE_VERSION}.tar.bz2; \ - mv freetype-${FREETYPE_VERSION} freetype; \ + @if [ ! -d ${FREETYPE_DIR} ] ; then \ + echo "freetype sources missing, downloading..."; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd deps; \ + mkdir freetype; \ + wget ${FREETYPE_URL_HTTP} || exit 1; \ + tar -xJf freetype-${FREETYPE_VERSION}.tar.xz -C freetype --strip-components=1 || exit 1; \ + rm freetype-${FREETYPE_VERSION}.tar.xz; \ fi freetype : $(FREETYPE_LIB) $(FREETYPE_LIB) : $(FREETYPE_TIMESTAMP) - +@REFRESH=0; \ - if [ ! -e ${FREETYPE_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ ! -e ${FREETYPE_LIB} ] ; then \ - REFRESH=1; \ - fi; \ - if [ ${FREETYPE_TIMESTAMP} -nt ${FREETYPE_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ $$REFRESH -ne 0 ] ; then \ - mkdir -p ${FREETYPE_DIR}; \ - export PATH=$$PATH:${ANDROID_NDK}; \ - echo "changed timestamp for freetype detected building..."; \ - cd deps/freetype; \ - export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-freetype; \ - ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ - --toolchain=${TARGET_TOOLCHAIN}-${COMPILER_VERSION} \ - --platform=${APP_PLATFORM} \ - --install-dir=$${TOOLCHAIN}; \ - export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ - export CXX=${CROSS_PREFIX}-g++; \ - export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \ - export CPPFLAGS="$${CPPFLAGS} ${TARGET_CXXFLAGS_ADDON} -fno-lto"; \ - export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON} -fno-lto"; \ - export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON}"; \ - CC=${CROSS_PREFIX}-gcc ./configure --enable-static --disable-shared --host=${TARGET_HOST} \ - --prefix=${TOOLCHAIN} --with-png=no --with-harfbuzz=no || exit 1; \ - CC=${CROSS_PREFIX}-gcc ANDROID_DEV=/tmp/ndk-${TARGET_HOST}-freetype $(MAKE) || exit 1; \ - touch ${FREETYPE_TIMESTAMP}; \ - touch ${FREETYPE_TIMESTAMP_INT}; \ - $(RM) -rf $${TOOLCHAIN}; \ - else \ - echo "nothing to be done for freetype"; \ + +@REFRESH=0; \ + if [ ! -e ${FREETYPE_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ ! -e ${FREETYPE_LIB} ] ; then \ + REFRESH=1; \ + fi; \ + if [ ${FREETYPE_TIMESTAMP} -nt ${FREETYPE_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ $$REFRESH -ne 0 ] ; then \ + mkdir -p ${FREETYPE_DIR}; \ + export PATH=$$PATH:${ANDROID_NDK}; \ + echo "changed timestamp for freetype detected building..."; \ + cd deps/freetype; \ + export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-freetype; \ + ${ANDROID_NDK}/build/tools/make_standalone_toolchain.py \ + --arch ${TARGET_ARCH} \ + --api ${API} \ + --stl=${APP_STL_LIB} \ + --install-dir=$${TOOLCHAIN}; \ + export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ + export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \ + export CPPFLAGS="$${CPPFLAGS} ${TARGET_CXXFLAGS_ADDON}"; \ + export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \ + CC=${CROSS_CC} ./configure --enable-static --disable-shared --host=${TARGET_HOST} \ + --prefix=${TOOLCHAIN} --with-png=no --with-harfbuzz=no || exit 1; \ + CC=${CROSS_CC} ANDROID_DEV=/tmp/ndk-${TARGET_HOST}-freetype $(MAKE) || exit 1; \ + touch ${FREETYPE_TIMESTAMP}; \ + touch ${FREETYPE_TIMESTAMP_INT}; \ + $(RM) -rf $${TOOLCHAIN}; \ + else \ + echo "nothing to be done for freetype"; \ fi clean_freetype : $(RM) -rf ${FREETYPE_DIR} iconv_download : - @if [ ! -d ${ICONV_DIR} ] ; then \ - echo "iconv sources missing, downloading..."; \ - mkdir -p ${ANDR_ROOT}/deps; \ - cd ${ANDR_ROOT}/deps; \ - wget ${ICONV_URL_HTTP} || exit 1; \ - tar -xzf libiconv-${ICONV_VERSION}.tar.gz || exit 1; \ - rm libiconv-${ICONV_VERSION}.tar.gz; \ - mv libiconv-${ICONV_VERSION} libiconv; \ - cd libiconv; \ - patch -p1 < ${ANDR_ROOT}/patches/libiconv_android.patch; \ - export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-iconv; \ - ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ - --toolchain=${TARGET_TOOLCHAIN}-${COMPILER_VERSION} \ - --platform=${APP_PLATFORM} \ - --install-dir=$${TOOLCHAIN}; \ - ./configure || exit 1; \ + @if [ ! -d ${ICONV_DIR} ] ; then \ + echo "iconv sources missing, downloading..."; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd ${ANDR_ROOT}/deps; \ + wget ${ICONV_URL_HTTP} || exit 1; \ + tar -xzf libiconv-${ICONV_VERSION}.tar.gz || exit 1; \ + rm libiconv-${ICONV_VERSION}.tar.gz; \ + mv libiconv-${ICONV_VERSION} libiconv; \ + cd libiconv; \ + patch -p1 < ${ANDR_ROOT}/patches/libiconv_android.patch; \ + export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-iconv; \ + ${ANDROID_NDK}/build/tools/make_standalone_toolchain.py \ + --arch ${TARGET_ARCH} \ + --api ${API} \ + --stl=${APP_STL_LIB} \ + --install-dir=$${TOOLCHAIN}; \ + ./configure || exit 1; \ fi clean_iconv : $(RM) -rf ${ICONV_DIR} -#Note: Texturehack patch is required for gpu's not supporting color format -# correctly. Known bad GPU: -# -geforce on emulator -# -Vivante Corporation GC1000 core (e.g. Galaxy Tab 3) - irrlicht_download : - @if [ ! -d "deps/irrlicht" ] ; then \ - echo "irrlicht sources missing, downloading..."; \ - mkdir -p ${ANDR_ROOT}/deps; \ - cd deps; \ - wget ${IRRLICHT_URL_HTTP} || exit 1; \ - unzip ${IRRLICHT_COMMIT}.zip || exit 1; \ - rm ${IRRLICHT_COMMIT}.zip; \ - mv irrlicht-${IRRLICHT_COMMIT} irrlicht; \ - cd irrlicht; \ - mkdir -p lib/Android; \ - patch -p1 < ${ANDR_ROOT}/patches/irrlicht-touchcount.patch || exit 1; \ - patch -p1 < ${ANDR_ROOT}/patches/irrlicht-back_button.patch || exit 1; \ -# patch -p1 < ${ANDR_ROOT}/patches/irrlicht-texturehack.patch || exit 1; \ - patch -p1 < ${ANDR_ROOT}/patches/irrlicht-optimization.patch || exit 1; \ - patch -p1 < ${ANDR_ROOT}/patches/irrlicht-native_activity.patch || exit 1; \ - patch -p1 < ${ANDR_ROOT}/patches/irrlicht-roundingerror.patch || exit 1; \ + @if [ ! -d "deps/irrlicht" ] ; then \ + echo "irrlicht sources missing, downloading..."; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd deps; \ + wget ${IRRLICHT_URL_HTTP} || exit 1; \ + unzip ${IRRLICHT_COMMIT}.zip || exit 1; \ + rm ${IRRLICHT_COMMIT}.zip; \ + mv irrlicht-${IRRLICHT_COMMIT} irrlicht; \ + cd irrlicht; \ + mkdir -p lib/Android; \ + patch -p1 < ${ANDR_ROOT}/patches/irrlicht-touchcount.patch || exit 1; \ + patch -p1 < ${ANDR_ROOT}/patches/irrlicht-back_button.patch || exit 1; \ + patch -p1 < ${ANDR_ROOT}/patches/irrlicht-native_activity.patch || exit 1; \ + patch -p1 < ${ANDR_ROOT}/patches/irrlicht-roundingerror.patch || exit 1; \ fi $(IRRLICHT_TIMESTAMP) : irrlicht_download @LAST_MODIF=$$(find ${IRRLICHT_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ - if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ - touch ${IRRLICHT_TIMESTAMP}; \ + if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ + touch ${IRRLICHT_TIMESTAMP}; \ fi irrlicht : $(IRRLICHT_LIB) $(IRRLICHT_LIB): $(IRRLICHT_TIMESTAMP) $(FREETYPE_LIB) - +@REFRESH=0; \ - if [ ! -e ${IRRLICHT_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ ! -e ${IRRLICHT_LIB} ] ; then \ - REFRESH=1; \ - fi; \ - if [ ${IRRLICHT_TIMESTAMP} -nt ${IRRLICHT_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ $$REFRESH -ne 0 ] ; then \ - mkdir -p ${IRRLICHT_DIR}; \ - echo "changed timestamp for irrlicht detected building..."; \ - cd deps/irrlicht/source/Irrlicht/Android; \ - export APP_PLATFORM=${APP_PLATFORM}; \ - export TARGET_ABI=${TARGET_ABI}; \ - ${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG} \ - NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Irrlicht.mk || exit 1; \ - touch ${IRRLICHT_TIMESTAMP}; \ - touch ${IRRLICHT_TIMESTAMP_INT}; \ - else \ - echo "nothing to be done for irrlicht"; \ + +@REFRESH=0; \ + if [ ! -e ${IRRLICHT_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ ! -e ${IRRLICHT_LIB} ] ; then \ + REFRESH=1; \ + fi; \ + if [ ${IRRLICHT_TIMESTAMP} -nt ${IRRLICHT_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ $$REFRESH -ne 0 ] ; then \ + mkdir -p ${IRRLICHT_DIR}; \ + echo "changed timestamp for irrlicht detected building..."; \ + cd deps/irrlicht/source/Irrlicht/Android; \ + export APP_PLATFORM=${APP_PLATFORM}; \ + export TARGET_ABI=${TARGET_ABI}; \ + ${ANDROID_NDK}/ndk-build \ + NDEBUG=${NDEBUG} \ + APP_PLATFORM=${APP_PLATFORM} \ + TARGET_ABI=${TARGET_ABI} \ + APP_STL=${APP_STL} \ + COMPILER_VERSION=${COMPILER_VERSION} \ + TARGET_CPPFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}" \ + TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}" \ + NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Irrlicht.mk || exit 1; \ + touch ${IRRLICHT_TIMESTAMP}; \ + touch ${IRRLICHT_TIMESTAMP_INT}; \ + else \ + echo "nothing to be done for irrlicht"; \ fi clean_irrlicht : @@ -433,215 +524,212 @@ clean_irrlicht : $(CURL_TIMESTAMP) : curl_download @LAST_MODIF=$$(find ${CURL_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ - if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ - touch ${CURL_TIMESTAMP}; \ + if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ + touch ${CURL_TIMESTAMP}; \ fi curl_download : - @if [ ! -d "deps/curl" ] ; then \ - echo "curl sources missing, downloading..."; \ - mkdir -p ${ANDR_ROOT}/deps; \ - cd deps; \ - wget ${CURL_URL_HTTP} || exit 1; \ - tar -xjf curl-${CURL_VERSION}.tar.bz2 || exit 1; \ - rm curl-${CURL_VERSION}.tar.bz2; \ - mv curl-${CURL_VERSION} curl; \ + @if [ ! -d "deps/curl" ] ; then \ + echo "curl sources missing, downloading..."; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd deps; \ + wget ${CURL_URL_HTTP} || exit 1; \ + tar -xjf curl-${CURL_VERSION}.tar.bz2 || exit 1; \ + rm curl-${CURL_VERSION}.tar.bz2; \ + mv curl-${CURL_VERSION} curl; \ fi curl : $(CURL_LIB) $(CURL_LIB): $(CURL_TIMESTAMP) - @REFRESH=0; \ - if [ ! -e ${CURL_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ ! -e ${CURL_LIB} ] ; then \ - REFRESH=1; \ - fi; \ - if [ ${CURL_TIMESTAMP} -nt ${CURL_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ $$REFRESH -ne 0 ] ; then \ - mkdir -p ${CURL_DIR}; \ - echo "changed timestamp for curl detected building..."; \ - cd deps/curl; \ - export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-curl; \ - ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ - --toolchain=${TARGET_TOOLCHAIN}-${COMPILER_VERSION} \ - --platform=${APP_PLATFORM} \ - --install-dir=$${TOOLCHAIN}; \ - export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ - export CC=${CROSS_PREFIX}-gcc; \ - export CXX=${CROSS_PREFIX}-g++; \ - export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \ - export CPPFLAGS="$${CPPFLAGS} ${TARGET_CXXFLAGS_ADDON} -fno-lto"; \ - export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON} -fno-lto"; \ - export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON}"; \ - ./configure --host=${TARGET_HOST} --enable-static --disable-shared \ - --disable-debug --disable-verbose --disable-dependency-tracking --disable-ftp \ - --disable-ldap --disable-ldaps --disable-rtsp --disable-proxy --disable-dict \ - --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smtp \ - --disable-gopher --disable-sspi --disable-manual; \ - $(MAKE) -s || exit 1; \ - touch ${CURL_TIMESTAMP}; \ - touch ${CURL_TIMESTAMP_INT}; \ - $(RM) -rf $${TOOLCHAIN}; \ - else \ - echo "nothing to be done for curl"; \ + @REFRESH=0; \ + if [ ! -e ${CURL_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ ! -e ${CURL_LIB} ] ; then \ + REFRESH=1; \ + fi; \ + if [ ${CURL_TIMESTAMP} -nt ${CURL_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ $$REFRESH -ne 0 ] ; then \ + mkdir -p ${CURL_DIR}; \ + echo "changed timestamp for curl detected building..."; \ + cd deps/curl; \ + export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-curl; \ + ${ANDROID_NDK}/build/tools/make_standalone_toolchain.py \ + --arch ${TARGET_ARCH} \ + --api ${API} \ + --stl=${APP_STL_LIB} \ + --install-dir=$${TOOLCHAIN}; \ + export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ + export CC=${CROSS_CC}; \ + export CXX=${CROSS_CXX}; \ + export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \ + export CPPFLAGS="$${CPPFLAGS} ${TARGET_CXXFLAGS_ADDON}"; \ + ./configure --host=${TARGET_HOST} --enable-static --disable-shared \ + --disable-debug --disable-verbose --disable-dependency-tracking --disable-ftp \ + --disable-ldap --disable-ldaps --disable-rtsp --disable-proxy --disable-dict \ + --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smtp \ + --disable-gopher --disable-sspi --disable-manual; \ + $(MAKE) -s || exit 1; \ + touch ${CURL_TIMESTAMP}; \ + touch ${CURL_TIMESTAMP_INT}; \ + $(RM) -rf $${TOOLCHAIN}; \ + else \ + echo "nothing to be done for curl"; \ fi clean_curl : $(RM) -R ${CURL_DIR} $(ASSETS_TIMESTAMP) : $(IRRLICHT_LIB) - @mkdir -p ${ANDR_ROOT}/deps; \ - for DIRNAME in {builtin,client,doc,fonts,games,po,textures}; do \ + @mkdir -p ${ANDR_ROOT}/deps; \ + for DIRNAME in {builtin,client,doc,fonts,games,po,textures}; do \ LAST_MODIF=$$(find ${PROJ_ROOT}/$$DIRNAME -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ - if [ $$(basename $$LAST_MODIF) != "timestamp" ]; then \ - touch ${PROJ_ROOT}/$$DIRNAME/timestamp; \ - touch ${ASSETS_TIMESTAMP}; \ - echo $$DIRNAME changed $$LAST_MODIF; \ - fi; \ - done; \ + if [ $$(basename $$LAST_MODIF) != "timestamp" ]; then \ + touch ${PROJ_ROOT}/$$DIRNAME/timestamp; \ + touch ${ASSETS_TIMESTAMP}; \ + echo $$DIRNAME changed $$LAST_MODIF; \ + fi; \ + done; \ LAST_MODIF=$$(find ${IRRLICHT_DIR}/media -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ - if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ - touch ${IRRLICHT_DIR}/media/timestamp; \ - touch ${ASSETS_TIMESTAMP}; \ - fi; \ - if [ ${PROJ_ROOT}/multicraft.conf.example -nt ${ASSETS_TIMESTAMP} ] ; then \ - echo "conf changed"; \ - touch ${ASSETS_TIMESTAMP}; \ - fi; \ - if [ ${PROJ_ROOT}/README.txt -nt ${ASSETS_TIMESTAMP} ] ; then \ - touch ${ASSETS_TIMESTAMP}; \ - fi; \ - if [ ! -e $(ASSETS_TIMESTAMP) ] ; then \ - touch $(ASSETS_TIMESTAMP); \ + if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ + touch ${IRRLICHT_DIR}/media/timestamp; \ + touch ${ASSETS_TIMESTAMP}; \ + fi; \ + if [ ${PROJ_ROOT}/multicraft.conf.example -nt ${ASSETS_TIMESTAMP} ] ; then \ + echo "conf changed"; \ + touch ${ASSETS_TIMESTAMP}; \ + fi; \ + if [ ${PROJ_ROOT}/README.txt -nt ${ASSETS_TIMESTAMP} ] ; then \ + touch ${ASSETS_TIMESTAMP}; \ + fi; \ + if [ ! -e $(ASSETS_TIMESTAMP) ] ; then \ + touch $(ASSETS_TIMESTAMP); \ fi $(LUAJIT_TIMESTAMP) : luajit_download @LAST_MODIF=$$(find ${LUAJIT_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \ - if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ - touch ${LUAJIT_TIMESTAMP}; \ + if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \ + touch ${LUAJIT_TIMESTAMP}; \ fi luajit_download : - @if [ ! -d ${LUAJIT_DIR} ] ; then \ - echo "luajit sources missing, downloading..."; \ - mkdir -p ${ANDR_ROOT}/deps; \ - cd ${ANDR_ROOT}/deps; \ - git clone --branch ${LUAJIT_GIT_BRANCH} ${LUAJIT_URL_GIT} luajit || exit 1; \ + @if [ ! -d ${LUAJIT_DIR} ] ; then \ + echo "luajit sources missing, downloading..."; \ + mkdir -p ${ANDR_ROOT}/deps; \ + cd ${ANDR_ROOT}/deps; \ + git clone --branch ${LUAJIT_GIT_BRANCH} ${LUAJIT_URL_GIT} luajit || exit 1;\ fi luajit : $(LUAJIT_LIB) $(LUAJIT_LIB): $(LUAJIT_TIMESTAMP) - @REFRESH=0; \ - if [ ! -e ${LUAJIT_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ ${LUAJIT_TIMESTAMP} -nt ${LUAJIT_TIMESTAMP_INT} ] ; then \ - REFRESH=1; \ - fi; \ - if [ $$REFRESH -ne 0 ] ; then \ - mkdir -p ${LUAJIT_DIR}; \ - export PATH=$$PATH:${ANDROID_NDK}; \ - echo "changed timestamp for luajit detected building..."; \ - cd ${LUAJIT_DIR}; \ - export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-luajit; \ - ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \ - --toolchain=${TARGET_TOOLCHAIN}-${COMPILER_VERSION} \ - --platform=${APP_PLATFORM} \ - --install-dir=$${TOOLCHAIN}; \ - export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ - export TARGET_FLAGS="${TARGET_CFLAGS_ADDON} -fno-lto"; \ - export TARGET_LDFLAGS="${TARGET_LDFLAGS_ADDON}"; \ - $(MAKE) CROSS=${CROSS_PREFIX}- TARGET_CC=${CROSS_PREFIX}-clang \ - XCFLAGS="-DLUAJIT_DISABLE_FFI" HOST_CC="gcc -m32" BUILDMODE=static; \ - touch ${LUAJIT_TIMESTAMP}; \ - touch ${LUAJIT_TIMESTAMP_INT}; \ - $(RM) -rf $${TOOLCHAIN}; \ - else \ - echo "nothing to be done for luajit"; \ + @REFRESH=0; \ + if [ ! -e ${LUAJIT_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ ${LUAJIT_TIMESTAMP} -nt ${LUAJIT_TIMESTAMP_INT} ] ; then \ + REFRESH=1; \ + fi; \ + if [ $$REFRESH -ne 0 ] ; then \ + mkdir -p ${LUAJIT_DIR}; \ + export PATH=$$PATH:${ANDROID_NDK}; \ + echo "changed timestamp for luajit detected building..."; \ + cd ${LUAJIT_DIR}; \ + export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-luajit; \ + ${ANDROID_NDK}/build/tools/make_standalone_toolchain.py \ + --arch ${TARGET_ARCH} \ + --api ${API} \ + --stl=${APP_STL_LIB} \ + --install-dir=$${TOOLCHAIN}; \ + export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \ + export TARGET_FLAGS="${TARGET_CFLAGS_ADDON} -fno-fast-math"; \ + $(MAKE) CROSS=${CROSS_PREFIX}- TARGET_CC=${CROSS_PREFIX}-clang \ + XCFLAGS="-DLUAJIT_DISABLE_FFI" HOST_CC=${HOST_CC} BUILDMODE=static; \ + touch ${LUAJIT_TIMESTAMP}; \ + touch ${LUAJIT_TIMESTAMP_INT}; \ + $(RM) -rf $${TOOLCHAIN}; \ + else \ + echo "nothing to be done for luajit"; \ fi clean_luajit: $(RM) -R deps/luajit assets : $(ASSETS_TIMESTAMP) - @REFRESH=0; \ - if [ ! -e ${ASSETS_TIMESTAMP}.old ] ; then \ - REFRESH=1; \ - fi; \ - if [ ${ASSETS_TIMESTAMP} -nt ${ASSETS_TIMESTAMP}.old ] ; then \ - REFRESH=1; \ - fi; \ - if [ ! -e ${APP_ROOT}/assets ] ; then \ - REFRESH=1; \ - fi; \ - if [ $$REFRESH -ne 0 ] ; then \ - echo "assets changed, refreshing..."; \ - $(MAKE) clean_assets; \ - mkdir -p ${APP_ROOT}/assets/MultiCraft; \ - cp -r ${PROJ_ROOT}/builtin ${APP_ROOT}/assets/MultiCraft; \ - mkdir ${APP_ROOT}/assets/MultiCraft/fonts; \ + @REFRESH=0; \ + if [ ! -e ${ASSETS_TIMESTAMP}.old ] ; then \ + REFRESH=1; \ + fi; \ + if [ ${ASSETS_TIMESTAMP} -nt ${ASSETS_TIMESTAMP}.old ] ; then \ + REFRESH=1; \ + fi; \ + if [ ! -e ${APP_ROOT}/assets ] ; then \ + REFRESH=1; \ + fi; \ + if [ $$REFRESH -ne 0 ] ; then \ + echo "assets changed, refreshing..."; \ + $(MAKE) clean_assets; \ + mkdir -p ${APP_ROOT}/assets/MultiCraft; \ + cp -r ${PROJ_ROOT}/builtin ${APP_ROOT}/assets/MultiCraft; \ + mkdir ${APP_ROOT}/assets/MultiCraft/fonts; \ cp -r ${PROJ_ROOT}/fonts/retrovillenc.ttf ${APP_ROOT}/assets/MultiCraft/fonts/; \ - cp -r ${PROJ_ROOT}/games ${APP_ROOT}/assets/MultiCraft; \ - mkdir -p ${APP_ROOT}/assets/MultiCraft/locale; \ - pushd ${PROJ_ROOT}/po; \ - for lang in *; do \ - [ $${#lang} -ne 2 ] && continue; \ - MOPATH=${APP_ROOT}/assets/MultiCraft/locale/$$lang/LC_MESSAGES; \ - mkdir -p $$MOPATH; \ - pushd $$lang; \ - for fn in *.po; do \ - newfn=$${fn/.po/.mo}; \ - msgfmt -o $$MOPATH/$$newfn $$fn; \ - done; \ - popd; \ - done; \ - popd; \ - cp -r ${PROJ_ROOT}/textures ${APP_ROOT}/assets/MultiCraft; \ - cp -r ${PROJ_ROOT}/worlds ${APP_ROOT}/assets/MultiCraft; \ - cd ${APP_ROOT}/assets || exit 1; \ - find . -name "timestamp" -exec rm {} \; ; \ - find . -name "*.blend" -exec rm {} \; ; \ - find . -name "*~" -exec rm {} \; ; \ - find . -type d -path "*.git" -exec rm -rf {} \; ; \ - find . -type d -path "*.svn" -exec rm -rf {} \; ; \ - find . -type f -path "*.gitignore" -exec rm -rf {} \; ; \ - cd MultiCraft; \ + cp -r ${PROJ_ROOT}/games ${APP_ROOT}/assets/MultiCraft; \ + mkdir -p ${APP_ROOT}/assets/MultiCraft/locale; \ + pushd ${PROJ_ROOT}/po; \ + for lang in *; do \ + [ $${#lang} -ne 2 ] && continue; \ + MOPATH=${APP_ROOT}/assets/MultiCraft/locale/$$lang/LC_MESSAGES; \ + mkdir -p $$MOPATH; \ + pushd $$lang; \ + for fn in *.po; do \ + newfn=$${fn/.po/.mo}; \ + msgfmt -o $$MOPATH/$$newfn $$fn; \ + done; \ + popd; \ + done; \ + popd; \ + cp -r ${PROJ_ROOT}/textures ${APP_ROOT}/assets/MultiCraft; \ + cp -r ${PROJ_ROOT}/worlds ${APP_ROOT}/assets/MultiCraft; \ + cd ${APP_ROOT}/assets || exit 1; \ + find . -name "timestamp" -exec rm {} \; ; \ + find . -name "*.blend" -exec rm {} \; ; \ + find . -name "*~" -exec rm {} \; ; \ + find . -type d -path "*.git" -exec rm -rf {} \; ; \ + find . -type d -path "*.svn" -exec rm -rf {} \; ; \ + find . -type f -path "*.gitignore" -exec rm -rf {} \; ; \ + cd MultiCraft; \ ls -R | grep ":$$" | sed -e 's/:$$//' -e 's/\.//' -e 's/^\///' > ../index.txt; \ - find -L . | cut -c 3- > ../filelist.txt; \ - echo "Creating worlds.zip"; \ - zip -r ../worlds.zip worlds; \ - echo "Creating games.zip"; \ - zip -r ../games.zip games; \ - rm -r worlds games; \ - echo "Creating Files.zip"; \ - zip -r ../Files.zip *; \ - cp ${ASSETS_TIMESTAMP} ${ASSETS_TIMESTAMP}.old; \ - else \ - echo "nothing to be done for assets"; \ + find -L . | cut -c 3- > ../filelist.txt; \ + echo "Creating worlds.zip"; \ + zip -r ../worlds.zip worlds; \ + echo "Creating games.zip"; \ + zip -r ../games.zip games; \ + rm -r worlds games; \ + echo "Creating Files.zip"; \ + zip -r ../Files.zip *; \ + cp ${ASSETS_TIMESTAMP} ${ASSETS_TIMESTAMP}.old; \ + else \ + echo "nothing to be done for assets"; \ fi clean_assets : @$(RM) -r ${APP_ROOT}/assets -apk: local.properties $(IRRLICHT_LIB) $(CURL_LIB) $(LEVELDB_LIB) $(LUAJIT_LIB) \ - $(OPENAL_LIB) $(VORBIS_LIB) prep_srcdir $(ANDR_ROOT)/jni/src/android_version.h \ - $(ANDR_ROOT)/jni/src/android_version_githash.h iconv_download assets - +@${ANDROID_NDK}/ndk-build \ - TARGET_LIBDIR=${TARGET_LIBDIR} \ - APP_PLATFORM=${APP_PLATFORM} TARGET_ABI=${TARGET_ABI} || exit 1; \ - if [ ! -e ${APP_ROOT}/jniLibs ]; then \ - ln -s ${ANDR_ROOT}/libs ${APP_ROOT}/jniLibs || exit 1; \ - fi; \ - export VERSION_STR="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" && \ - export BUILD_TYPE_C=$$(echo "$${BUILD_TYPE}" | sed 's/./\U&/') && \ - ./gradlew assemble$$BUILD_TYPE_C && \ - echo "APK stored at: build/outputs/apk/MultiCraft-$$BUILD_TYPE.apk" && \ - echo "You can install it with \`make install_$$BUILD_TYPE\`" +apk: local.properties $(IRRLICHT_LIB) $(CURL_LIB) $(LEVELDB_LIB) $(LUAJIT_LIB) \ + $(OPENAL_LIB) $(VORBIS_LIB) prep_srcdir iconv_download assets + +@${ANDROID_NDK}/ndk-build \ + APP_STL=${APP_STL} COMPILER_VERSION=${COMPILER_VERSION} \ + APP_PLATFORM=${APP_PLATFORM} TARGET_ABI=${TARGET_ABI} || exit 1; \ + if [ ! -e ${APP_ROOT}/jniLibs ]; then \ + ln -s ${ANDR_ROOT}/libs ${APP_ROOT}/jniLibs || exit 1; \ + fi; \ + export BUILD_TYPE_C=$$(echo "$${BUILD_TYPE}" | sed 's/./\U&/') && \ + ./gradlew assemble$$BUILD_TYPE_C && \ + echo "APK stored at: build/outputs/apk/MultiCraft-$$BUILD_TYPE.apk" && \ + echo "You can install it with \'make install_$$BUILD_TYPE\'" install_debug: ${ANDROID_SDK}/platform-tools/adb install -r build/outputs/apk/MultiCraft-debug.apk @@ -650,62 +738,23 @@ install_release: ${ANDROID_SDK}/platform-tools/adb install -r build/outputs/apk/MultiCraft-release.apk prep_srcdir : - @if [ ! -e ${ANDR_ROOT}/jni/src ]; then \ - ln -s ${PROJ_ROOT}/src ${ANDR_ROOT}/jni/src; \ - fi; \ - if [ ! -e ${ANDR_ROOT}/jni/lib ]; then \ - ln -s ${PROJ_ROOT}/lib ${ANDR_ROOT}/jni/lib; \ + @if [ ! -e ${ANDR_ROOT}/jni/src ]; then \ + ln -s ${PROJ_ROOT}/src ${ANDR_ROOT}/jni/src; \ + fi; \ + if [ ! -e ${ANDR_ROOT}/jni/lib ]; then \ + ln -s ${PROJ_ROOT}/lib ${ANDR_ROOT}/jni/lib; \ fi clean_apk : ./gradlew clean clean_all : - @$(MAKE) clean_apk; \ - $(MAKE) clean_assets; \ - sleep 1; \ + @$(MAKE) clean_apk; \ + $(MAKE) clean_assets; \ + sleep 1; \ $(RM) -r gen libs obj deps bin Debug and_env jni/src clean_src : $(RM) -r gen libs obj bin Debug and_env jni/src -$(ANDR_ROOT)/jni/src/android_version_githash.h : prep_srcdir - @export VERSION_FILE=${ANDR_ROOT}/jni/src/android_version_githash.h; \ - export VERSION_FILE_NEW=$${VERSION_FILE}.new; \ - { \ - echo "#ifndef ANDROID_MT_VERSION_GITHASH_H"; \ - echo "#define ANDROID_MT_VERSION_GITHASH_H"; \ - export GITHASH=$$(git rev-parse --short=8 HEAD); \ - export VERSION_STR="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"; \ - echo "#define VERSION_GITHASH \"$$VERSION_STR-$$GITHASH-Android\""; \ - echo "#endif"; \ - } > "$${VERSION_FILE_NEW}"; \ - if ! cmp -s $${VERSION_FILE} $${VERSION_FILE_NEW}; then \ - echo "android_version_githash.h changed, updating..."; \ - mv "$${VERSION_FILE_NEW}" "$${VERSION_FILE}"; \ - else \ - rm "$${VERSION_FILE_NEW}"; \ - fi - - -$(ANDR_ROOT)/jni/src/android_version.h : prep_srcdir - @export VERSION_FILE=${ANDR_ROOT}/jni/src/android_version.h; \ - export VERSION_FILE_NEW=$${VERSION_FILE}.new; \ - { \ - echo "#ifndef ANDROID_MT_VERSION_H"; \ - echo "#define ANDROID_MT_VERSION_H"; \ - echo "#define VERSION_MAJOR ${VERSION_MAJOR}"; \ - echo "#define VERSION_MINOR ${VERSION_MINOR}"; \ - echo "#define VERSION_PATCH ${VERSION_PATCH}"; \ - echo "#define VERSION_STRING STR(VERSION_MAJOR) \".\" STR(VERSION_MINOR) \ - \".\" STR(VERSION_PATCH)"; \ - echo "#endif"; \ - } > $${VERSION_FILE_NEW}; \ - if ! cmp -s $${VERSION_FILE} $${VERSION_FILE_NEW}; then \ - echo "android_version.h changed, updating..."; \ - mv "$${VERSION_FILE_NEW}" "$${VERSION_FILE}"; \ - else \ - rm "$${VERSION_FILE_NEW}"; \ - fi - clean : clean_apk clean_assets diff --git a/build/android/build.gradle b/build/android/build.gradle index 7bf66c533..a48da0cfd 100644 --- a/build/android/build.gradle +++ b/build/android/build.gradle @@ -1,30 +1,34 @@ buildscript { repositories { - maven { url 'https://maven.google.com' } - jcenter() google() + jcenter() + maven { url 'https://maven.fabric.io/public' } } dependencies { - classpath 'com.android.tools.build:gradle:3.4.0' + classpath 'com.android.tools.build:gradle:3.4.2' + classpath 'com.google.gms:google-services:4.3.0' + classpath 'io.fabric.tools:gradle:1.29.0' + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files } } allprojects { repositories { - maven { url 'https://maven.google.com' } + google() jcenter() } } apply plugin: 'com.android.application' android { - compileSdkVersion 28 - buildToolsVersion "28.0.3" + compileSdkVersion 29 + buildToolsVersion "29.0.0" defaultConfig { applicationId 'com.multicraft.game' minSdkVersion 16 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 1 } Properties props = new Properties() @@ -53,15 +57,13 @@ android { abi { enable true reset() - include "armeabi-v7a", "x86" - //include 'armeabi-v7a', 'arm64-v8a', 'x86' + include "armeabi-v7a", "arm64-v8a", "x86" } } } // build multiple APKs for all ABI -ext.abiCodes = ['armeabi-v7a': 0, 'x86': 1] -//ext.abiCodes = ['armeabi-v7a': 0, 'arm64-v8a': 1, 'x86': 2] +ext.abiCodes = ['armeabi-v7a': 0, 'arm64-v8a': 1, 'x86': 2] import com.android.build.OutputFile android.applicationVariants.all { variant -> @@ -76,10 +78,11 @@ android.applicationVariants.all { variant -> } dependencies { - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.crashlytics.sdk.android:crashlytics:2.10.0' + implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'com.google.firebase:firebase-core:17.0.0' + implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' // Third-party libraries implementation 'com.itlgl:iosdialog:1.0.0' implementation 'gun0912.ted:tedpermission:2.2.2' - implementation 'org.apache.commons:commons-io:1.3.2' + implementation group: 'commons-io', name: 'commons-io', version: '2.4' } diff --git a/build/android/gradle.properties b/build/android/gradle.properties new file mode 100644 index 000000000..5465fec0e --- /dev/null +++ b/build/android/gradle.properties @@ -0,0 +1,2 @@ +android.enableJetifier=true +android.useAndroidX=true \ No newline at end of file diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk index 667bc07ed..425e1ef8a 100644 --- a/build/android/jni/Android.mk +++ b/build/android/jni/Android.mk @@ -40,23 +40,7 @@ include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := MultiCraft -ifdef GPROF -GPROF_DEF=-DGPROF -endif - -ifeq ($(TARGET_ABI),armeabi-v7a) -LOCAL_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -endif - -ifeq ($(TARGET_ABI),x86) -LOCAL_CFLAGS += -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -funroll-loops -endif - -ifndef NDEBUG -LOCAL_CFLAGS := -g -D_DEBUG -O0 -fno-omit-frame-pointer -endif - -LOCAL_CFLAGS := \ +LOCAL_CFLAGS += \ -DJSONCPP_NO_LOCALE_SUPPORT \ -DHAVE_TOUCHSCREENGUI \ -DUSE_CURL=1 \ @@ -68,14 +52,11 @@ LOCAL_CFLAGS := \ -pipe ifdef GPROF + GPROF_DEF := -DGPROF PROFILER_LIBS := android-ndk-profiler LOCAL_CFLAGS += -pg endif -LOCAL_CFLAGS += -Ofast -fdata-sections -ffunction-sections -fvisibility=hidden -flto -LOCAL_CXXFLAGS := $(LOCAL_CFLAGS) -LOCAL_LDFLAGS := -Wl,--no-warn-mismatch,--gc-sections,--icf=safe - LOCAL_C_INCLUDES := \ jni/src \ jni/src/script \ @@ -90,6 +71,8 @@ LOCAL_C_INCLUDES := \ deps/libvorbis-android/jni/include \ deps/leveldb/include \ deps/luajit/src \ + deps/libiconv/include \ + deps/libiconv/libcharset/include LOCAL_SRC_FILES := \ jni/src/ban.cpp \ @@ -311,14 +294,6 @@ LOCAL_SRC_FILES += \ # JSONCPP LOCAL_SRC_FILES += jni/lib/jsoncpp/jsoncpp.cpp -# libiconv -LOCAL_CFLAGS += -D_ANDROID -DLIBDIR -DBUILDING_LIBICONV - -LOCAL_C_INCLUDES += \ - deps/libiconv/include \ - deps/libiconv/lib \ - deps/libiconv/libcharset/include - LOCAL_SRC_FILES += \ deps/libiconv/lib/iconv.c \ deps/libiconv/libcharset/lib/localcharset.c diff --git a/build/android/jni/Application.mk b/build/android/jni/Application.mk index d184f0774..82025a44b 100644 --- a/build/android/jni/Application.mk +++ b/build/android/jni/Application.mk @@ -1,8 +1,39 @@ APP_PLATFORM := ${APP_PLATFORM} APP_ABI := ${TARGET_ABI} -APP_STL := gnustl_static -NDK_TOOLCHAIN_VERSION := 4.9 -APP_DEPRECATED_HEADERS := true +APP_STL := ${APP_STL} +NDK_TOOLCHAIN_VERSION := ${COMPILER_VERSION} APP_MODULES := MultiCraft -APP_CPPFLAGS += -fexceptions -frtti +APP_CPPFLAGS := -Ofast -fvisibility=hidden -fpic -fexceptions -Wno-deprecated-declarations + +ifeq ($(COMPILER_VERSION),4.9) +APP_CPPFLAGS += -flto +endif + +ifeq ($(TARGET_ABI),armeabi-v7a) +APP_CPPFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb +endif + +ifeq ($(TARGET_ABI),x86) +APP_CPPFLAGS += -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -funroll-loops +endif + +ifndef NDEBUG +APP_CPPFLAGS := -g -D_DEBUG -O0 -fno-omit-frame-pointer +endif + +APP_CFLAGS := $(APP_CPPFLAGS) +APP_CXXFLAGS := $(APP_CPPFLAGS) -frtti +APP_LDFLAGS := -Wl,--no-warn-mismatch,--gc-sections,--icf=safe + +ifeq ($(COMPILER_VERSION),clang) +APP_CFLAGS += $(APP_CPPFLAGS) -Wno-parentheses-equality +APP_CXXFLAGS += $(APP_CPPFLAGS) -std=gnu++17 +ifeq ($(TARGET_ABI),arm64-v8a) +APP_LDFLAGS := -Wl,--no-warn-mismatch,--gc-sections +endif +endif + +ifndef NDEBUG +APP_LDFLAGS := +endif diff --git a/build/android/jni/Deps.mk b/build/android/jni/Deps.mk index 3056fbe5e..449ff0ede 100644 --- a/build/android/jni/Deps.mk +++ b/build/android/jni/Deps.mk @@ -1,9 +1,6 @@ APP_PLATFORM := ${APP_PLATFORM} APP_ABI := ${TARGET_ABI} -APP_STL := gnustl_static -NDK_TOOLCHAIN_VERSION := 4.9 -APP_DEPRECATED_HEADERS := true +APP_STL := ${APP_STL} +NDK_TOOLCHAIN_VERSION := ${COMPILER_VERSION} -APP_CLAFGS += ${TARGET_CFLAGS_ADDON} -APP_CPPFLAGS += ${TARGET_CXXFLAGS_ADDON} -fexceptions -frtti -APP_LDFLAGS += ${TARGET_LDFLAGS_ADDON} +APP_CFLAGS := ${TARGET_CXXFLAGS_ADDON} diff --git a/build/android/jni/Irrlicht.mk b/build/android/jni/Irrlicht.mk index 5690efcdb..2e8dbbbe8 100644 --- a/build/android/jni/Irrlicht.mk +++ b/build/android/jni/Irrlicht.mk @@ -1,8 +1,15 @@ APP_PLATFORM := ${APP_PLATFORM} APP_ABI := ${TARGET_ABI} -APP_STL := gnustl_static -NDK_TOOLCHAIN_VERSION := 4.9 -APP_DEPRECATED_HEADERS := true +APP_STL := ${APP_STL} +NDK_TOOLCHAIN_VERSION := ${COMPILER_VERSION} APP_MODULES := Irrlicht -APP_CPPFLAGS += -fexceptions -frtti +APP_CPPFLAGS := ${TARGET_CPPFLAGS_ADDON} + +ifeq ($(COMPILER_VERSION),4.9) +APP_CPPFLAGS += -flto +endif + +ifeq ($(COMPILER_VERSION),clang) +APP_CPPFLAGS += -std=gnu++11 +endif diff --git a/build/android/patches/irrlicht-optimization.patch b/build/android/patches/irrlicht-optimization.patch deleted file mode 100644 index b5ff39c8b..000000000 --- a/build/android/patches/irrlicht-optimization.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- irrlicht/source/Irrlicht/Android/jni/Android.mk.orig 2016-02-15 05:33:03.000000000 +0200 -+++ irrlicht/source/Irrlicht/Android/jni/Android.mk 2016-02-15 05:34:34.913711815 +0200 -@@ -11,7 +11,15 @@ - ifndef NDEBUG - LOCAL_CFLAGS += -g -D_DEBUG - else --LOCAL_CFLAGS += -fexpensive-optimizations -O3 -+ifeq ($(TARGET_ABI),armeabi-v7a) -+LOCAL_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -+endif -+ifeq ($(TARGET_ABI),x86) -+LOCAL_CFLAGS += -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -funroll-loops -+endif -+LOCAL_CFLAGS += -Ofast -fdata-sections -ffunction-sections -fvisibility=hidden -flto -+LOCAL_CXXFLAGS := $(LOCAL_CFLAGS) -+LOCAL_LDFLAGS := -Wl,--no-warn-mismatch,--gc-sections,--icf=safe - endif - - LOCAL_C_INCLUDES := ../../../include diff --git a/build/android/patches/irrlicht-texturehack.patch b/build/android/patches/irrlicht-texturehack.patch deleted file mode 100644 index a458ede72..000000000 --- a/build/android/patches/irrlicht-texturehack.patch +++ /dev/null @@ -1,240 +0,0 @@ ---- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig 2014-06-22 17:01:13.266568869 +0200 -+++ irrlicht/source/Irrlicht/COGLESTexture.cpp 2014-06-22 17:03:59.298572810 +0200 -@@ -366,112 +366,140 @@ - void(*convert)(const void*, s32, void*) = 0; - getFormatParameters(ColorFormat, InternalFormat, filtering, PixelFormat, PixelType, convert); - -- // make sure we don't change the internal format of existing images -- if (!newTexture) -- InternalFormat = oldInternalFormat; -- -- Driver->setActiveTexture(0, this); -- -- if (Driver->testGLError()) -- os::Printer::log("Could not bind Texture", ELL_ERROR); -- -- // mipmap handling for main texture -- if (!level && newTexture) -- { -- // auto generate if possible and no mipmap data is given -- if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE)) -- { -- if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED)) -- glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST); -- else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY)) -- glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST); -- else -- glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE); -+ bool retry = false; -+ -+ do { -+ if (retry) { -+ InternalFormat = GL_RGBA; -+ PixelFormat = GL_RGBA; -+ convert = CColorConverter::convert_A8R8G8B8toA8B8G8R8; -+ } -+ // make sure we don't change the internal format of existing images -+ if (!newTexture) -+ InternalFormat = oldInternalFormat; - -- glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); -- AutomaticMipmapUpdate=true; -- } -+ Driver->setActiveTexture(0, this); - -- // enable bilinear filter without mipmaps -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering); -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering); -- } -+ if (Driver->testGLError()) -+ os::Printer::log("Could not bind Texture", ELL_ERROR); - -- // now get image data and upload to GPU -+ // mipmap handling for main texture -+ if (!level && newTexture) -+ { -+ // auto generate if possible and no mipmap data is given -+ if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE)) -+ { -+ if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED)) -+ glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST); -+ else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY)) -+ glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST); -+ else -+ glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE); -+ -+ glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); -+ AutomaticMipmapUpdate=true; -+ } -+ -+ // enable bilinear filter without mipmaps -+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering); -+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering); -+ } - -- u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height); -+ // now get image data and upload to GPU - -- void* source = image->lock(); -+ u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height); - -- IImage* tmpImage = 0; -+ void* source = image->lock(); - -- if (convert) -- { -- tmpImage = new CImage(image->getColorFormat(), image->getDimension()); -- void* dest = tmpImage->lock(); -- convert(source, image->getDimension().getArea(), dest); -- image->unlock(); -- source = dest; -- } -+ IImage* tmpImage = 0; - -- if (newTexture) -- { -- if (IsCompressed) -+ if (convert) - { -- glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width, -- image->getDimension().Height, 0, compressedImageSize, source); -+ tmpImage = new CImage(image->getColorFormat(), image->getDimension()); -+ void* dest = tmpImage->lock(); -+ convert(source, image->getDimension().getArea(), dest); -+ image->unlock(); -+ source = dest; - } -- else -- glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width, -- image->getDimension().Height, 0, PixelFormat, PixelType, source); -- } -- else -- { -- if (IsCompressed) -+ -+ if (newTexture) - { -- glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width, -- image->getDimension().Height, PixelFormat, compressedImageSize, source); -+ if (IsCompressed) -+ { -+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width, -+ image->getDimension().Height, 0, compressedImageSize, source); -+ } -+ else -+ glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width, -+ image->getDimension().Height, 0, PixelFormat, PixelType, source); - } - else -- glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width, -- image->getDimension().Height, PixelFormat, PixelType, source); -- } -- -- if (convert) -- { -- tmpImage->unlock(); -- tmpImage->drop(); -- } -- else -- image->unlock(); -- -- if (!level && newTexture) -- { -- if (IsCompressed && !mipmapData) - { -- if (image->hasMipMaps()) -- mipmapData = static_cast(image->lock())+compressedImageSize; -+ if (IsCompressed) -+ { -+ glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width, -+ image->getDimension().Height, PixelFormat, compressedImageSize, source); -+ } - else -- HasMipMaps = false; -+ glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width, -+ image->getDimension().Height, PixelFormat, PixelType, source); - } - -- regenerateMipMapLevels(mipmapData); -- -- if (HasMipMaps) // might have changed in regenerateMipMapLevels -+ if (convert) - { -- // enable bilinear mipmap filter -- GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST; -- -- if (filtering != GL_LINEAR) -- filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST; -+ tmpImage->unlock(); -+ tmpImage->drop(); -+ } -+ else -+ image->unlock(); -+ -+ if (glGetError() != GL_NO_ERROR) { -+ static bool warned = false; -+ if ((!retry) && (ColorFormat == ECF_A8R8G8B8)) { -+ -+ if (!warned) { -+ os::Printer::log("Your driver claims to support GL_BGRA but fails on trying to upload a texture, converting to GL_RGBA and trying again", ELL_ERROR); -+ warned = true; -+ } -+ } -+ else if (retry) { -+ os::Printer::log("Neither uploading texture as GL_BGRA nor, converted one using GL_RGBA succeeded", ELL_ERROR); -+ } -+ retry = !retry; -+ continue; -+ } else { -+ retry = false; -+ } - -- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps); -- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering); -+ if (!level && newTexture) -+ { -+ if (IsCompressed && !mipmapData) -+ { -+ if (image->hasMipMaps()) -+ mipmapData = static_cast(image->lock())+compressedImageSize; -+ else -+ HasMipMaps = false; -+ } -+ -+ regenerateMipMapLevels(mipmapData); -+ -+ if (HasMipMaps) // might have changed in regenerateMipMapLevels -+ { -+ // enable bilinear mipmap filter -+ GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST; -+ -+ if (filtering != GL_LINEAR) -+ filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST; -+ -+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps); -+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering); -+ } - } -- } - -- if (Driver->testGLError()) -- os::Printer::log("Could not glTexImage2D", ELL_ERROR); -+ if (Driver->testGLError()) -+ os::Printer::log("Could not glTexImage2D", ELL_ERROR); -+ } -+ while(retry); - } - - ---- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig 2014-06-25 00:28:50.820501856 +0200 -+++ irrlicht/source/Irrlicht/COGLESTexture.cpp 2014-06-25 00:08:37.712544692 +0200 -@@ -422,6 +422,9 @@ - source = dest; - } - -+ //clear old error -+ glGetError(); -+ - if (newTexture) - { - if (IsCompressed) diff --git a/build/android/src/main/java/com/multicraft/game/GameActivity.java b/build/android/src/main/java/com/multicraft/game/GameActivity.java index d1b9e62b5..87b930192 100644 --- a/build/android/src/main/java/com/multicraft/game/GameActivity.java +++ b/build/android/src/main/java/com/multicraft/game/GameActivity.java @@ -8,6 +8,7 @@ import android.content.Intent; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; +import android.text.TextUtils; import android.view.View; import android.view.WindowManager; @@ -20,8 +21,16 @@ import static com.multicraft.game.AdManager.stopAd;*/ public class GameActivity extends NativeActivity { static { - System.loadLibrary("MultiCraft"); - //System.loadLibrary("c++_shared"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (TextUtils.join(", ", Build.SUPPORTED_ABIS).contains("64")) { + //System.loadLibrary("c++_shared"); // uncomment when upgrading to Clang + System.loadLibrary("MultiCraft"); + } else { + System.loadLibrary("MultiCraft"); + } + } else { + System.loadLibrary("MultiCraft"); + } } private int messageReturnCode; diff --git a/build/android/src/main/java/com/multicraft/game/MainActivity.java b/build/android/src/main/java/com/multicraft/game/MainActivity.java index be2f71e4f..5ded374e2 100644 --- a/build/android/src/main/java/com/multicraft/game/MainActivity.java +++ b/build/android/src/main/java/com/multicraft/game/MainActivity.java @@ -21,7 +21,7 @@ import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.provider.Settings; -import android.support.v4.content.ContextCompat; +import androidx.core.content.ContextCompat; import android.text.method.LinkMovementMethod; import android.view.ContextThemeWrapper; import android.view.Display; diff --git a/build/android/src/main/res/xml/network_security_config.xml b/build/android/src/main/res/xml/network_security_config.xml index f18e1f040..bb6ab93df 100644 --- a/build/android/src/main/res/xml/network_security_config.xml +++ b/build/android/src/main/res/xml/network_security_config.xml @@ -3,6 +3,7 @@ + \ No newline at end of file diff --git a/src/config.h b/src/config.h index 00c120998..7c2c7383a 100644 --- a/src/config.h +++ b/src/config.h @@ -12,30 +12,17 @@ #if defined USE_CMAKE_CONFIG_H #include "cmake_config.h" -#elif defined (__ANDROID__) - #define PROJECT_NAME "MultiCraft" - #define PROJECT_NAME_C "MultiCraft" - #define STATIC_SHAREDIR "" - #include "android_version.h" - #ifdef NDEBUG - #define BUILD_TYPE "Release" - #else - #define BUILD_TYPE "Debug" - #endif -#elif defined (__IOS__) +#elif defined(__ANDROID__) || defined(__IOS__) #define PROJECT_NAME "MultiCraft" #define PROJECT_NAME_C "MultiCraft" #define STATIC_SHAREDIR "" #define VERSION_MAJOR 1 #define VERSION_MINOR 2 - #define VERSION_PATCH 1 - #define VERSION_STRING "1.2.1" - #ifdef NDEBUG - #define BUILD_TYPE "Release" - #else - #define BUILD_TYPE "Debug" - #endif -#else + #define VERSION_PATCH 2 + #define VERSION_STRING STR(VERSION_MAJOR) "." STR(VERSION_MINOR) "." STR(VERSION_PATCH) +#endif + +#ifndef USE_CMAKE_CONFIG_H #ifdef NDEBUG #define BUILD_TYPE "Release" #else @@ -51,5 +38,4 @@ " USE_FREETYPE=" STR(USE_FREETYPE) \ " USE_LUAJIT=" STR(USE_LUAJIT) \ " STATIC_SHAREDIR=" STR(STATIC_SHAREDIR) - #endif diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 73c23019f..c32ed22d6 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -391,10 +391,11 @@ void set_default_settings(Settings *settings) settings->setDefault("touchscreen_threshold", "20"); settings->setDefault("doubletap_jump", "true"); settings->setDefault("abm_interval", "2.0"); - settings->setDefault("dedicated_server_step", "0.2"); + settings->setDefault("emergequeue_limit_diskonly", "16"); + settings->setDefault("emergequeue_limit_generate", "16"); settings->setDefault("curl_verify_cert", "false"); settings->setDefault("gui_scaling_filter_txr2img", "false"); - settings->setDefault("mapgens_available", "v7p, v6, flat"); + settings->setDefault("mapgens_available", "v7p, flat"); // FIXME: this code should be in init_gettext() ideally char lang[3] = {0}; @@ -417,8 +418,6 @@ void set_default_settings(Settings *settings) settings->setDefault("pause_fps_max", "10"); settings->setDefault("smooth_lighting", "false"); settings->setDefault("selectionbox_width", "6"); - settings->setDefault("emergequeue_limit_diskonly", "8"); - settings->setDefault("emergequeue_limit_generate", "8"); settings->setDefault("chunksize", "3"); settings->setDefault("active_block_range", "1"); settings->setDefault("max_block_generate_distance", "3"); @@ -439,7 +438,7 @@ void set_default_settings(Settings *settings) settings->setDefault("mouse_sensitivity", "0.25"); } else if (x_inches > 3.7 && x_inches < 5) { // all phones - settings->setDefault("hud_scaling", "0.65"); + settings->setDefault("hud_scaling", "0.7"); settings->setDefault("mouse_sensitivity", "0.15"); } else if (x_inches >= 5) { // tablets @@ -449,8 +448,6 @@ void set_default_settings(Settings *settings) // iOS Settings #ifdef __IOS__ - settings->setDefault("emergequeue_limit_diskonly", "16"); - settings->setDefault("emergequeue_limit_generate", "16"); settings->setDefault("debug_log_level", "none"); // set font_path settings->setDefault("mono_font_path", g_settings->get("font_path")); diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp index 7ffea7432..d01dc729f 100644 --- a/src/guiFormSpecMenu.cpp +++ b/src/guiFormSpecMenu.cpp @@ -3707,14 +3707,14 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) m_invmgr->inventoryAction(a); } else if (craft_amount > 0) { assert(s.isValid()); - + // if there are no items selected or the selected item // belongs to craftresult list, proceed with crafting if (m_selected_item == NULL || !m_selected_item->isValid() || m_selected_item->listname == "craftresult") { - + m_selected_content_guess = ItemStack(); // Clear - + assert(inv_s); // Send IACTION_CRAFT @@ -3829,10 +3829,11 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) } } } - - if (event.GUIEvent.EventType == gui::EGET_EDITBOX_CHANGED) { - if (event.GUIEvent.Caller->getID() > 257) { - for (GUIFormSpecMenu::FieldSpec &s : m_fields) { + + if (event.GUIEvent.EventType == gui::EGET_EDITBOX_CHANGED) { + if (event.GUIEvent.Caller->getID() > 257) { + for (u32 i = 0; i < m_fields.size(); i++) { + FieldSpec &s = m_fields[i]; if (s.ftype == f_Unknown && s.is_dynamic && s.fid == event.GUIEvent.Caller->getID()) { s.send = true; diff --git a/src/main.cpp b/src/main.cpp index 6f24fbb9e..7d4fa6cb8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -112,11 +112,7 @@ FileLogOutput file_log_output; static OptionList allowed_options; -#ifdef __IOS__ -int real_main(int argc, char *argv[]) -#else int main(int argc, char *argv[]) -#endif { int retval; debug_set_exception_handler(); diff --git a/src/porting_ios.cpp b/src/porting_ios.cpp index 5445bf3e6..60f09af2e 100644 --- a/src/porting_ios.cpp +++ b/src/porting_ios.cpp @@ -96,11 +96,11 @@ namespace porting { } } -extern int real_main(int argc, char *argv[]); +extern int main(int argc, char *argv[]); void irrlicht_main() { static const char *args[] = { PROJECT_NAME, }; - real_main(1, (char**) args); + main(1, (char**) args); } diff --git a/src/version.cpp b/src/version.cpp index 3280c3b0d..8a155ee78 100644 --- a/src/version.cpp +++ b/src/version.cpp @@ -20,10 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "version.h" #include "config.h" -#if defined(__ANDROID__) - #include "android_version.h" - #include "android_version_githash.h" -#elif defined(USE_CMAKE_CONFIG_H) +#if USE_CMAKE_CONFIG_H #include "cmake_config_githash.h" #endif @@ -35,4 +32,3 @@ with this program; if not, write to the Free Software Foundation, Inc., const char *g_version_string = VERSION_STRING; const char *g_version_hash = VERSION_GITHASH; const char *g_build_info = "VER=" VERSION_GITHASH " " BUILD_INFO; -