diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-11-18 00:36:44 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2020-11-20 18:04:51 +0000 |
commit | a1be4de7129cf7b4c4207c7e5a50e89bbd7a4ba3 (patch) | |
tree | 4a1c3d81bbafebce45cae06b940268e3d92e58c6 /cmake | |
parent | cc26c1e025566e96234b37e853653b542927e0da (diff) |
Toplevel builds: Add utility toplevel targets for each module
Add a target for each level-1 subdirectory in a module. Ninja already
generates phony targets such as "qtbase/src/all", but those are not
available in e.g. IDE integrations of CMake. With this addition, targets
like qtbase, qtbase_src, and qtbase_tests are available in IDEs.
Change-Id: If1c3369e9413b3ce127e68c443d4d22949708d5e
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
(cherry picked from commit 08f46bb40075778e89ba9aed3cef53d990852022)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/QtBuildInternals/QtBuildInternalsConfig.cmake | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake index 3bfe6c1cb2..a7b86ed606 100644 --- a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake +++ b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake @@ -184,6 +184,50 @@ macro(qt_build_internals_set_up_private_api) qt_check_if_tools_will_be_built() endmacro() +# find all targets defined in $subdir by recursing through all added subdirectories +# populates $qt_repo_targets with a ;-list of non-UTILITY targets +macro(qt_build_internals_get_repo_targets subdir) + get_directory_property(_directories DIRECTORY "${subdir}" SUBDIRECTORIES) + if (_directories) + foreach(_directory IN LISTS _directories) + get_directory_property(_targets DIRECTORY "${_directory}" BUILDSYSTEM_TARGETS) + if (_targets) + foreach(_target IN LISTS _targets) + get_target_property(_type ${_target} TYPE) + if (NOT (${_type} STREQUAL "UTILITY" OR ${_type} STREQUAL "INTERFACE")) + list(APPEND qt_repo_targets "${_target}") + endif() + endforeach() + endif() + qt_build_internals_get_repo_targets("${_directory}") + endforeach() + endif() +endmacro() + +# add toplevel targets for each subdirectory, e.g. qtbase_src +function(qt_build_internals_add_toplevel_targets) + set(qt_repo_target_all "") + get_directory_property(directories DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" SUBDIRECTORIES) + foreach(directory IN LISTS directories) + set(qt_repo_targets "") + get_filename_component(qt_repo_target_basename ${directory} NAME) + qt_build_internals_get_repo_targets("${directory}") + if (qt_repo_targets) + set(qt_repo_target_name "${qt_repo_targets_name}_${qt_repo_target_basename}") + message(DEBUG "${qt_repo_target_name} depends on ${qt_repo_targets}") + add_custom_target("${qt_repo_target_name}" + DEPENDS ${qt_repo_targets} + COMMENT "Building everything in ${qt_repo_targets_name}/${qt_repo_target_basename}") + list(APPEND qt_repo_target_all "${qt_repo_target_name}") + endif() + endforeach() + if (qt_repo_target_all) + add_custom_target("${qt_repo_targets_name}" + DEPENDS ${qt_repo_target_all} + COMMENT "Building everything in ${qt_repo_targets_name}") + endif() +endfunction() + macro(qt_enable_cmake_languages) include(CheckLanguage) set(__qt_required_language_list C CXX) @@ -254,6 +298,7 @@ macro(qt_build_repo_begin) string(TOLOWER ${PROJECT_NAME} project_name_lower) + set(qt_repo_targets_name ${project_name_lower}) set(qt_docs_target_name docs_${project_name_lower}) set(qt_docs_prepare_target_name prepare_docs_${project_name_lower}) set(qt_docs_generate_target_name generate_docs_${project_name_lower}) @@ -316,6 +361,8 @@ macro(qt_build_repo_end) if(NOT QT_SUPERBUILD) qt_print_build_instructions() + else() + qt_build_internals_add_toplevel_targets() endif() endmacro() |