summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmake/QtBaseGlobalTargets.cmake1
-rw-r--r--cmake/QtBuild.cmake1
-rw-r--r--cmake/QtDeferredDependenciesHelpers.cmake28
-rw-r--r--cmake/QtDocsHelpers.cmake21
4 files changed, 51 insertions, 0 deletions
diff --git a/cmake/QtBaseGlobalTargets.cmake b/cmake/QtBaseGlobalTargets.cmake
index d11e8ed9b9..ae1fc89a5b 100644
--- a/cmake/QtBaseGlobalTargets.cmake
+++ b/cmake/QtBaseGlobalTargets.cmake
@@ -158,6 +158,7 @@ qt_copy_or_install(FILES
cmake/QtCompilerFlags.cmake
cmake/QtCompilerOptimization.cmake
cmake/QtConfigDependencies.cmake.in
+ cmake/QtDeferredDependenciesHelpers.cmake
cmake/QtDbusHelpers.cmake
cmake/QtDocsHelpers.cmake
cmake/QtExecutableHelpers.cmake
diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake
index bd186c28b9..209a0bf9c2 100644
--- a/cmake/QtBuild.cmake
+++ b/cmake/QtBuild.cmake
@@ -458,6 +458,7 @@ include(QtAppHelpers)
include(QtAutogenHelpers)
include(QtCMakeHelpers)
include(QtCompatibilityHelpers)
+include(QtDeferredDependenciesHelpers)
include(QtDbusHelpers)
include(QtDocsHelpers)
include(QtExecutableHelpers)
diff --git a/cmake/QtDeferredDependenciesHelpers.cmake b/cmake/QtDeferredDependenciesHelpers.cmake
new file mode 100644
index 0000000000..f4ae96ca92
--- /dev/null
+++ b/cmake/QtDeferredDependenciesHelpers.cmake
@@ -0,0 +1,28 @@
+# Defers the connection 'dependent' -> 'dependency'
+#
+# The actual connection can be made by calling qt_internal_add_deferred_dependencies.
+#
+function(qt_internal_defer_dependency dependent dependency)
+ set_property(GLOBAL APPEND PROPERTY QT_DEFERRED_DEPENDENCIES ${doc_target} ${tool_target})
+endfunction()
+
+# Adds dependencies between targets that have been deferred by calling qt_internal_defer_dependency.
+#
+# This function checks whether the connection can be made (the dependency target exists).
+# If the connection cannot be made, the deferred connection is left in the global property.
+# Potentially, some later call to qt_internal_add_deferred_dependencies will add it.
+#
+function(qt_internal_add_deferred_dependencies)
+ unset(unknown_deps)
+ get_property(deferred_deps GLOBAL PROPERTY QT_DEFERRED_DEPENDENCIES)
+ while(deferred_deps)
+ list(POP_FRONT deferred_deps dependent)
+ list(POP_FRONT deferred_deps dependency)
+ if (TARGET ${dependency})
+ add_dependencies(${dependent} ${dependency})
+ else()
+ list(APPEND unknown_deps ${dependent} ${dependency})
+ endif()
+ endwhile()
+ set_property(GLOBAL PROPERTY QT_DEFERRED_DEPENDENCIES ${unknown_deps})
+endfunction()
diff --git a/cmake/QtDocsHelpers.cmake b/cmake/QtDocsHelpers.cmake
index 2a90c61f10..0b455d5ed5 100644
--- a/cmake/QtDocsHelpers.cmake
+++ b/cmake/QtDocsHelpers.cmake
@@ -1,3 +1,18 @@
+# This function adds a dependency between a doc-generating target like 'generate_docs_Gui'
+# and the necessary tool target like 'qdoc'.
+#
+# If the target is not yet existing, save the dependency connection in a global property.
+# The dependency is then added near the end of the top-level build after all subdirectories have
+# been handled.
+function(qt_internal_add_doc_tool_dependency doc_target tool_name)
+ qt_get_tool_target_name(tool_target ${tool_name})
+ if(TARGET ${tool_target})
+ add_dependencies(${doc_target} ${tool_target})
+ else()
+ qt_internal_defer_dependency(${doc_target} ${tool_target})
+ endif()
+endfunction()
+
function(qt_internal_add_docs)
if(${ARGC} EQUAL 1)
# Function called from old generated CMakeLists.txt that was missing the target parameter
@@ -193,4 +208,10 @@ function(qt_internal_add_docs)
add_dependencies(${qt_docs_install_html_target_name} install_html_docs_${target})
add_dependencies(${qt_docs_install_qch_target_name} install_qch_docs_${target})
add_dependencies(${qt_docs_install_target_name} install_docs_${target})
+
+ # Make sure that the necessary tools are built when running,
+ # for example 'cmake --build . --target generate_docs'.
+ qt_internal_add_doc_tool_dependency(qattributionsscanner_${target} qtattributionsscanner)
+ qt_internal_add_doc_tool_dependency(prepare_docs_${target} qdoc)
+ qt_internal_add_doc_tool_dependency(qch_docs_${target} qhelpgenerator)
endfunction()