2018-09-15 21:59:47 +02:00
cmake_minimum_required ( VERSION 3.3.0 FATAL_ERROR )
2019-02-23 13:48:20 +01:00
# adds a target to create an Android APK with the help of androiddeployqt if target platform is Android
2018-09-15 21:59:47 +02:00
2019-02-06 17:32:10 +01:00
if ( NOT ANDROID )
2018-09-15 21:59:47 +02:00
return ( )
2019-02-06 17:32:10 +01:00
endif ( )
if ( NOT BASIC_PROJECT_CONFIG_DONE OR NOT QT_CONFIGURED )
2018-09-15 21:59:47 +02:00
message ( FATAL_ERROR "Before including the ApkConfig module, the AppTarget module and QtConfig module must be included." )
2019-02-06 17:32:10 +01:00
endif ( )
if ( ANDROID_APK_CONFIGURED )
2018-09-15 21:59:47 +02:00
message ( FATAL_ERROR "The AndroidApk module mustn't be included twice." )
2019-02-06 17:32:10 +01:00
endif ( )
2018-09-15 21:59:47 +02:00
2020-10-05 18:37:23 +02:00
# check paths of Android SDK and NDK
if ( EXISTS "${ANDROID_SDK}" )
2020-10-10 00:48:06 +02:00
set ( ANDROID_APK_SDK "${ANDROID_SDK}" )
2020-10-05 18:37:23 +02:00
elseif ( EXISTS "${CMAKE_ANDROID_SDK}" )
2020-10-10 00:48:06 +02:00
set ( ANDROID_APK_SDK "${CMAKE_ANDROID_SDK}" )
2020-10-05 18:37:23 +02:00
elseif ( EXISTS "$ENV{ANDROID_HOME}" )
2020-10-10 00:48:06 +02:00
set ( ANDROID_APK_SDK "$ENV{ANDROID_HOME}" )
2020-10-05 18:37:23 +02:00
else ( )
message ( FATAL_ERROR "ANDROID_SDK must contain the path of the Android SDK (for passing to androiddeployqt)." )
2019-02-06 17:32:10 +01:00
endif ( )
2020-10-05 18:37:23 +02:00
if ( EXISTS "${ANDROID_NDK}" )
2020-10-10 00:48:06 +02:00
set ( ANDROID_APK_NDK "${ANDROID_NDK}" )
2020-10-05 18:37:23 +02:00
elseif ( EXISTS "${CMAKE_ANDROID_NDK}" )
2020-10-10 00:48:06 +02:00
set ( ANDROID_APK_NDK "${CMAKE_ANDROID_NDK}" )
2020-10-05 18:37:23 +02:00
elseif ( EXISTS "$ENV{ANDROID_NDK_HOME}" )
2020-10-10 00:48:06 +02:00
set ( ANDROID_APK_NDK "$ENV{ANDROID_NDK_HOME}" )
2020-10-05 18:37:23 +02:00
else ( )
message ( FATAL_ERROR "ANDROID_NDK must contain the path of the Android NDK (for passing to androiddeployqt)." )
2019-02-06 17:32:10 +01:00
endif ( )
2018-12-02 21:36:50 +01:00
2020-10-05 18:37:23 +02:00
# set min/target SDK versions
2020-10-10 00:48:06 +02:00
set ( ANDROID_MIN_SDK_VERSION
" $ { C M A K E _ S Y S T E M _ V E R S I O N } "
C A C H E S T R I N G " s p e c i f i e s t h e m i n i m u m S D K v e r s i o n " )
set ( ANDROID_TARGET_SDK_VERSION
" 3 0 "
C A C H E S T R I N G " s p e c i f i e s t h e t a r g e t S D K v e r s i o n " )
2020-10-05 18:37:23 +02:00
2019-08-22 01:05:45 +02:00
# determine some variables
2019-08-22 01:03:53 +02:00
if ( NOT META_ANDROID_PACKAGE_NAME )
message ( FATAL_ERROR "Attempt to load AndroidApk.cmake without having set ANDROID_PACKAGE_NAME." )
endif ( )
2019-10-12 19:00:24 +02:00
set ( ANDROID_APK_APPLICATION_ID_SUFFIX
" "
C A C H E S T R I N G " s u f f i x f o r A n d r o i d A P K I D , u s e e . g . \ " . d e b u g \ " t o p r o d u c e a c o - i n s t a l l a b l e d e b u g v e r s i o n " )
2019-11-30 17:58:56 +01:00
set ( ANDROID_APK_APPLICATION_LABEL
" $ { M E T A _ A P P _ N A M E } "
C A C H E S T R I N G " u s e r v i s i b l e n a m e f o r t h e A P K " )
2019-08-22 01:03:53 +02:00
2018-09-15 21:59:47 +02:00
# find "android" subdirectory in the source directory and check for AndroidManifest.xml
set ( ANDROID_APK_SUBDIR "${CMAKE_CURRENT_SOURCE_DIR}/android" )
2019-02-06 17:32:10 +01:00
if ( NOT IS_DIRECTORY "${ANDROID_APK_SUBDIR}" )
message (
F A T A L _ E R R O R
" T h e d i r e c t o r y c o n t a i n i n g A n d r o i d - s p e c i f i c f i l e s i s e x p e c t e d t o b e \ " $ { A N D R O I D _ A P K _ S U B D I R } \ " b u t d o e s n ' t e x i s t . " )
endif ( )
2018-09-15 21:59:47 +02:00
set ( ANDROID_APK_MANIFEST_PATH "${ANDROID_APK_SUBDIR}/AndroidManifest.xml" )
2019-08-22 01:02:15 +02:00
if ( NOT EXISTS "${ANDROID_APK_MANIFEST_PATH}" AND NOT EXISTS "${ANDROID_APK_MANIFEST_PATH}.in" )
2018-09-15 21:59:47 +02:00
message ( FATAL_ERROR "The Android manifest doesn't exist at \" ${ ANDROID_APK_SUBDIR } /AndroidManifest.xml\ "." )
2019-02-06 17:32:10 +01:00
endif ( )
2019-08-22 01:02:15 +02:00
# link Android package directory to binary directory evaluating templates on top-level
set ( ANDROID_PACKAGE_SOURCE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/android-package-source-directory" )
file ( MAKE_DIRECTORY "${ANDROID_PACKAGE_SOURCE_DIRECTORY}" )
2019-11-30 17:58:56 +01:00
file (
G L O B _ R E C U R S E A N D R O I D _ A P K _ F I L E S
L I S T _ D I R E C T O R I E S f a l s e
R E L A T I V E " $ { A N D R O I D _ A P K _ S U B D I R } "
" $ { A N D R O I D _ A P K _ S U B D I R } / * " )
2019-08-22 01:02:15 +02:00
set ( ANDROID_SOURCE_DIRECTORY_FILES )
foreach ( ANDROID_APK_FILE ${ ANDROID_APK_FILES } )
if ( IS_DIRECTORY "${ANDROID_APK_FILE}" )
continue ( )
endif ( )
get_filename_component ( ANDROID_APK_FILE_DIR ${ ANDROID_APK_FILE } DIRECTORY )
if ( ANDROID_APK_FILE_DIR )
set ( ANDROID_APK_FILE_DESTINATION "${ANDROID_PACKAGE_SOURCE_DIRECTORY}/${ANDROID_APK_FILE_DIR}" )
file ( MAKE_DIRECTORY "${ANDROID_APK_FILE_DESTINATION}" )
else ( )
set ( ANDROID_APK_FILE_DESTINATION "${ANDROID_PACKAGE_SOURCE_DIRECTORY}" )
endif ( )
get_filename_component ( ANDROID_APK_FILE_EXT ${ ANDROID_APK_FILE } LAST_EXT )
if ( ANDROID_APK_FILE_EXT STREQUAL ".in" )
string ( LENGTH "${ANDROID_APK_FILE}" ANDROID_APK_FILE_LENGTH )
math ( EXPR ANDROID_APK_FILE_LENGTH "${ANDROID_APK_FILE_LENGTH} - 3" )
2019-11-30 17:58:56 +01:00
string ( SUBSTRING "${ANDROID_APK_FILE}" 0 ${ ANDROID_APK_FILE_LENGTH } ANDROID_APK_FILE_NAME )
2019-10-12 19:00:24 +02:00
configure_file ( "${ANDROID_APK_SUBDIR}/${ANDROID_APK_FILE}"
" $ { A N D R O I D _ P A C K A G E _ S O U R C E _ D I R E C T O R Y } / $ { A N D R O I D _ A P K _ F I L E _ N A M E } " )
2019-08-22 01:02:15 +02:00
set ( ANDROID_APK_FILE "${ANDROID_APK_FILE_NAME}" )
else ( )
file ( COPY "${ANDROID_APK_SUBDIR}/${ANDROID_APK_FILE}" DESTINATION "${ANDROID_APK_FILE_DESTINATION}" )
endif ( )
# FIXME: tracking these deps doesn't work
endforeach ( )
2018-09-15 21:59:47 +02:00
# make subdirectory to store build artefacts for APK
set ( ANDROID_APK_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/apk" )
file ( MAKE_DIRECTORY "${ANDROID_APK_BUILD_DIR}" )
# find Qt
get_filename_component ( ANDROID_APK_QT_CMAKE_DIR "${Qt5Core_DIR}" DIRECTORY )
get_filename_component ( ANDROID_APK_QT_LIBRARY_DIR "${ANDROID_APK_QT_CMAKE_DIR}" DIRECTORY )
get_filename_component ( ANDROID_APK_QT_INSTALL_PREFIX "${ANDROID_APK_QT_LIBRARY_DIR}" DIRECTORY )
2020-10-05 18:37:23 +02:00
# deduce Android toolchain prefix from "CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX"
set ( ANDROID_APK_USE_LLVM false )
if ( CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX MATCHES ".*/toolchains/llvm/.*" )
set ( ANDROID_APK_TOOL_PREFIX "llvm" )
set ( ANDROID_APK_USE_LLVM true )
elseif ( CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX MATCHES ".*/(.+)-" )
2018-09-15 21:59:47 +02:00
set ( ANDROID_APK_TOOL_PREFIX "${CMAKE_MATCH_1}" )
2019-02-06 17:32:10 +01:00
else ( )
2018-09-15 21:59:47 +02:00
set ( ANDROID_APK_TOOL_PREFIX "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}" )
2019-02-06 17:32:10 +01:00
endif ( )
2020-10-05 18:37:23 +02:00
message ( STATUS "Android toolchain prefix: ${ANDROID_APK_TOOL_PREFIX}" )
2019-02-03 23:53:22 +01:00
2020-10-05 18:37:23 +02:00
# deduce Android toolchain version from various variables (not required when using LLVM)
2019-11-30 17:58:56 +01:00
set ( ANDROID_APK_TOOLCHAIN_VERSION
" "
C A C H E S T R I N G " t o o l c h a i n v e r s i o n f o r m a k i n g A P K f i l e " )
2020-10-05 18:37:23 +02:00
if ( NOT ANDROID_APK_TOOLCHAIN_VERSION AND NOT ANDROID_APK_TOOL_PREFIX STREQUAL "llvm" )
2019-02-06 17:32:10 +01:00
if ( CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX MATCHES ".*/.+-linux-android-([^/]+)/.*" )
2019-02-03 23:53:22 +01:00
set ( ANDROID_APK_TOOLCHAIN_VERSION "${CMAKE_MATCH_1}" )
2019-03-03 21:43:41 +01:00
elseif ( CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX MATCHES ".*/.+-linux-androideabi-([^/]+)/.*" )
set ( ANDROID_APK_TOOLCHAIN_VERSION "${CMAKE_MATCH_1}" )
2019-02-06 17:32:10 +01:00
elseif ( NOT CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION MATCHES "clang.*" )
2019-02-03 23:53:22 +01:00
set ( ANDROID_APK_TOOLCHAIN_VERSION "${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}" )
2019-02-06 17:32:10 +01:00
else ( )
2020-10-10 00:48:06 +02:00
message (
F A T A L _ E R R O R
" U n a b l e t o d e t e c t t h e t o o l c h a i n version ( for passing it to androiddeployqt ) . "
" P l e a s e s e t A N D R O I D _ A P K _ T O O L C H A I N _ V E R S I O N m a n u a l l y . R e l a t e d v a r i a b l e s : \ n "
" C M A K E _ C X X _ A N D R O I D _ T O O L C H A I N _ P R E F I X : $ { C M A K E _ C X X _ A N D R O I D _ T O O L C H A I N _ P R E F I X } \ n "
" C M A K E _ A N D R O I D _ N D K _ T O O L C H A I N _ V E R S I O N : $ { C M A K E _ A N D R O I D _ N D K _ T O O L C H A I N _ V E R S I O N } " )
2019-02-06 17:32:10 +01:00
endif ( )
2020-10-05 18:37:23 +02:00
message ( STATUS "Auto-detected ANDROID_APK_TOOLCHAIN_VERSION: ${ANDROID_APK_TOOLCHAIN_VERSION}" )
2019-02-06 17:32:10 +01:00
endif ( )
2018-09-15 21:59:47 +02:00
2020-10-05 18:37:23 +02:00
# determine Android build tools version note: Assuming the build tools are installed under "${ANDROID_APK_SDK}/build-tools"
2019-11-30 17:58:56 +01:00
file (
G L O B A N D R O I D _ A P K _ B U I L D _ T O O L S _ V E R S I O N S
L I S T _ D I R E C T O R I E S T R U E
2020-10-05 18:37:23 +02:00
R E L A T I V E " $ { A N D R O I D _ A P K _ S D K } / b u i l d - t o o l s "
" $ { A N D R O I D _ A P K _ S D K } / b u i l d - t o o l s / * " )
2019-02-06 17:32:10 +01:00
if ( NOT ANDROID_APK_BUILD_TOOLS_VERSIONS )
2020-10-05 18:37:23 +02:00
message ( FATAL_ERROR "No build-tools present under \" ${ ANDROID_APK_SDK } /build-tools\ "." )
2019-02-06 17:32:10 +01:00
endif ( )
2018-09-15 21:59:47 +02:00
list ( GET ANDROID_APK_BUILD_TOOLS_VERSIONS 0 ANDROID_APK_BUILD_TOOLS_VERSION )
2020-10-05 18:37:23 +02:00
# deduce path of C++ standard library from "CMAKE_CXX_STANDARD_LIBRARIES"
# note: Assuming CMAKE_CXX_STANDARD_LIBRARIES contains a paths or quotes paths with flags appended.
2019-11-30 17:58:56 +01:00
set ( ANDROID_APK_CXX_STANDARD_LIBRARY
" "
C A C H E S T R I N G " p a t h t o s t a n d a r d l i b r a r y f o r m a k i n g A P K f i l e " )
2020-10-05 18:37:23 +02:00
if ( NOT ANDROID_APK_CXX_STANDARD_LIBRARY AND CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX MATCHES "(.*/toolchains/llvm/.*)/bin/.*" )
message ( STATUS "CMAKE_MATCH_1: ${CMAKE_MATCH_1}" )
2020-10-10 00:48:06 +02:00
set ( ANDROID_APK_CXX_STANDARD_LIBRARY "${CMAKE_MATCH_1}/sysroot/usr/lib" )
2020-10-05 18:37:23 +02:00
if ( NOT EXISTS "${ANDROID_APK_CXX_STANDARD_LIBRARY}" )
unset ( ANDROID_APK_CXX_STANDARD_LIBRARY )
endif ( )
endif ( )
2019-02-06 17:32:10 +01:00
if ( NOT ANDROID_APK_CXX_STANDARD_LIBRARY )
foreach ( CMAKE_CXX_STANDARD_LIBRARY ${ CMAKE_CXX_STANDARD_LIBRARIES } )
if ( EXISTS "${CMAKE_CXX_STANDARD_LIBRARY}" )
2019-02-03 23:53:22 +01:00
set ( ANDROID_APK_CXX_STANDARD_LIBRARY "${CMAKE_CXX_STANDARD_LIBRARY}" )
2018-09-15 21:59:47 +02:00
break ( )
2019-02-06 17:32:10 +01:00
elseif ( CMAKE_CXX_STANDARD_LIBRARY MATCHES "\" ( .* ) \".*")
if ( EXISTS "${CMAKE_MATCH_1}" )
2019-02-03 23:53:22 +01:00
set ( ANDROID_APK_CXX_STANDARD_LIBRARY "${CMAKE_MATCH_1}" )
break ( )
2019-02-06 17:32:10 +01:00
endif ( )
2020-10-05 18:37:23 +02:00
elseif ( CMAKE_CXX_STANDARD_LIBRARY MATCHES "-l.*" )
continue ( )
2019-02-06 17:32:10 +01:00
endif ( )
2020-10-05 18:37:23 +02:00
message ( WARNING "Library \" ${ CMAKE_CXX_STANDARD_LIBRARY } \" from CMAKE_CXX_STANDARD_LIBRARIES does not exist. " )
2019-02-06 17:32:10 +01:00
endforeach ( )
endif ( )
if ( NOT ANDROID_APK_CXX_STANDARD_LIBRARY )
2020-10-10 00:48:06 +02:00
message (
F A T A L _ E R R O R
" U n a b l e t o d e t e c t p a t h o f s t a n d a r d library ( for passing it to androiddeployqt ) . "
" P l e a s e s e t A N D R O I D _ A P K _ C X X _ S T A N D A R D _ L I B R A R Y m a n u a l l y . R e l a t e d v a r i a b l e s : \ n "
" C M A K E _ C X X _ A N D R O I D _ T O O L C H A I N _ P R E F I X : $ { C M A K E _ C X X _ A N D R O I D _ T O O L C H A I N _ P R E F I X } \ n "
" C M A K E _ C X X _ S T A N D A R D _ L I B R A R I E S : $ { C M A K E _ C X X _ S T A N D A R D _ L I B R A R I E S } " )
2019-02-06 17:32:10 +01:00
endif ( )
2018-09-15 21:59:47 +02:00
# determine extra prefix dirs
set ( ANDROID_APK_BINARY_DIRS "${RUNTIME_LIBRARY_PATH}" )
2019-02-06 17:32:10 +01:00
if ( NOT CMAKE_CURRENT_BINARY_DIR IN_LIST ANDROID_APK_BINARY_DIRS )
2018-09-15 21:59:47 +02:00
list ( APPEND ANDROID_APK_BINARY_DIRS "${CMAKE_CURRENT_BINARY_DIR}" )
2019-02-06 17:32:10 +01:00
endif ( )
2018-12-22 02:11:08 +01:00
set ( ANDROID_APK_BINARY_DIRS_DEPENDS "" )
2019-02-06 17:32:10 +01:00
foreach ( PATH ${ ANDROID_APK_BINARY_DIRS } )
# symlink "lib" subdirectory so androiddeployqt finds the library in the runtime path when specified via
# "extraPrefixDirs"
2018-12-22 02:11:08 +01:00
list ( APPEND ANDROID_APK_BINARY_DIRS_DEPENDS "${PATH}/lib" )
2019-11-30 17:58:56 +01:00
add_custom_command ( OUTPUT "${PATH}/lib" COMMAND "${CMAKE_COMMAND}" -E create_symlink "${PATH}" "${PATH}/lib" )
2019-02-06 17:32:10 +01:00
endforeach ( )
2018-12-22 02:11:08 +01:00
include ( ListToString )
2019-11-30 17:58:56 +01:00
list_to_string ( "" "\n \" " " \"," "${ANDROID_APK_BINARY_DIRS}" ANDROID_APK_BINARY_DIRS )
2018-09-15 21:59:47 +02:00
2019-02-06 17:32:10 +01:00
# find dependencies note: androiddeployqt seems to find only Qt libraries and plugins but misses other target_link_libraries
2019-11-30 17:58:56 +01:00
set ( ANDROID_APK_ADDITIONAL_LIBS
" "
C A C H E S T R I N G " a d d i t i o n a l l i b r a r i e s t o b e b u n d l e d i n t o t h e A n d r o i d A P K " )
2018-09-15 21:59:47 +02:00
set ( ANDROID_APK_EXTRA_LIBS "${ANDROID_APK_ADDITIONAL_LIBS}" )
2019-02-06 17:32:10 +01:00
function ( add_android_apk_extra_libs TARGET_NAME )
2018-09-15 21:59:47 +02:00
get_target_property ( ANDROID_APK_EXTRA_LIBS_FOR_TARGET ${ TARGET_NAME } LINK_LIBRARIES )
2019-02-06 17:32:10 +01:00
if ( NOT ANDROID_APK_EXTRA_LIBS_FOR_TARGET )
2018-09-15 21:59:47 +02:00
return ( )
2019-02-06 17:32:10 +01:00
endif ( )
foreach ( LIBRARY ${ ANDROID_APK_EXTRA_LIBS_FOR_TARGET } )
if ( TARGET "${LIBRARY}" )
2018-09-15 21:59:47 +02:00
list ( APPEND ANDROID_APK_EXTRA_LIBS "\$<TARGET_FILE:${LIBRARY}>" )
add_android_apk_extra_libs ( ${ LIBRARY } )
2019-02-06 17:32:10 +01:00
elseif ( EXISTS "${LIBRARY}" )
2018-09-15 21:59:47 +02:00
list ( APPEND ANDROID_APK_EXTRA_LIBS "${LIBRARY}" )
2019-02-06 17:32:10 +01:00
else ( )
2020-10-10 00:48:06 +02:00
message (
S T A T U S " U n a b l e t o f i n d l i b r a r y \ " $ { L I B R A R Y } \ " r e q u i r e d b y t a r g e t \ " $ { T A R G E T _ N A M E } \ " . T h e l i b r a r y i s l i k e l y "
" a p r i v a t e d e p e n d e n c y o f t h e t a r g e t a n d t h e r f o r e n o t v i s i b l e w i t h i n t h e c o n t e x t o f c r e a t i n g t h e "
" f i n a l a p p l i c a t i o n . R e l y i n g o n a n d r o i d d e p l o y q t f o r a d d i n g i t t o t h e A P K . " )
2019-02-06 17:32:10 +01:00
endif ( )
endforeach ( )
2019-11-30 17:58:56 +01:00
set ( ANDROID_APK_EXTRA_LIBS
" $ { A N D R O I D _ A P K _ E X T R A _ L I B S } "
P A R E N T _ S C O P E )
2019-02-06 17:32:10 +01:00
endfunction ( )
2019-04-22 22:27:00 +02:00
add_android_apk_extra_libs ( "${META_TARGET_NAME}" )
2019-11-30 17:58:56 +01:00
list_to_string ( "," "" "" "${ANDROID_APK_EXTRA_LIBS}" ANDROID_APK_EXTRA_LIBS )
2018-09-15 21:59:47 +02:00
2020-10-05 18:37:23 +02:00
# determine host architecture
# note: ANDROID_HOST_TAG is set supposed to be set by the NDK toolchain file. If not, fallback to CMake's CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG variable.
if ( NOT ANDROID_HOST_TAG )
set ( ANDROID_HOST_TAG "${CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG}" )
endif ( )
# determine Android architecture
# note: ANDROID_ABI is set supposed to be set by the NDK toolchain file. If not, fallback to CMake's CMAKE_ANDROID_ARCH_ABI variable.
if ( NOT ANDROID_ABI )
set ( ANDROID_ABI "${CMAKE_ANDROID_ARCH_ABI}" )
endif ( )
set ( ANDROID_APK_SYSROOT_NAME
" "
C A C H E S T R I N G " n a m e o f t h e s y s r o o t f o r m a k i n g A P K f i l e " )
if ( CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX MATCHES ".*/bin/(.*)-" )
set ( ANDROID_APK_SYSROOT_NAME "${CMAKE_MATCH_1}" )
else ( )
2020-10-10 00:48:06 +02:00
message (
F A T A L _ E R R O R
" U n a b l e t o s y s r o o t name ( for passing it to androiddeployqt ) . "
" P l e a s e s e t A N D R O I D _ A P K _ S Y S R O O T _ N A M E m a n u a l l y . R e l a t e d v a r i a b l e s : \ n "
" C M A K E _ C X X _ A N D R O I D _ T O O L C H A I N _ P R E F I X : $ { C M A K E _ C X X _ A N D R O I D _ T O O L C H A I N _ P R E F I X } " )
2020-10-05 18:37:23 +02:00
endif ( )
# set application binary
if ( Qt5Core_VERSION VERSION_LESS 5.14.0 )
set ( ANDROID_APK_APP_BINARY "\$<TARGET_FILE:${META_TARGET_NAME}>" )
else ( )
set ( ANDROID_APK_APP_BINARY "${META_TARGET_NAME}" )
endif ( )
2018-12-02 21:40:53 +01:00
# query certain qmake variables
2019-11-30 17:58:56 +01:00
foreach ( QMAKE_VARIABLE QT_INSTALL_QML QT_INSTALL_PLUGINS QT_INSTALL_IMPORTS )
2018-12-02 21:40:53 +01:00
query_qmake_variable ( ${ QMAKE_VARIABLE } )
2019-02-06 17:32:10 +01:00
endforeach ( )
2018-12-02 21:40:53 +01:00
# define function to get a list of (existing) paths
2019-02-06 17:32:10 +01:00
function ( compose_dirs_for_android_apk )
2018-12-02 21:40:53 +01:00
# parse arguments
set ( OPTIONAL_ARGS )
set ( ONE_VALUE_ARGS OUTPUT_VARIABLE )
set ( MULTI_VALUE_ARGS POSSIBLE_DIRS )
2019-11-30 17:58:56 +01:00
cmake_parse_arguments ( ARGS "${OPTIONAL_ARGS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ ARGN } )
2018-12-02 21:40:53 +01:00
list ( REMOVE_DUPLICATES ARGS_POSSIBLE_DIRS )
unset ( DIRS )
2019-02-06 17:32:10 +01:00
foreach ( POSSIBLE_DIR ${ ARGS_POSSIBLE_DIRS } )
if ( IS_DIRECTORY "${POSSIBLE_DIR}" )
2018-12-02 21:40:53 +01:00
list ( APPEND DIRS "${POSSIBLE_DIR}" )
2019-02-06 17:32:10 +01:00
endif ( )
endforeach ( )
2018-12-02 21:40:53 +01:00
2019-11-30 17:58:56 +01:00
list_to_string ( "," "" "" "${DIRS}" DIRS )
set ( "${ARGS_OUTPUT_VARIABLE}"
" $ { D I R S } "
P A R E N T _ S C O P E )
2019-02-06 17:32:10 +01:00
endfunction ( )
2018-12-02 21:40:53 +01:00
# pick QML import paths from install prefix
2019-11-30 17:58:56 +01:00
compose_dirs_for_android_apk (
O U T P U T _ V A R I A B L E
A N D R O I D _ A P K _ Q M L _ I M P O R T _ D I R S
P O S S I B L E _ D I R S
" $ { Q T _ I N S T A L L _ I M P O R T S } "
" $ { Q T _ I N S T A L L _ Q M L } "
2020-02-13 11:43:29 +01:00
" $ { C M A K E _ I N S T A L L _ F U L L _ L I B D I R } $ { S E L E C T E D _ L I B _ S U F F I X } / q t / i m p o r t s "
" $ { C M A K E _ I N S T A L L _ F U L L _ L I B D I R } $ { S E L E C T E D _ L I B _ S U F F I X } / i m p o r t s "
" $ { C M A K E _ I N S T A L L _ F U L L _ L I B D I R } $ { S E L E C T E D _ L I B _ S U F F I X } / q t / q m l "
" $ { C M A K E _ I N S T A L L _ F U L L _ L I B D I R } $ { S E L E C T E D _ L I B _ S U F F I X } / q m l " )
2019-02-06 17:32:10 +01:00
if ( NOT ANDROID_APK_QML_IMPORT_DIRS )
2018-12-02 21:40:53 +01:00
message ( WARNING "Unable to find QML import directories for making the APK." )
2019-02-06 17:32:10 +01:00
endif ( )
2018-12-02 21:40:53 +01:00
# pick extra plugins from install prefix
2020-03-08 13:51:36 +01:00
compose_dirs_for_android_apk (
O U T P U T _ V A R I A B L E A N D R O I D _ A P K _ E X T R A _ P L U G I N _ D I R S P O S S I B L E _ D I R S " $ { Q T _ I N S T A L L _ P L U G I N S } "
" $ { C M A K E _ I N S T A L L _ F U L L _ L I B D I R } $ { S E L E C T E D _ L I B _ S U F F I X } / q t / p l u g i n s "
" $ { C M A K E _ I N S T A L L _ F U L L _ L I B D I R } $ { S E L E C T E D _ L I B _ S U F F I X } / p l u g i n s " )
2019-02-06 17:32:10 +01:00
if ( NOT ANDROID_APK_EXTRA_PLUGIN_DIRS )
2018-12-02 21:40:53 +01:00
message ( WARNING "Unable to find extra plugin directories for making the APK." )
2019-02-06 17:32:10 +01:00
endif ( )
2018-12-02 21:40:53 +01:00
2018-09-15 21:59:47 +02:00
# find template for deployment JSON
find_template_file ( "android-deployment.json" QT_UTILITIES ANDROID_DEPLOYMENT_JSON_TEMPLATE_FILE )
set ( ANDROID_DEPLOYMENT_JSON_FILE "${CMAKE_CURRENT_BINARY_DIR}/android-deployment.json" )
2019-02-06 17:32:10 +01:00
configure_file ( "${ANDROID_DEPLOYMENT_JSON_TEMPLATE_FILE}" "${ANDROID_DEPLOYMENT_JSON_FILE}.configured" )
2019-11-30 17:58:56 +01:00
file (
G E N E R A T E
O U T P U T " $ { A N D R O I D _ D E P L O Y M E N T _ J S O N _ F I L E } "
I N P U T " $ { A N D R O I D _ D E P L O Y M E N T _ J S O N _ F I L E } . c o n f i g u r e d " )
2018-09-15 21:59:47 +02:00
# pass make arguments
if ( CMAKE_GENERATOR STREQUAL "Unix Makefiles" )
set ( MAKE_ARGUMENTS "\\$(ARGS)" )
2019-02-06 17:32:10 +01:00
endif ( )
2018-09-15 21:59:47 +02:00
# add rules to make APK
2018-12-02 21:38:56 +01:00
option ( ANDROID_APK_FORCE_DEBUG "specifies whether a debug APK should be created even when building in release mode" OFF )
2018-12-22 02:09:24 +01:00
if ( Qt5Core_VERSION VERSION_LESS 5.12.0 )
set ( ANDROID_APK_FILE_DIRECTORY "" )
2019-02-06 17:32:10 +01:00
else ( )
if ( ANDROID_APK_FORCE_DEBUG OR CMAKE_BUILD_TYPE STREQUAL "Debug" )
2018-12-22 02:09:24 +01:00
set ( ANDROID_APK_FILE_DIRECTORY "debug/" )
2019-02-06 17:32:10 +01:00
else ( )
2018-12-22 02:09:24 +01:00
set ( ANDROID_APK_FILE_DIRECTORY "release/" )
2019-02-06 17:32:10 +01:00
endif ( )
endif ( )
if ( ANDROID_APK_FORCE_DEBUG OR CMAKE_BUILD_TYPE STREQUAL "Debug" )
2018-12-22 02:09:24 +01:00
set ( ANDROID_APK_FILE_PATH "${ANDROID_APK_BUILD_DIR}/build/outputs/apk/${ANDROID_APK_FILE_DIRECTORY}apk-debug.apk" )
2018-09-15 21:59:47 +02:00
set ( ANDROID_APK_ADDITIONAL_ANDROIDDEPOYQT_OPTIONS )
2019-02-06 17:32:10 +01:00
else ( )
2018-09-15 21:59:47 +02:00
set ( ANDROID_APK_ADDITIONAL_ANDROIDDEPOYQT_OPTIONS --release )
2019-11-30 17:58:56 +01:00
set ( ANDROID_APK_KEYSTORE_URL
" "
C A C H E S T R I N G " k e y s t o r e U R L f o r s i g n i n g t h e A n d r o i d A P K " )
set ( ANDROID_APK_KEYSTORE_ALIAS
" "
C A C H E S T R I N G " k e y s t o r e a l i a s f o r s i g n i n g t h e A n d r o i d A P K " )
set ( ANDROID_APK_KEYSTORE_PASSWORD
" "
C A C H E S T R I N G " k e y s t o r e p a s s w o r d f o r s i g n i n g t h e A n d r o i d A P K " )
set ( ANDROID_APK_KEYSTORE_KEY_PASSWORD
" "
C A C H E S T R I N G " k e y s t o r e k e y p a s s w o r d f o r s i g n i n g t h e A n d r o i d A P K " )
2018-09-18 22:41:28 +02:00
2019-02-06 17:32:10 +01:00
if ( ANDROID_APK_KEYSTORE_URL AND ANDROID_APK_KEYSTORE_ALIAS )
set ( ANDROID_APK_FILE_PATH
" $ { A N D R O I D _ A P K _ B U I L D _ D I R } / b u i l d / o u t p u t s / a p k / $ { A N D R O I D _ A P K _ F I L E _ D I R E C T O R Y } a p k - r e l e a s e - s i g n e d . a p k " )
2019-11-30 17:58:56 +01:00
list ( APPEND ANDROID_APK_ADDITIONAL_ANDROIDDEPOYQT_OPTIONS --sign "${ANDROID_APK_KEYSTORE_URL}"
2020-03-08 13:51:36 +01:00
" $ { A N D R O I D _ A P K _ K E Y S T O R E _ A L I A S } " )
2019-02-06 17:32:10 +01:00
if ( ANDROID_APK_KEYSTORE_PASSWORD )
list ( APPEND ANDROID_APK_ADDITIONAL_ANDROIDDEPOYQT_OPTIONS --storepass "${ANDROID_APK_KEYSTORE_PASSWORD}" )
endif ( )
if ( ANDROID_APK_KEYSTORE_KEY_PASSWORD )
list ( APPEND ANDROID_APK_ADDITIONAL_ANDROIDDEPOYQT_OPTIONS --keypass "${ANDROID_APK_KEYSTORE_KEY_PASSWORD}" )
endif ( )
else ( )
set ( ANDROID_APK_FILE_PATH
" $ { A N D R O I D _ A P K _ B U I L D _ D I R } / b u i l d / o u t p u t s / a p k / $ { A N D R O I D _ A P K _ F I L E _ D I R E C T O R Y } a p k - r e l e a s e - u n s i g n e d . a p k " )
2018-09-18 22:41:28 +02:00
message ( WARNING "Set ANDROID_APK_KEYSTORE_URL/ANDROID_APK_KEYSTORE_ALIAS to sign Android APK release." )
2019-02-06 17:32:10 +01:00
endif ( )
2018-09-18 22:41:28 +02:00
2019-02-06 17:32:10 +01:00
endif ( )
2020-10-05 18:37:23 +02:00
if ( Qt5Core_VERSION VERSION_LESS 5.14.0 )
set ( ANDROID_APK_BINARY_PATH "${ANDROID_APK_BUILD_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}/lib${META_TARGET_NAME}.so" )
else ( )
# incorporate the ANDROID_ABI into the target name because androiddeployqt > 5.14 forces use to do so
set_target_properties ( ${ META_TARGET_NAME } PROPERTIES SUFFIX "_${ANDROID_ABI}.so" )
2020-10-10 00:48:06 +02:00
set ( ANDROID_APK_BINARY_PATH
" $ { A N D R O I D _ A P K _ B U I L D _ D I R } / l i b s / $ { C M A K E _ A N D R O I D _ A R C H _ A B I } / l i b $ { M E T A _ T A R G E T _ N A M E } _ $ { A N D R O I D _ A B I } . s o " )
2020-10-05 18:37:23 +02:00
endif ( )
2019-11-30 17:58:56 +01:00
add_custom_command (
O U T P U T " $ { A N D R O I D _ A P K _ B I N A R Y _ P A T H } "
C O M M A N D " $ { C M A K E _ C O M M A N D } " - E c o p y " $ < T A R G E T _ F I L E : $ { M E T A _ T A R G E T _ N A M E } > " " $ { A N D R O I D _ A P K _ B I N A R Y _ P A T H } "
C O M M E N T " P r e p a r i n g b u i l d d i r f o r A n d r o i d A P K "
2019-12-15 19:27:26 +01:00
D E P E N D S " $ { M E T A _ T A R G E T _ N A M E } "
C O M M A N D _ E X P A N D _ L I S T S V E R B A T I M )
2019-02-06 17:32:10 +01:00
add_custom_command (
O U T P U T " $ { A N D R O I D _ A P K _ F I L E _ P A T H } "
2019-11-30 17:58:56 +01:00
C O M M A N D r m - r " $ { A N D R O I D _ A P K _ B U I L D _ D I R } / a s s e t s / - - A d d e d - b y - a n d r o i d d e p l o y q t - - / l i b " | | t r u e
C O M M A N D
$ < T A R G E T _ F I L E _ D I R : Q t 5 : : q m a k e > / a n d r o i d d e p l o y q t - - g r a d l e - - i n p u t " $ { A N D R O I D _ D E P L O Y M E N T _ J S O N _ F I L E } " - - o u t p u t
" $ { A N D R O I D _ A P K _ B U I L D _ D I R } " - - d e p l o y m e n t b u n d l e d $ { M A K E _ A R G U M E N T S } - - v e r b o s e
$ { A N D R O I D _ A P K _ A D D I T I O N A L _ A N D R O I D D E P O Y Q T _ O P T I O N S }
2018-09-15 21:59:47 +02:00
W O R K I N G _ D I R E C T O R Y " $ { A N D R O I D _ A P K _ B U I L D _ D I R } "
C O M M E N T " C r e a t i n g A n d r o i d A P K $ { A N D R O I D _ A P K _ F I L E _ P A T H } u s i n g a n d r o i d d e p l o y q t "
2019-02-06 17:32:10 +01:00
D E P E N D S
2019-08-22 01:02:15 +02:00
" $ { A N D R O I D _ D E P L O Y M E N T _ J S O N _ F I L E } ; $ { A N D R O I D _ A P K _ B I N A R Y _ P A T H } ; $ { A N D R O I D _ S O U R C E _ D I R E C T O R Y _ F I L E S } ; $ { A N D R O I D _ A P K _ B I N A R Y _ D I R S _ D E P E N D S } "
2019-12-15 19:27:26 +01:00
C O M M A N D _ E X P A N D _ L I S T S V E R B A T I M )
2019-11-30 17:58:56 +01:00
add_custom_target (
" $ { M E T A _ T A R G E T _ N A M E } _ a p k "
C O M M E N T " A n d r o i d A P K "
D E P E N D S " $ { A N D R O I D _ A P K _ F I L E _ P A T H } " )
2019-02-06 17:32:10 +01:00
if ( NOT TARGET apk )
2018-09-15 21:59:47 +02:00
add_custom_target ( apk )
2019-02-06 17:32:10 +01:00
endif ( )
2019-04-22 22:27:00 +02:00
add_dependencies ( apk "${META_TARGET_NAME}_apk" )
2018-09-15 21:59:47 +02:00
# add install target for APK
2019-02-06 17:32:10 +01:00
if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
2018-09-15 21:59:47 +02:00
set ( ANDROID_APK_FINAL_NAME "${META_ID}-debug-${META_APP_VERSION}.apk" )
2019-02-06 17:32:10 +01:00
else ( )
2018-09-15 21:59:47 +02:00
set ( ANDROID_APK_FINAL_NAME "${META_ID}-${META_APP_VERSION}.apk" )
2019-02-06 17:32:10 +01:00
endif ( )
2019-11-30 17:58:56 +01:00
install (
F I L E S " $ { A N D R O I D _ A P K _ F I L E _ P A T H } "
D E S T I N A T I O N " s h a r e / a p k "
R E N A M E " $ { A N D R O I D _ A P K _ F I N A L _ N A M E } "
C O M P O N E N T a p k )
add_custom_target ( "${META_TARGET_NAME}_install_apk" COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=apk -P
" $ { C M A K E _ B I N A R Y _ D I R } / c m a k e _ i n s t a l l . c m a k e " )
2019-05-04 20:59:19 +02:00
add_dependencies ( "${META_TARGET_NAME}_install_apk" "${META_TARGET_NAME}_apk" )
2019-02-06 17:32:10 +01:00
if ( NOT TARGET install-apk )
2018-09-15 21:59:47 +02:00
add_custom_target ( install-apk )
2019-02-06 17:32:10 +01:00
endif ( )
2019-04-22 22:27:00 +02:00
add_dependencies ( install-apk "${META_TARGET_NAME}_install_apk" )
2018-09-15 21:59:47 +02:00
# add deploy target for APK
find_program ( ADB_BIN adb )
2019-11-30 17:58:56 +01:00
add_custom_target (
" $ { M E T A _ T A R G E T _ N A M E } _ d e p l o y _ a p k "
C O M M A N D " $ { A D B _ B I N } " i n s t a l l - r " $ { A N D R O I D _ A P K _ F I L E _ P A T H } "
C O M M E N T " D e p l o y i n g A n d r o i d A P K "
D E P E N D S " $ { A N D R O I D _ A P K _ F I L E _ P A T H } " )
2018-09-15 21:59:47 +02:00
set ( ANDROID_APK_CONFIGURED YES )