aboutsummaryrefslogtreecommitdiffstats
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2020-11-08 14:28:12 +0100
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2020-11-11 11:44:25 +0100
commitda25b7f149ee55317e14365ae10f2df77e8250bb (patch)
treed8836d2b64e962079bc62e3c1046a445e2992d88 /CMakeLists.txt
parent9a82a87954fda2e5f6420d346798d9a841e5c810 (diff)
Use dependencies.yaml to order sub modules
Don't rely on .gitmodules, instead parse the dependencies.yaml file from every subdirectory with a CMakeLists.txt, and sort all projects based on that data. Projects with no dependencies are added last. This allows us to get rid of the duplication of dependency information in .gitmodules, and makes each module the authoritative source of its own dependencies. Change-Id: Ib1ec6c63bde2aa1852399d598dac5b8e1efda31d Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt75
1 files changed, 16 insertions, 59 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2cd120be..0b438cee 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,32 +19,6 @@ project(Qt
enable_testing()
set(qt_module_prop_prefix "__qt_prop_")
-function(extract_git_submodules out_module_list)
- set(current_module "")
- set(module_list "")
- file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/.gitmodules" lines)
- foreach(line IN LISTS lines)
- # Skip empty lines.
- if(NOT line)
- continue()
- endif()
- string(REGEX REPLACE "^\\[submodule \"([^\"]+)\"\\]$" "\\1" module "${line}")
- if (NOT module STREQUAL line)
- set(current_module "${module}")
- list(APPEND module_list "${module}")
- else()
- string(REGEX REPLACE "^\t([^ =]+) *=.*$" "\\1" prop "${line}")
- if (NOT prop STREQUAL line)
- string(REGEX REPLACE "^[^=]+= *" "" value "${line}")
- string(REPLACE " " ";" value "${value}")
- set("${qt_module_prop_prefix}${current_module}_${prop}" "${value}" PARENT_SCOPE)
- else()
- message(FATAL_ERROR "Malformed line ${CMAKE_CURRENT_SOURCE_DIR}/.gitmodules: ${line}")
- endif()
- endif()
- endforeach()
- set(${out_module_list} ${module_list} PARENT_SCOPE)
-endfunction()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
if (NOT QT_BUILD_STANDALONE_TESTS)
@@ -54,8 +28,8 @@ if (NOT QT_BUILD_STANDALONE_TESTS)
list(APPEND CMAKE_MODULE_PATH "${__qt6_qtbase_src_path}/cmake/3rdparty/kwin")
endif()
+include("QtTopLevelHelpers")
include(ECMOptionalAddSubdirectory)
-include(TopologicalSort)
# Also make sure the CMake config files do not recreate the already-existing targets
if (NOT QT_BUILD_STANDALONE_TESTS)
@@ -63,44 +37,27 @@ if (NOT QT_BUILD_STANDALONE_TESTS)
endif()
set(QT_SUPERBUILD TRUE)
-# Get submodules list
-extract_git_submodules(git_module_list)
-foreach(module IN LISTS git_module_list)
- # Prepare a list of dependencies to be fed into topological sort
- set("${qt_module_prop_prefix}${module}_all_dependencies"
- ${${qt_module_prop_prefix}${module}_depends}
- ${${qt_module_prop_prefix}${module}_recommends}
- ${${qt_module_prop_prefix}${module}_serialize}
- )
-endforeach()
-
-# Sort by dependencies
-topological_sort(git_module_list "${qt_module_prop_prefix}" "_all_dependencies")
-
-# Check for unknown modules
-foreach(module IN LISTS git_module_list)
- foreach(dep IN LISTS "${qt_module_prop_prefix}${module}_all_dependencies")
- if (NOT dep IN_LIST git_module_list)
- message(FATAL_ERROR "Module '${module}' depends on undeclared module '${dep}'")
- endif()
- endforeach()
-endforeach()
+# Get submodule list if not already defined
+if (NOT BUILD_SUBMODULES)
+ qt_internal_find_modules(BUILD_SUBMODULES)
+endif()
-# qtbase is always needed
-list(REMOVE_ITEM git_module_list qtbase)
-add_subdirectory(qtbase)
+qt_internal_sort_module_dependencies("${BUILD_SUBMODULES}" BUILD_SUBMODULES)
-if (NOT QT_BUILD_STANDALONE_TESTS)
- list(APPEND CMAKE_PREFIX_PATH "${QtBase_BINARY_DIR}/lib/cmake")
- list(APPEND CMAKE_FIND_ROOT_PATH "${QtBase_BINARY_DIR}")
-endif()
+foreach(module IN LISTS BUILD_SUBMODULES)
+ message(NOTICE "Configuring '${module}'")
+ ecm_optional_add_subdirectory("${module}")
-foreach(module IN LISTS git_module_list)
- ecm_optional_add_subdirectory(${module})
+ if(module STREQUAL "qtbase")
+ if (NOT QT_BUILD_STANDALONE_TESTS)
+ list(APPEND CMAKE_PREFIX_PATH "${QtBase_BINARY_DIR}/lib/cmake")
+ list(APPEND CMAKE_FIND_ROOT_PATH "${QtBase_BINARY_DIR}")
+ endif()
+ endif()
endforeach()
# Check for unmet dependencies
-foreach(module IN LISTS git_module_list)
+foreach(module IN LISTS BUILD_SUBMODULES)
foreach(dep IN LISTS "${qt_module_prop_prefix}${module}_depends")
if (dep STREQUAL qtbase)
# Always available skip