Warning, /education/minuet/cmake/qt-android-mk-apk.cmake is written in an unsupported language. File is not indexed.
0001 include(CMakeParseArguments)
0002
0003 set(QT_ANDROID_MK_APK_DIR ${CMAKE_CURRENT_LIST_DIR})
0004
0005 function(qt_android_build_apk)
0006 set(options)
0007 set(oneValueArgs
0008 TARGET PACKAGE_NAME ANDROID_EXTRA_FILES QML_ROOT_PATH
0009 SDK_BUILD_TOOLS_VERSION EXTRA_LIBS)
0010 set(multiValueArgs)
0011 cmake_parse_arguments(APK "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
0012
0013 # Gather required variables to create the configuration file.
0014
0015 find_package(Qt5 COMPONENTS Core REQUIRED)
0016 # Qt5Core_DIR now points to $Qt5InstallPrefix/lib/cmake/Qt5Core, so
0017 # we get the parent directory three times:
0018 get_filename_component(QT5_INSTALL_PREFIX "${Qt5Core_DIR}/../../.." ABSOLUTE)
0019 message("Qt5 installed in ${QT5_INSTALL_PREFIX}")
0020
0021 # Adjust QML root path if not set:
0022 if(NOT APK_QML_ROOT_PATH)
0023 set(APK_QML_ROOT_PATH $<TARGET_FILE_DIR:${APK_TARGET}>)
0024 endif()
0025
0026 # Get the toolchain prefix, i.e. the folder name within the
0027 # toolchains/ folder without the compiler version
0028 # APK_NDK_TOOLCHAIN_PREFIX
0029 file(RELATIVE_PATH APK_NDK_TOOLCHAIN_PREFIX ${CMAKE_ANDROID_NDK} ${CMAKE_CXX_COMPILER})
0030 string(REPLACE "/" ";" APK_NDK_TOOLCHAIN_PREFIX ${APK_NDK_TOOLCHAIN_PREFIX})
0031 list(GET APK_NDK_TOOLCHAIN_PREFIX 1 APK_NDK_TOOLCHAIN_PREFIX)
0032 string(REPLACE "clang" "" NEW_CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION ${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION})
0033 if(NOT NEW_CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION STREQUAL "")
0034 string(LENGTH "-${NEW_CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}" VERSION_LENGTH)
0035 string(LENGTH "${APK_NDK_TOOLCHAIN_PREFIX}" FOLDER_LENGTH)
0036 math(EXPR PREFIX_LENGTH ${FOLDER_LENGTH}-${VERSION_LENGTH})
0037 string(SUBSTRING "${APK_NDK_TOOLCHAIN_PREFIX}" 0 ${PREFIX_LENGTH} APK_NDK_TOOLCHAIN_PREFIX)
0038 endif()
0039
0040 # Get path to the target:
0041 set(APK_TARGET_OUTPUT_FILENAME $<TARGET_FILE:${APK_TARGET}>)
0042
0043 # Get Android SDK build tools version:
0044 if(NOT APK_SDK_BUILD_TOOLS_VERSION)
0045 file(GLOB sdk_versions RELATIVE $ENV{ANDROID_SDK_ROOT}/build-tools
0046 $ENV{ANDROID_SDK_ROOT}/build-tools/*)
0047 list(GET sdk_versions -1 APK_SDK_BUILD_TOOLS_VERSION)
0048 endif()
0049
0050 # Step 1: Create an intermediate config file. At this point,
0051 # the generator expressions will we use are not yet resolved.
0052 configure_file(
0053 ${QT_ANDROID_MK_APK_DIR}/qt-android-deployment.json.in
0054 ${CMAKE_CURRENT_BINARY_DIR}/${APK_TARGET}-config.json.pre)
0055
0056 # Step 2: Run file(CONFIGURE ...) to create the final config JSON
0057 # with generator expressions resolved:
0058 file(
0059 GENERATE
0060 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${APK_TARGET}-config.json
0061 INPUT ${CMAKE_CURRENT_BINARY_DIR}/${APK_TARGET}-config.json.pre)
0062
0063 # Step 3: Create a custom target which will build our APK:
0064 set(APK_DIR ${CMAKE_CURRENT_BINARY_DIR}/${APK_TARGET}-apk-build)
0065 if(NOT APK_ANDROID_EXTRA_FILES)
0066 set(
0067 APK_ANDROID_EXTRA_FILES
0068 ${QT5_INSTALL_PREFIX}/src/android/templates/)
0069 endif()
0070 if(JAVA_HOME)
0071 set(ANDROIDDEPLOYQT_EXTRA_ARGS
0072 ${ANDROIDDEPLOYQT_EXTRA_ARGS} --jdk '${JAVA_HOME}')
0073 endif()
0074 if(${CMAKE_BUILD_TYPE} STREQUAL "Release")
0075 set(ANDROIDDEPLOYQT_EXTRA_ARGS
0076 ${ANDROIDDEPLOYQT_EXTRA_ARGS} --release)
0077 set(APK_FILENAME ${APK_TARGET}-apk-build-release-unsigned.apk)
0078 else()
0079 set(APK_FILENAME ${APK_TARGET}-apk-build-debug.apk)
0080 endif()
0081 add_custom_target(
0082 ${APK_TARGET}-apk
0083 COMMAND ${CMAKE_COMMAND} -E remove_directory ${APK_DIR}
0084 COMMAND ${CMAKE_COMMAND} -E copy_directory
0085 ${QT5_INSTALL_PREFIX}/src/android/templates/
0086 ${APK_DIR}
0087 COMMAND ${CMAKE_COMMAND} -E copy_directory
0088 ${APK_ANDROID_EXTRA_FILES}/
0089 ${APK_DIR}
0090 COMMAND ${CMAKE_COMMAND} -E make_directory
0091 ${APK_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}
0092 COMMAND ${CMAKE_COMMAND} -E copy
0093 ${APK_TARGET_OUTPUT_FILENAME}
0094 ${APK_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}
0095 COMMAND ${QT5_INSTALL_PREFIX}/bin/androiddeployqt
0096 --verbose
0097 --output ${APK_DIR}
0098 --input ${CMAKE_CURRENT_BINARY_DIR}/${APK_TARGET}-config.json
0099 --deployment bundled
0100 --gradle
0101 ${ANDROIDDEPLOYQT_EXTRA_ARGS}
0102 )
0103
0104 # Step 4: Create a custom target which pushes the created APK onto
0105 # the device.
0106 add_custom_target(
0107 ${APK_TARGET}-apk-install
0108 COMMAND $ENV{ANDROID_SDK_ROOT}/platform-tools/adb install -r
0109 ${APK_DIR}/build/outputs/apk/debug/${APK_FILENAME}
0110 DEPENDS
0111 ${APK_TARGET}-apk
0112 )
0113 endfunction()