diff options
author | Craig Scott <craig.scott@qt.io> | 2021-07-19 21:40:14 +1000 |
---|---|---|
committer | Craig Scott <craig.scott@qt.io> | 2021-07-20 16:33:48 +1000 |
commit | 0c99c17761c89290d88e97367742122db5c9a46f (patch) | |
tree | df889b3369d61828407d66a60b275251eab00ae1 | |
parent | 4e18e7d377c56d41c1d6f3cf9be37f1af94cd1b1 (diff) |
CMake: Change the default of OUTPUT_DIRECTORY for qt6_add_qml_module()
The new default is now controlled via a new QT_QML_OUTPUT_DIRECTORY
variable. If that isn't set, the fallback assumes the source directory
structure follows the URI structure and uses
${CMAKE_CURRENT_BINARY_DIR} instead. This pattern means more projects
will have working import paths for qmllint and possibly other tools
out of the box. There should also be fewer cases where the
OUTPUT_DIRECTORY option needs to be used in calls to
qt6_add_qml_module(). The QT_QML_OUTPUT_DIRECTORY variable facilitates
the scenario where QML modules might be distributed across different
parts of the source directory hierarchy, but once collected under a
common base point defined by QT_QML_OUTPUT_DIRECTORY, they form a
coherent set of QML modules whose subdirectory structure below that
base point follows their TARGET_PATH.
Fixes: QTBUG-94164
Fixes: QTBUG-95081
Pick-to: 6.2
Change-Id: I82864c361a2b34f7f1484cdbda0d9b64b34b9950
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
9 files changed, 40 insertions, 7 deletions
diff --git a/examples/qml/qmlextensionplugins/CMakeLists.txt b/examples/qml/qmlextensionplugins/CMakeLists.txt index dcfde4a8ae..6ea73f83a4 100644 --- a/examples/qml/qmlextensionplugins/CMakeLists.txt +++ b/examples/qml/qmlextensionplugins/CMakeLists.txt @@ -14,6 +14,7 @@ if(NOT DEFINED INSTALL_EXAMPLESDIR) endif() set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/qml/qmlextensionplugins/imports/TimeExample") +set(QT_QML_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/examples/qml/qmlextensionplugins/imports) find_package(Qt6 COMPONENTS Core) find_package(Qt6 COMPONENTS Gui) @@ -23,7 +24,6 @@ set_source_files_properties(imports/TimeExample/Clock.qml PROPERTIES QT_RESOURCE_ALIAS Clock.qml ) qt6_add_qml_module(qmlqtimeexample - OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/imports/TimeExample" VERSION 1.0 URI "TimeExample" SOURCES timemodel.cpp timemodel.h diff --git a/examples/qml/tutorials/extending-qml/chapter6-plugins/CMakeLists.txt b/examples/qml/tutorials/extending-qml/chapter6-plugins/CMakeLists.txt index 1c19c84caa..59ecdeae6b 100644 --- a/examples/qml/tutorials/extending-qml/chapter6-plugins/CMakeLists.txt +++ b/examples/qml/tutorials/extending-qml/chapter6-plugins/CMakeLists.txt @@ -14,6 +14,7 @@ if(NOT DEFINED INSTALL_EXAMPLESDIR) endif() set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/qml/tutorials/extending-qml/chapter6-plugins") +set(QT_QML_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) find_package(Qt6 COMPONENTS Qml) find_package(Qt6 COMPONENTS Quick) diff --git a/examples/qml/tutorials/extending-qml/chapter6-plugins/import/CMakeLists.txt b/examples/qml/tutorials/extending-qml/chapter6-plugins/import/CMakeLists.txt index f75028aa69..93ec5c5169 100644 --- a/examples/qml/tutorials/extending-qml/chapter6-plugins/import/CMakeLists.txt +++ b/examples/qml/tutorials/extending-qml/chapter6-plugins/import/CMakeLists.txt @@ -21,7 +21,6 @@ find_package(Qt6 COMPONENTS Qml) find_package(Qt6 COMPONENTS Quick) qt6_add_qml_module(chartsplugin - OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../Charts" VERSION 1.0 URI "Charts" PLUGIN_TARGET chartsplugin diff --git a/examples/qmltest/qmltest/CMakeLists.txt b/examples/qmltest/qmltest/CMakeLists.txt index c8a8361578..369e31fe7d 100644 --- a/examples/qmltest/qmltest/CMakeLists.txt +++ b/examples/qmltest/qmltest/CMakeLists.txt @@ -14,6 +14,7 @@ if(NOT DEFINED INSTALL_EXAMPLESDIR) endif() set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}") +set(QT_QML_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/examples) find_package(Qt6 COMPONENTS Core) find_package(Qt6 COMPONENTS Gui) diff --git a/examples/quick/customitems/painteditem/CMakeLists.txt b/examples/quick/customitems/painteditem/CMakeLists.txt index fa964778d0..09f3424f15 100644 --- a/examples/quick/customitems/painteditem/CMakeLists.txt +++ b/examples/quick/customitems/painteditem/CMakeLists.txt @@ -14,6 +14,7 @@ if(NOT DEFINED INSTALL_EXAMPLESDIR) endif() set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/quick/customitems/painteditem/TextBalloonPlugin") +set(QT_QML_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/examples/quick/customitems/painteditem) find_package(Qt6 COMPONENTS Core) find_package(Qt6 COMPONENTS Gui) @@ -21,7 +22,6 @@ find_package(Qt6 COMPONENTS Qml) find_package(Qt6 COMPONENTS Quick) qt6_add_qml_module(qmltextballoonplugin - OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/TextBalloonPlugin" VERSION 1.0 URI "TextBalloonPlugin" PLUGIN_TARGET qmltextballoonplugin diff --git a/examples/quick/imageprovider/CMakeLists.txt b/examples/quick/imageprovider/CMakeLists.txt index 5a25a45deb..82e1bd2a51 100644 --- a/examples/quick/imageprovider/CMakeLists.txt +++ b/examples/quick/imageprovider/CMakeLists.txt @@ -14,6 +14,7 @@ if(NOT DEFINED INSTALL_EXAMPLESDIR) endif() set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/quick/imageprovider/ImageProviderCore") +set(QT_QML_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/examples/quick/imageprovider) find_package(Qt6 COMPONENTS Core) find_package(Qt6 COMPONENTS Gui) @@ -21,7 +22,6 @@ find_package(Qt6 COMPONENTS Qml) find_package(Qt6 COMPONENTS Quick) qt6_add_qml_module(qmlimageproviderplugin - OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/ImageProviderCore" VERSION 1.0 URI "ImageProviderCore" PLUGIN_TARGET qmlimageproviderplugin diff --git a/examples/quick/imageresponseprovider/CMakeLists.txt b/examples/quick/imageresponseprovider/CMakeLists.txt index 551ce01197..47dbab159d 100644 --- a/examples/quick/imageresponseprovider/CMakeLists.txt +++ b/examples/quick/imageresponseprovider/CMakeLists.txt @@ -14,6 +14,7 @@ if(NOT DEFINED INSTALL_EXAMPLESDIR) endif() set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/quick/imageresponseprovider/ImageResponseProviderCore") +set(QT_QML_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/examples/quick/imageresponseprovider) find_package(Qt6 COMPONENTS Core) find_package(Qt6 COMPONENTS Gui) @@ -21,7 +22,6 @@ find_package(Qt6 COMPONENTS Qml) find_package(Qt6 COMPONENTS Quick) qt6_add_qml_module(qmlimageresponseproviderplugin - OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/ImageResponseProviderCore" VERSION 1.0 URI "ImageResponseProviderCore" PLUGIN_TARGET qmlimageresponseproviderplugin diff --git a/src/qml/Qt6QmlBuildInternals.cmake b/src/qml/Qt6QmlBuildInternals.cmake index 3c1ecab69a..191fa690f5 100644 --- a/src/qml/Qt6QmlBuildInternals.cmake +++ b/src/qml/Qt6QmlBuildInternals.cmake @@ -105,11 +105,12 @@ function(qt_internal_add_qml_module target) ${ARGN} ) + set(QT_QML_OUTPUT_DIRECTORY "${QT_BUILD_DIR}/${INSTALL_QMLDIR}") if(NOT arg_TARGET_PATH) string(REPLACE "." "/" arg_TARGET_PATH ${arg_URI}) endif() if(NOT arg_OUTPUT_DIRECTORY) - set(arg_OUTPUT_DIRECTORY "${QT_BUILD_DIR}/${INSTALL_QMLDIR}/${arg_TARGET_PATH}") + set(arg_OUTPUT_DIRECTORY "${QT_QML_OUTPUT_DIRECTORY}/${arg_TARGET_PATH}") endif() if(NOT arg_INSTALL_DIRECTORY) set(arg_INSTALL_DIRECTORY "${INSTALL_QMLDIR}/${arg_TARGET_PATH}") diff --git a/src/qml/Qt6QmlMacros.cmake b/src/qml/Qt6QmlMacros.cmake index 24a88737ee..2ee1680993 100644 --- a/src/qml/Qt6QmlMacros.cmake +++ b/src/qml/Qt6QmlMacros.cmake @@ -281,7 +281,17 @@ function(qt6_add_qml_module target) ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}" ) else() - set(arg_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + if("${QT_QML_OUTPUT_DIRECTORY}" STREQUAL "") + set(arg_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + else() + if(NOT IS_ABSOLUTE "${QT_QML_OUTPUT_DIRECTORY}") + message(FATAL_ERROR + "QT_QML_OUTPUT_DIRECTORY must be an absolute path, but given: " + "${QT_QML_OUTPUT_DIRECTORY}" + ) + endif() + set(arg_OUTPUT_DIRECTORY ${QT_QML_OUTPUT_DIRECTORY}/${arg_TARGET_PATH}) + endif() endif() # TODO: Support for old keyword, remove once all repos no longer use CLASSNAME @@ -595,6 +605,13 @@ function(_qt_internal_target_enable_qmllint target) _qt_generated_qrc_files "--resource$<SEMICOLON>" "$<SEMICOLON>" ) + # Facilitate self-import so it can find the qmldir file + list(APPEND import_args -I "${CMAKE_CURRENT_BINARY_DIR}") + + if(NOT "${QT_QML_OUTPUT_DIRECTORY}" STREQUAL "") + list(APPEND import_args -I "${QT_QML_OUTPUT_DIRECTORY}") + endif() + set(cmd ${QT_TOOL_COMMAND_WRAPPER_PATH} ${QT_CMAKE_EXPORT_NAMESPACE}::qmllint @@ -929,6 +946,10 @@ function(qt6_add_qml_plugin target) _qt_internal_get_escaped_uri("${arg_URI}" escaped_uri) if(TARGET ${target}) + get_target_property(target_type ${target} TYPE) + if(target_type STREQUAL "EXECUTABLE") + message(FATAL_ERROR "Plugins cannot be executables (target: ${target})") + endif() foreach(arg IN ITEMS STATIC SHARED) if(arg_${arg}) message(FATAL_ERROR @@ -1018,6 +1039,8 @@ function(qt6_add_qml_plugin target) endif() if(arg_OUTPUT_DIRECTORY) + # Plugin target must be in the output directory. The backing target, + # if it is different to the plugin target, can be anywhere. set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} LIBRARY_OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} @@ -1789,10 +1812,18 @@ but this file does not exist. Possible reasons include: -importPath "${qml_path}" ) get_target_property(qml_import_path ${target} QT_QML_IMPORT_PATH) + if (qml_import_path) list(APPEND cmd_args ${qml_import_path}) endif() + # Facilitate self-import so we can find the qmldir file + list(APPEND cmd_args "${CMAKE_CURRENT_BINARY_DIR}") + + if(NOT "${QT_QML_OUTPUT_DIRECTORY}" STREQUAL "" AND EXISTS "${QT_QML_OUTPUT_DIRECTORY}") + list(APPEND cmd_args "${QT_QML_OUTPUT_DIRECTORY}") + endif() + get_target_property(qml_files ${target} QT_QML_MODULE_FILES) if (qml_files) list(APPEND cmd_args "-qmlFiles" ${qml_files}) |