blob: 4aa560e3d18bffb6c71276d2ad5dadc999ee0c44 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# Populates $out_module_list with all subdirectories that have a CMakeLists.txt file
function(qt_internal_find_modules out_module_list)
set(module_list "")
file(GLOB directories LIST_DIRECTORIES true RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" *)
foreach(directory IN LISTS directories)
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${directory}"
AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${directory}/CMakeLists.txt")
list(APPEND module_list "${directory}")
endif()
endforeach()
message(DEBUG "qt_internal_find_modules: ${module_list}")
set(${out_module_list} "${module_list}" PARENT_SCOPE)
endfunction()
# poor man's yaml parser, populating $out_dependencies with all dependencies
# in the $depends_file
function(qt_internal_parse_dependencies depends_file out_dependencies)
file(STRINGS "${depends_file}" lines)
set(dependencies "")
foreach(line IN LISTS lines)
if(line STREQUAL "dependencies:")
set(found_dependencies 1)
elseif(found_dependencies AND line MATCHES "^ (.*):$")
set(dependency ${CMAKE_MATCH_1})
# dependencies are specified with relative path to this module
string(REPLACE "../" "" dependency ${dependency})
list(APPEND dependencies ${dependency})
endif()
endforeach()
message(DEBUG "qt_internal_parse_dependencies for ${depends_file}: ${module_list}")
set(${out_dependencies} "${dependencies}" PARENT_SCOPE)
endfunction()
# Load $module and populate $out_ordered with the submodules based on their dependencies
# $ordered carries already sorted dependencies; $out_has_dependencies is left empty
# if there are no dependencies, otherwise set to 1; Save list of dependencies for $module into
# $out_module_dependencies. List may contain duplicates, since function checks max depth
# dependencies.
# Function calls itself recursively if a dependency is found that is not yet in $ordered.
function(qt_internal_add_module_dependencies module ordered out_ordered out_has_dependencies
out_module_dependencies)
set(depends_file "${CMAKE_CURRENT_SOURCE_DIR}/${module}/dependencies.yaml")
if(NOT EXISTS "${depends_file}")
set(${out_has_dependencies} "" PARENT_SCOPE)
return()
endif()
set(${out_has_dependencies} "1" PARENT_SCOPE)
set(dependencies "")
qt_internal_parse_dependencies(${depends_file} dependencies)
# module hasn't been seen yet, append it
list(FIND ordered "${module}" pindex)
if (pindex EQUAL -1)
list(LENGTH ordered pindex)
list(APPEND ordered ${module})
endif()
foreach(dependency IN LISTS dependencies)
list(FIND ordered "${dependency}" dindex)
if (dindex EQUAL -1)
# dependency hasnt' been seen yet - load it
list(INSERT ordered ${pindex} "${dependency}")
qt_internal_add_module_dependencies(${dependency} "${ordered}" ordered has_dependency
"${out_module_dependencies}")
elseif(dindex GREATER pindex)
# otherwise, make sure it is before module
list(REMOVE_AT ordered ${dindex})
list(INSERT ordered ${pindex} "${dependency}")
endif()
endforeach()
set(${out_ordered} "${ordered}" PARENT_SCOPE)
set(${out_module_dependencies} ${${out_module_dependencies}} ${dependencies} PARENT_SCOPE)
endfunction()
# populates $out_all_ordered with the sequence of the modules that need
# to be built in order to build $modules; dependencies for each module are populated
# in variables with specified in $dependencies_map_prefix prefix
function(qt_internal_sort_module_dependencies modules out_all_ordered dependencies_map_prefix)
set(ordered "")
foreach(module IN LISTS modules)
set(out_ordered "")
if(NOT dependencies_map_prefix)
message(FATAL_ERROR "dependencies_map_prefix is not provided")
endif()
set(module_dependencies_list_var_name "${dependencies_map_prefix}${module}")
qt_internal_add_module_dependencies(${module} "${ordered}" out_ordered module_depends
"${module_dependencies_list_var_name}")
set(${module_dependencies_list_var_name}
"${${module_dependencies_list_var_name}}" PARENT_SCOPE)
if(NOT module_depends)
list(APPEND no_dependencies "${module}")
endif()
set(ordered "${out_ordered}")
endforeach()
if (no_dependencies)
list(APPEND ordered "${no_dependencies}")
endif()
message(DEBUG "qt_internal_parse_dependencies sorted ${modules}: ${ordered}")
set(${out_all_ordered} "${ordered}" PARENT_SCOPE)
endfunction()
|