diff --git a/cmake/QtBaseGlobalTargets.cmake b/cmake/QtBaseGlobalTargets.cmake index 54891f92068..09f1a4de6b5 100644 --- a/cmake/QtBaseGlobalTargets.cmake +++ b/cmake/QtBaseGlobalTargets.cmake @@ -225,6 +225,7 @@ qt_copy_or_install(FILES cmake/QtSeparateDebugInfo.cmake cmake/QtSetup.cmake cmake/QtSimdHelpers.cmake + cmake/QtSingleRepoTargetSetBuildHelpers.cmake cmake/QtStandaloneTestsConfig.cmake.in cmake/QtSyncQtHelpers.cmake cmake/QtTargetHelpers.cmake diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake index d246685952e..49c874575cb 100644 --- a/cmake/QtBuild.cmake +++ b/cmake/QtBuild.cmake @@ -534,6 +534,7 @@ include(QtRpathHelpers) include(QtSanitizerHelpers) include(QtScopeFinalizerHelpers) include(QtSimdHelpers) +include(QtSingleRepoTargetSetBuildHelpers) include(QtSyncQtHelpers) include(QtTargetHelpers) include(QtTestHelpers) diff --git a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake index 4928573349f..a173c0bcbc9 100644 --- a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake +++ b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake @@ -324,6 +324,50 @@ macro(qt_prepare_standalone_project) qt_enable_cmake_languages() endmacro() +# Define a repo target set, and store accompanying information. +# +# A repo target set is a subset of targets in a Qt module repository. To build a repo target set, +# set QT_BUILD_SINGLE_REPO_TARGET_SET to the name of the repo target set. +# +# This function is to be called in the top-level project file of a repository, +# before qt_internal_prepare_single_repo_target_set_build() +# +# This function stores information in variables of the parent scope. +# +# Positional Arguments: +# name - The name of this repo target set. +# +# Named Arguments: +# DEPENDS - List of Qt6 COMPONENTS that are build dependencies of this repo target set. +function(qt_internal_define_repo_target_set name) + set(oneValueArgs DEPENDS) + set(prefix QT_REPO_TARGET_SET_) + cmake_parse_arguments(${prefix}${name} "" ${oneValueArgs} "" ${ARGN}) + foreach(arg IN LISTS oneValueArgs) + set(${prefix}${name}_${arg} ${${prefix}${name}_${arg}} PARENT_SCOPE) + endforeach() + set(QT_REPO_KNOWN_TARGET_SETS "${QT_REPO_KNOWN_TARGET_SETS};${name}" PARENT_SCOPE) +endfunction() + +# Setup a single repo target set build if QT_BUILD_SINGLE_REPO_TARGET_SET is defined. +# +# This macro must be called in the top-level project file of the repository after all repo target +# sets have been defined. +macro(qt_internal_prepare_single_repo_target_set_build) + if(DEFINED QT_BUILD_SINGLE_REPO_TARGET_SET) + if(NOT QT_BUILD_SINGLE_REPO_TARGET_SET IN_LIST QT_REPO_KNOWN_TARGET_SETS) + message(FATAL_ERROR + "Repo target set '${QT_BUILD_SINGLE_REPO_TARGET_SET}' is undefined.") + endif() + message(STATUS + "Preparing single repo target set build of ${QT_BUILD_SINGLE_REPO_TARGET_SET}") + if (NOT "${QT_REPO_TARGET_SET_${QT_BUILD_SINGLE_REPO_TARGET_SET}_DEPENDS}" STREQUAL "") + find_package(${INSTALL_CMAKE_NAMESPACE} ${PROJECT_VERSION} CONFIG REQUIRED + COMPONENTS ${QT_REPO_TARGET_SET_${QT_BUILD_SINGLE_REPO_TARGET_SET}_DEPENDS}) + endif() + endif() +endmacro() + macro(qt_build_repo_begin) qt_build_internals_set_up_private_api() qt_enable_cmake_languages() diff --git a/cmake/QtSingleRepoTargetSetBuildHelpers.cmake b/cmake/QtSingleRepoTargetSetBuildHelpers.cmake new file mode 100644 index 00000000000..789b23b6e65 --- /dev/null +++ b/cmake/QtSingleRepoTargetSetBuildHelpers.cmake @@ -0,0 +1,11 @@ +# Macro that checks for a single repo target set build, and returns from the current file, directory +# or function. Use this at the top of project files to whitelist the file for the given package. +macro(qt_internal_include_in_repo_target_set _repo_target_set_name) + if(DEFINED QT_BUILD_SINGLE_REPO_TARGET_SET) + if(NOT "${_repo_target_set_name}" STREQUAL QT_BUILD_SINGLE_REPO_TARGET_SET) + message(STATUS "Not part of repo target set ${QT_BUILD_SINGLE_REPO_TARGET_SET}: " + "${CMAKE_CURRENT_LIST_DIR}") + return() + endif() + endif() +endmacro()