From d3bbbf345af6f0cd5510c94052a2f3e4074b6be9 Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Thu, 9 Jun 2022 13:13:49 +0200 Subject: [PATCH] androiddeployqt: Only pass qt_install_dir/qml directory if it exists In Conan's case, the qtbase installed package directory lacks a qml directory. We pass that as a valid qml import path via CMake -> deployment json file -> androiddeployqt -> qmlimportscanner which causes the qmlimportscanner to fail with qmlimportscanner: No such file or directory: "~/package/some_sha_1/qml" Invalid json output from qmlimportscanner. which in turn fails the androiddeploqt build step. Make sure to only pass qtbase_install_dir/qml if it actually exists. Amends 4ef3da04c3390f02bcb0507128372e6a299dc8fd Amends c08b9a49ba70b1cbb0704668dd3f2c487d7f585e Fixes: QTBUG-104056 Task-number: QTBUG-88519 Task-number: QTBUG-89588 Change-Id: I4310eb4e265ae8d3e3f09e1e1dbed79210e23de6 Reviewed-by: Alexey Edelev Reviewed-by: Qt CI Bot (cherry picked from commit 0c82f98ec5c0135f3789f0f9c5e30978698ddff9) Reviewed-by: Qt Cherry-pick Bot --- src/tools/androiddeployqt/main.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/tools/androiddeployqt/main.cpp b/src/tools/androiddeployqt/main.cpp index dbb4bbd24e3..14a91540692 100644 --- a/src/tools/androiddeployqt/main.cpp +++ b/src/tools/androiddeployqt/main.cpp @@ -1946,12 +1946,22 @@ bool scanImports(Options *options, QSet *usedDependencies) } QStringList importPaths; - importPaths += shellQuote(options->qtInstallDirectory + "/qml"_L1); + // In Conan's case, qtInstallDirectory will point only to qtbase installed files, which + // lacks a qml directory. We don't want to pass it as an import path if it doesn't exist + // because it will cause qmlimportscanner to fail. + // This also covers the case when only qtbase is installed in a regular Qt build. + const QString mainImportPath = options->qtInstallDirectory + "/qml"_L1; + if (QDir().exists(mainImportPath)) + importPaths += shellQuote(mainImportPath); + + // These are usually provided by CMake in the deployment json file from paths specified + // in CMAKE_FIND_ROOT_PATH. They might not have qml modules. for (const QString &prefix : options->extraPrefixDirs) if (QDir().exists(prefix + "/qml"_L1)) importPaths += shellQuote(prefix + "/qml"_L1); + // These are provided by both CMake and qmake. for (const QString &qmlImportPath : qAsConst(options->qmlImportPaths)) { if (QDir().exists(qmlImportPath)) { importPaths += shellQuote(qmlImportPath);