From e7b3ec67c5aa73eac0e3e5879afe389e5fbc2521 Mon Sep 17 00:00:00 2001 From: Martchus Date: Sun, 2 Dec 2018 21:40:53 +0100 Subject: [PATCH] APK: Handle Qt being configured with custom paths --- cmake/modules/AndroidApk.cmake | 56 ++++++++++++++++++++++ cmake/modules/QtLinkage.cmake | 14 ++++++ cmake/templates/android-deployment.json.in | 4 +- 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/cmake/modules/AndroidApk.cmake b/cmake/modules/AndroidApk.cmake index 2f8c26f..16d12f0 100644 --- a/cmake/modules/AndroidApk.cmake +++ b/cmake/modules/AndroidApk.cmake @@ -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") diff --git a/cmake/modules/QtLinkage.cmake b/cmake/modules/QtLinkage.cmake index 5b91845..1da9534 100644 --- a/cmake/modules/QtLinkage.cmake +++ b/cmake/modules/QtLinkage.cmake @@ -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) diff --git a/cmake/templates/android-deployment.json.in b/cmake/templates/android-deployment.json.in index 95d67f9..dee8267 100644 --- a/cmake/templates/android-deployment.json.in +++ b/cmake/templates/android-deployment.json.in @@ -9,9 +9,9 @@ "target-architecture": "@CMAKE_ANDROID_ARCH_ABI@", "application-binary": "$", "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@",