aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCraig Scott <craig.scott@qt.io>2021-07-19 21:40:14 +1000
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-07-20 08:37:49 +0000
commitd85171a41355b0e26355627db140fbee3fc541b2 (patch)
tree3d6c40380a9e9fcf4b2fcc5e52bee72d668f1d36
parent6c524e3b9e84efa6c4faad5986146fd0870a3625 (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 Change-Id: I82864c361a2b34f7f1484cdbda0d9b64b34b9950 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> (cherry picked from commit 0c99c17761c89290d88e97367742122db5c9a46f) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--examples/qml/qmlextensionplugins/CMakeLists.txt2
-rw-r--r--examples/qml/tutorials/extending-qml/chapter6-plugins/CMakeLists.txt1
-rw-r--r--examples/qml/tutorials/extending-qml/chapter6-plugins/import/CMakeLists.txt1
-rw-r--r--examples/qmltest/qmltest/CMakeLists.txt1
-rw-r--r--examples/quick/customitems/painteditem/CMakeLists.txt2
-rw-r--r--examples/quick/imageprovider/CMakeLists.txt2
-rw-r--r--examples/quick/imageresponseprovider/CMakeLists.txt2
-rw-r--r--src/qml/Qt6QmlBuildInternals.cmake3
-rw-r--r--src/qml/Qt6QmlMacros.cmake33
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})