APK: Handle Qt being configured with custom paths

This commit is contained in:
Martchus 2018-12-02 21:40:53 +01:00
parent 0bee777a04
commit e7b3ec67c5
3 changed files with 72 additions and 2 deletions

View File

@ -115,6 +115,62 @@ endfunction()
add_android_apk_extra_libs("${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}")
list_to_string("," "" "" "${ANDROID_APK_EXTRA_LIBS}" ANDROID_APK_EXTRA_LIBS)
# query certain qmake variables
foreach(QMAKE_VARIABLE QT_INSTALL_QML QT_INSTALL_PLUGINS QT_INSTALL_IMPORTS)
query_qmake_variable(${QMAKE_VARIABLE})
endforeach()
# define function to get a list of (existing) paths
function(compose_dirs_for_android_apk)
# parse arguments
set(OPTIONAL_ARGS)
set(ONE_VALUE_ARGS OUTPUT_VARIABLE)
set(MULTI_VALUE_ARGS POSSIBLE_DIRS)
cmake_parse_arguments(ARGS "${OPTIONAL_ARGS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN})
list(REMOVE_DUPLICATES ARGS_POSSIBLE_DIRS)
unset(DIRS)
foreach(POSSIBLE_DIR ${ARGS_POSSIBLE_DIRS})
if(IS_DIRECTORY "${POSSIBLE_DIR}")
list(APPEND DIRS "${POSSIBLE_DIR}")
endif()
endforeach()
list_to_string("," "" "" "${DIRS}" DIRS)
set("${ARGS_OUTPUT_VARIABLE}" "${DIRS}" PARENT_SCOPE)
endfunction()
# pick QML import paths from install prefix
compose_dirs_for_android_apk(
OUTPUT_VARIABLE ANDROID_APK_QML_IMPORT_DIRS
POSSIBLE_DIRS
"${QT_INSTALL_IMPORTS}"
"${QT_INSTALL_QML}"
"${CMAKE_INSTALL_PREFIX}/lib/qt/imports"
"${CMAKE_INSTALL_PREFIX}/lib/imports"
"${CMAKE_INSTALL_PREFIX}/lib/qt/qml"
"${CMAKE_INSTALL_PREFIX}/lib/qml"
)
if(NOT ANDROID_APK_QML_IMPORT_DIRS)
message(WARNING "Unable to find QML import directories for making the APK.")
endif()
# pick extra plugins from install prefix
compose_dirs_for_android_apk(
OUTPUT_VARIABLE ANDROID_APK_EXTRA_PLUGIN_DIRS
POSSIBLE_DIRS
"${QT_INSTALL_PLUGINS}"
"${QT_INSTALL_QML}"
"${CMAKE_INSTALL_PREFIX}/lib/qt/plugins"
"${CMAKE_INSTALL_PREFIX}/lib/plugins"
"${CMAKE_INSTALL_PREFIX}/lib/qt/qml"
"${CMAKE_INSTALL_PREFIX}/lib/qml"
"${CMAKE_INSTALL_PREFIX}/share"
)
if(NOT ANDROID_APK_EXTRA_PLUGIN_DIRS)
message(WARNING "Unable to find extra plugin directories for making the APK.")
endif()
# 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")

View File

@ -109,5 +109,19 @@ if(NOT DEFINED QT_LINKAGE_DETERMINED)
endif()
endmacro()
macro(query_qmake_variable QMAKE_VARIABLE)
get_target_property(QMAKE_BIN Qt5::qmake IMPORTED_LOCATION)
execute_process(
COMMAND "${QMAKE_BIN}" -query "${QMAKE_VARIABLE}"
RESULT_VARIABLE "${QMAKE_VARIABLE}_RESULT"
OUTPUT_VARIABLE "${QMAKE_VARIABLE}"
)
if(NOT "${${QMAKE_VARIABLE}_RESULT}" STREQUAL 0 OR "${${QMAKE_VARIABLE}}" STREQUAL "")
message(FATAL_ERROR "Unable to read qmake variable ${QMAKE_VARIABLE} via \"${QMAKE_BIN} -query ${QMAKE_VARIABLE}\"; output was \"${${QMAKE_VARIABLE}}\".")
endif()
string(REGEX REPLACE "\n$" "" "${QMAKE_VARIABLE}" "${${QMAKE_VARIABLE}}")
message(STATUS "qmake variable ${QMAKE_VARIABLE} is ${${QMAKE_VARIABLE}}")
endmacro()
set(QT_LINKAGE_DETERMINED YES)
endif(NOT DEFINED QT_LINKAGE_DETERMINED)

View File

@ -9,9 +9,9 @@
"target-architecture": "@CMAKE_ANDROID_ARCH_ABI@",
"application-binary": "$<TARGET_FILE:@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@>",
"qml-root-path": "@CMAKE_CURRENT_SOURCE_DIR@",
"qml-import-paths": "@CMAKE_INSTALL_PREFIX@/lib/qml",
"qml-import-paths": "@ANDROID_APK_QML_IMPORT_DIRS@",
"android-extra-libs": "@ANDROID_APK_EXTRA_LIBS@",
"android-extra-plugins": "@CMAKE_INSTALL_PREFIX@/share,@CMAKE_INSTALL_PREFIX@/lib/qml",
"android-extra-plugins": "@ANDROID_APK_EXTRA_PLUGIN_DIRS@",
"android-package-source-directory": "@ANDROID_APK_SUBDIR@",
"stdcpp-path":"@ANDROID_APK_CXX_STANDARD_LIBRARY@",
"sdkBuildToolsRevision": "@ANDROID_APK_BUILD_TOOLS_VERSION@",