Description
Describe the bug
The qtbase package includes a QtInstallPaths.cmake, where the relative path to the Qt plugins directory is hard coded to "Qt6/plugins". But this is only correct for the release configuration of Qt. In the debug configuration the plugins are instead located at "debug/Qt6/plugins". This results in an incorrect evaluated install path for the Qt plugins when running the generic Qt deploy tool via the cmake API in linux.
Environment
- OS: Ubuntu 22.04.5 LTS running in WSL on Windows 10
To Reproduce
Steps to reproduce the behavior:
- download the attached files into any folder
- remove the .txt extension from main.h and main.cpp (.h and .cpp files could not be uploaded)
- change toolchainFile in CMakePresets.json according to your vcpkg installation
- run "cmake --preset=linux-x64-dynamic-debug"
- run "cmake --build --preset=linux-x64-dynamic-debug --target install"
- inspect the installed directory structure
Expected behavior
The plugins should be installed to "install/x64-dynamic-debug/plugins" but are actually installed to "install/debug/Qt6/plugins".
Failure logs
none
Additional context
Instead of deploying to "install/plugins" (just like it deploys .so files to "install/lib"), the plugins are deployed to "install/plugins/../../debug/Qt6/plugins". I have traced this down to the _qt_internal_generic_deployqt function, which is defined in Qt6CoreDeploySupport.cmake. In this function, the install path for a plugin file is constructed by determining its relative path to "Qt6/plugins". But since the debug version of the plugin file is specified, the
constructed path is not relative to a file within "Qt6/plugins" as intended. Instead, it leaves the scope of "Qt6/plugins", to reach the actual file in "../../debug/Qt6/plugins".
In _qt_internal_generic_deployqt, the path "Qt6/plugins" is contained in __QT_DEPLOY_QT_INSTALL_PLUGINS. This variable is set in the QtDeploySupport.cmake, which is contained in the .qt folder of the cmake build directory. I have figured out, that this is an auto generated script, which is written by the _qt_internal_setup_deploy_support function defined in Qt6CoreMacros.cmake. Here, the value of the variable QT6_INSTALL_PLUGINS is used to set __QT_DEPLOY_QT_INSTALL_PLUGINS. And the value for QT6_INSTALL_PLUGINS is set in QtInstallPaths.cmake as mentioned.
So I think the different locations for debug and release configuration should be respected in QtInstallPaths.cmake.
Here are the paths of the mentioned files for investigation:
vcpkg_installed\x64-linux-dynamic\share\Qt6\QtInstallPaths.cmake
vcpkg_installed\x64-linux-dynamic\share\Qt6Core\Qt6CoreDeploySupport.cmake
vcpkg_installed\x64-linux-dynamic\share\Qt6Core\Qt6CoreMacros.cmake
build.qt\QtDeploySupport.cmake
I have also found a dirty hack to work around this issue. You can manually overwrite the internal __QT_DEPLOY_QT_INSTALL_PLUGINS variable to use the correct path:
qt_generate_deploy_script(
TARGET ${TARGET_FILE}
OUTPUT_SCRIPT DEPLOY_SCRIPT
CONTENT "
set(__QT_DEPLOY_QT_INSTALL_PLUGINS "debug/Qt6/plugins")
qt_deploy_runtime_dependencies(
EXECUTABLE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<TARGET_FILE_NAME:${TARGET_FILE}>"
)")
Activity