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()