Warning, /education/gcompris/android/CMakeLists.txt is written in an unsupported language. File is not indexed.

0001 #=============================================================================
0002 # SPDX-FileCopyrightText: 2014 Johnny Jazeix <jazeix@gmail.com>
0003 #
0004 # SPDX-License-Identifier: BSD-3-Clause
0005 #=============================================================================
0006 #android build
0007 # copied/inspired from stellarium project (http://www.stellarium.org/wiki/index.php/Building_for_Android)
0008 
0009 list(APPEND JAVA_SRCS "src/net/gcompris/GComprisActivity.java")
0010 
0011 foreach(JavaSource ${JAVA_SRCS})
0012   add_custom_command(
0013     OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${JavaSource}
0014     COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${JavaSource} ${CMAKE_CURRENT_BINARY_DIR}/${JavaSource}
0015     DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${JavaSource}
0016     )
0017   list(APPEND TARGET_JAVA_FILES ${CMAKE_CURRENT_BINARY_DIR}/${JavaSource})
0018 endforeach()
0019 
0020 add_custom_target(java_src DEPENDS ${TARGET_JAVA_FILES})
0021 
0022 find_program(ANDROID_DEPLOY_QT NAMES androiddeployqt PATHS ${_qt5Core_install_prefix}/bin/)
0023 
0024 # Look for androiddeployqt program
0025 if(NOT ANDROID_DEPLOY_QT)
0026   message(FATAL_ERROR "Could not find androiddeployqt. Make sure you set all the Qt5_* paths to the Qt for android compiled version.")
0027 endif()
0028 
0029 # Set version
0030 set(ANDROID_VERSION_NAME ${GCOMPRIS_VERSION})
0031 
0032 # Set a name representing the build type
0033 set(APK_SUFFIX "-")
0034 
0035 # _HOST have been removed from ECM in https://cgit.kde.org/extra-cmake-modules.git/commit/?id=731ba7036effcc430f98031e7f2a9826f6234cba
0036 set(_HOST "${CMAKE_HOST_SYSTEM_NAME}-${CMAKE_HOST_SYSTEM_PROCESSOR}")
0037 string(TOLOWER "${_HOST}" _HOST)
0038 
0039 if(WITH_DOWNLOAD)
0040   set(APK_SUFFIX "-dl${APK_SUFFIX}")
0041 endif()
0042 
0043 if(WITH_KIOSK_MODE)
0044   set(APK_SUFFIX "-kiosk${APK_SUFFIX}")
0045 endif()
0046 
0047 # specific clang addition
0048 if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
0049   set(STDCPP_PATH ",\"stdcpp-path\": \"${ANDROID_NDK}/sources/cxx-stl/llvm-libc++/libs/${ANDROID_ABI}/libc++_shared.so\"")
0050 endif()
0051 
0052 set(ANDROID_TOOLCHAIN arm-linux-androideabi)
0053 if("${CMAKE_ANDROID_ARCH}" STREQUAL "arm64")
0054   set(ANDROID_TOOLCHAIN aarch64-linux-android)
0055 endif()
0056 
0057 # set android package source for androiddeployqt json file
0058 set(PACKAGE_SOURCE_ANDROID ${CMAKE_BINARY_DIR}/tmpAndroid)
0059 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml.cmake ${PACKAGE_SOURCE_ANDROID}/AndroidManifest.xml @ONLY)
0060 
0061 # create json file parsed by the androiddeployqt
0062 set(ANDROID_SDK_ROOT $ENV{ANDROID_SDK_ROOT})
0063 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configAndroid.json.cmake ${PACKAGE_SOURCE_ANDROID}/configAndroid.json @ONLY)
0064 
0065 # Get all po files in po/ to create the values-{locale} in order to have the locales available in android
0066 file(GLOB TRANSLATIONS_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "../po/*.po")
0067 foreach(PoSource ${TRANSLATIONS_FILES})
0068   # Remove suffix ".po"
0069   string(REPLACE ".po" "" PoSource ${PoSource})
0070   # Remove prefix "../po/gcompris_"
0071   string(REPLACE "../po/gcompris_" "" locale ${PoSource})
0072   # replace _ par -r for locales with country
0073   string(REPLACE "_" "-r" locale ${locale})
0074 
0075   add_custom_command(
0076     OUTPUT ${locale}
0077     COMMAND cmake -E make_directory ${GCOMPRIS_TRANSLATIONS_DIR}
0078     COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/android/res/values-${locale}
0079     COMMAND cmake -E copy ${CMAKE_SOURCE_DIR}/android/strings.xml ${CMAKE_BINARY_DIR}/android/res/values-${locale}/strings.xml
0080     )
0081   list(APPEND ALL_LOCALES ${locale})
0082 endforeach()
0083 
0084 add_custom_command(
0085   OUTPUT createApkFromAndroidDeployQtDebug
0086   DEPENDS ${PACKAGE_SOURCE_ANDROID}/AndroidManifest.xml
0087   COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR} ${PACKAGE_SOURCE_ANDROID}
0088   COMMAND ${ANDROID_DEPLOY_QT} --output ${CMAKE_CURRENT_BINARY_DIR}/ --input ${PACKAGE_SOURCE_ANDROID}/configAndroid.json --debug --gradle
0089   COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/debug/android-debug.apk ${CMAKE_CURRENT_BINARY_DIR}/GCompris-Android-debug-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk
0090 )
0091 
0092 add_custom_command(
0093   OUTPUT createApkFromAndroidDeployQtRelease
0094   DEPENDS ${PACKAGE_SOURCE_ANDROID}/AndroidManifest.xml
0095   COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR} ${PACKAGE_SOURCE_ANDROID}
0096   COMMAND ${ANDROID_DEPLOY_QT} --output ${CMAKE_CURRENT_BINARY_DIR}/ --input ${PACKAGE_SOURCE_ANDROID}/configAndroid.json --release --gradle
0097   COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/release/android-release-unsigned.apk ${CMAKE_CURRENT_BINARY_DIR}/GCompris-Android-release-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk
0098 )
0099 
0100 add_custom_command(
0101   OUTPUT createApkSignedAlignedFromAndroidDeployQtRelease
0102   DEPENDS ${PACKAGE_SOURCE_ANDROID}/AndroidManifest.xml
0103   COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR} ${PACKAGE_SOURCE_ANDROID}
0104   COMMAND ${ANDROID_DEPLOY_QT} --output ${CMAKE_CURRENT_BINARY_DIR}/ --input ${PACKAGE_SOURCE_ANDROID}/configAndroid.json --gradle --sign $ENV{ANDROID_KEYSTORE} gcompris --storepass $ENV{ANDROID_KEYSTORE_PASSWD}
0105     COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/release/android-release-signed.apk ${CMAKE_CURRENT_BINARY_DIR}/GCompris-Android-release-signed-aligned-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk
0106 )
0107 
0108 add_custom_command(
0109   OUTPUT apkInstall
0110   DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/GCompris-Android-release-signed-aligned-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk
0111   COMMAND ${ANDROID_SDK_ROOT}/platform-tools/adb install -r ${CMAKE_CURRENT_BINARY_DIR}/GCompris-Android-release-signed-aligned-${ANDROID_ABI}${APK_SUFFIX}${GCOMPRIS_VERSION}.apk
0112 )
0113 
0114 # Command to create apk from Makefile
0115 add_custom_target(apk_debug
0116   DEPENDS ${ALL_LOCALES} move_translations_to_assets package_openssl createApkFromAndroidDeployQtDebug java_src
0117 )
0118 
0119 # Command to create apk from Makefile
0120 add_custom_target(apk_release
0121   DEPENDS ${ALL_LOCALES} move_translations_to_assets package_openssl createApkFromAndroidDeployQtRelease java_src
0122 )
0123 
0124 # Command to create aligned signed apk from Makefile
0125 add_custom_target(apk_aligned_signed
0126   DEPENDS ${ALL_LOCALES} move_translations_to_assets package_openssl createApkSignedAlignedFromAndroidDeployQtRelease java_src
0127 )
0128 
0129 # Command to install the signed aligned apk through adb from Makefile
0130 add_custom_target(apk_install
0131   DEPENDS apkInstall
0132 )
0133 
0134 # compile openssl needed to download from https
0135 include(ExternalProject)
0136 set(OPENSSL_DIR "${CMAKE_BINARY_DIR}/external/openssl/")
0137 
0138 # For Qt 5.12.5 and above 5.13.0, it needs libcrypto_1_1.so and libssl_1_1.so
0139 set(suffix_libssl ".so")
0140 if(Qt5Core_VERSION VERSION_GREATER_EQUAL "5.12.5" AND NOT Qt5Core_VERSION MATCHES "5.13.0")
0141   set(suffix_libssl "_1_1.so")
0142 endif()
0143 
0144 find_program(LLVM_STRIP NAMES llvm-strip PATHS ${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/)
0145 
0146 ExternalProject_Add(
0147   ext_openssl
0148   DOWNLOAD_DIR ${CMAKE_BINARY_DIR}
0149   SOURCE_DIR ${OPENSSL_DIR}
0150   URL https://www.openssl.org/source/openssl-1.1.1n.tar.gz
0151   URL_HASH SHA256=40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a
0152   BUILD_IN_SOURCE 1
0153   CONFIGURE_COMMAND
0154   ${CMAKE_COMMAND} -E env PATH=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin:$ENV{PATH}
0155   ./Configure --prefix=${CMAKE_CURRENT_BINARY_DIR} --openssldir=./ssl android-${CMAKE_ANDROID_ARCH} shared -D__ANDROID_API__=${CMAKE_ANDROID_API}
0156   BUILD_COMMAND
0157   ${CMAKE_COMMAND} -E env PATH=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin:$ENV{PATH}
0158   make SHLIB_VERSION_NUMBER= SHLIB_EXT=${suffix_libssl} build_libs &&
0159   ${LLVM_STRIP} --strip-all libcrypto${suffix_libssl} &&
0160   ${LLVM_STRIP} --strip-all libcrypto${suffix_libssl}
0161   INSTALL_COMMAND ""
0162   )
0163 add_custom_command(
0164   OUTPUT package_openssl
0165   COMMAND ${CMAKE_COMMAND} -E copy "${OPENSSL_DIR}/libcrypto${suffix_libssl}" "${CMAKE_BINARY_DIR}/android/libs/${ANDROID_ABI}/libcrypto${suffix_libssl}"
0166   COMMAND ${CMAKE_COMMAND} -E copy "${OPENSSL_DIR}/libssl${suffix_libssl}" "${CMAKE_BINARY_DIR}/android/libs/${ANDROID_ABI}/libssl${suffix_libssl}"
0167   )
0168 
0169 #
0170 add_custom_command(
0171   OUTPUT move_translations_to_assets
0172   COMMAND ${CMAKE_COMMAND} -E copy_directory ${GCOMPRIS_TRANSLATIONS_DIR} ${CMAKE_BINARY_DIR}/android/assets/share/GCompris
0173   )
0174 
0175 if(TARGET create-apk)
0176   set(PACKAGE_DIR ${PACKAGE_SOURCE_ANDROID})
0177   set_target_properties(create-apk-GCompris PROPERTIES ANDROID_APK_DIR "${PACKAGE_DIR}")
0178   add_custom_target(gcompris-move-metadata ALL
0179     COMMAND cmake -E echo "Moving GCompris shared Android resources"
0180     COMMAND cmake -E make_directory ${PACKAGE_SOURCE_ANDROID}
0181     COMMAND cmake -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}" "${PACKAGE_SOURCE_ANDROID}"
0182     )
0183   add_dependencies(create-apk gcompris-move-metadata)
0184 endif()