2020-11-08 13:28:12 +00:00
|
|
|
# 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
|
2020-11-13 12:42:42 +00:00
|
|
|
# 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.
|
2020-11-08 13:28:12 +00:00
|
|
|
# Function calls itself recursively if a dependency is found that is not yet in $ordered.
|
2020-11-13 12:42:42 +00:00
|
|
|
function(qt_internal_add_module_dependencies module ordered out_ordered out_has_dependencies
|
|
|
|
out_module_dependencies)
|
2020-11-08 13:28:12 +00:00
|
|
|
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}")
|
2020-11-13 12:42:42 +00:00
|
|
|
qt_internal_add_module_dependencies(${dependency} "${ordered}" ordered has_dependency
|
|
|
|
"${out_module_dependencies}")
|
2020-11-08 13:28:12 +00:00
|
|
|
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)
|
2020-11-13 12:42:42 +00:00
|
|
|
set(${out_module_dependencies} ${${out_module_dependencies}} ${dependencies} PARENT_SCOPE)
|
2020-11-08 13:28:12 +00:00
|
|
|
endfunction()
|
|
|
|
|
|
|
|
# populates $out_all_ordered with the sequence of the modules that need
|
2020-11-13 12:42:42 +00:00
|
|
|
# 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)
|
2020-11-08 13:28:12 +00:00
|
|
|
set(ordered "")
|
|
|
|
foreach(module IN LISTS modules)
|
|
|
|
set(out_ordered "")
|
2020-11-13 12:42:42 +00:00
|
|
|
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)
|
2020-11-08 13:28:12 +00:00
|
|
|
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()
|