|
17 | 17 | # |
18 | 18 | # ============================================================================== |
19 | 19 |
|
20 | | -#============================================================================== |
21 | | - |
22 | 20 | function (_yup_module_parse_config module_header output_module_configs output_module_user_configs) |
23 | 21 | set (module_configs "") |
24 | 22 | set (module_user_configs "") |
@@ -96,7 +94,7 @@ endfunction() |
96 | 94 |
|
97 | 95 | #============================================================================== |
98 | 96 |
|
99 | | -function (_yup_module_fetch_upstream module_name module_path module_upstream module_sha256 module_repository module_branch) |
| 97 | +function (_yup_module_fetch_upstream module_name module_path module_upstream module_sha256 module_repository module_branch module_submodules output_target_variable) |
100 | 98 | if (NOT YUP_FETCH_UPSTREAM_MODULES) |
101 | 99 | return() |
102 | 100 | endif() |
@@ -160,13 +158,80 @@ function (_yup_module_fetch_upstream module_name module_path module_upstream mod |
160 | 158 | endif() |
161 | 159 |
|
162 | 160 | set (upstream_target_dir "${CMAKE_BINARY_DIR}/externals/${module_name}/upstream") |
163 | | - FetchContent_Declare( |
164 | | - "${module_name}_upstream" |
165 | | - GIT_REPOSITORY "${module_repository}" |
166 | | - GIT_TAG "${module_branch}" |
167 | | - GIT_SUBMODULES_RECURSE ON |
168 | | - SOURCE_DIR "${upstream_target_dir}") |
169 | | - FetchContent_Populate ("${module_name}_upstream") |
| 161 | + if (module_submodules) |
| 162 | + set (module_submodules_recurse ON) |
| 163 | + else() |
| 164 | + set (module_submodules_recurse OFF) |
| 165 | + endif() |
| 166 | + |
| 167 | + file (MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/externals/${module_name}") |
| 168 | + |
| 169 | + file (REMOVE_RECURSE "${upstream_target_dir}") |
| 170 | + set (module_branch_value "${module_branch}") |
| 171 | + string (STRIP "${module_branch_value}" module_branch_value) |
| 172 | + string (REGEX REPLACE "^\"(.*)\"$" "\\1" module_branch_value "${module_branch_value}") |
| 173 | + string (REGEX REPLACE "^'(.*)'$" "\\1" module_branch_value "${module_branch_value}") |
| 174 | + |
| 175 | + if (module_branch_value AND NOT module_branch_value STREQUAL "HEAD") |
| 176 | + string (REGEX MATCH "^[0-9a-fA-F]+$" module_branch_is_hex "${module_branch_value}") |
| 177 | + string (LENGTH "${module_branch_value}" module_branch_length) |
| 178 | + if (module_branch_is_hex AND module_branch_length GREATER_EQUAL 7 AND module_branch_length LESS_EQUAL 40) |
| 179 | + set (module_branch_is_commit ON) |
| 180 | + else() |
| 181 | + set (module_branch_is_commit "") |
| 182 | + endif() |
| 183 | + else() |
| 184 | + set (module_branch_is_commit "") |
| 185 | + endif() |
| 186 | + |
| 187 | + if (module_branch_is_commit) |
| 188 | + execute_process ( |
| 189 | + COMMAND git clone -q --no-checkout "${module_repository}" "${upstream_target_dir}" |
| 190 | + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals/${module_name}" |
| 191 | + RESULT_VARIABLE clone_result) |
| 192 | + if (clone_result EQUAL 0) |
| 193 | + execute_process ( |
| 194 | + COMMAND git -c advice.detachedHead=false -C "${upstream_target_dir}" fetch -q --depth=1 origin "${module_branch_value}" |
| 195 | + RESULT_VARIABLE fetch_result) |
| 196 | + execute_process ( |
| 197 | + COMMAND git -c advice.detachedHead=false -C "${upstream_target_dir}" checkout -q "${module_branch_value}" |
| 198 | + RESULT_VARIABLE checkout_result) |
| 199 | + if (module_submodules_recurse AND fetch_result EQUAL 0 AND checkout_result EQUAL 0) |
| 200 | + execute_process ( |
| 201 | + COMMAND git -c advice.detachedHead=false -C "${upstream_target_dir}" submodule update --init --recursive --depth=1 |
| 202 | + RESULT_VARIABLE submodule_result) |
| 203 | + endif() |
| 204 | + endif() |
| 205 | + else() |
| 206 | + set (clone_args git clone) |
| 207 | + if (module_submodules_recurse) |
| 208 | + list (APPEND clone_args --recurse-submodules --shallow-submodules) |
| 209 | + endif() |
| 210 | + list (APPEND clone_args -q --depth=1) |
| 211 | + if (module_branch_value AND NOT module_branch_value STREQUAL "HEAD") |
| 212 | + list (APPEND clone_args --branch "${module_branch_value}") |
| 213 | + endif() |
| 214 | + list (APPEND clone_args "${module_repository}" "${upstream_target_dir}") |
| 215 | + execute_process ( |
| 216 | + COMMAND ${clone_args} |
| 217 | + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals/${module_name}" |
| 218 | + RESULT_VARIABLE clone_result) |
| 219 | + endif() |
| 220 | + |
| 221 | + if (module_branch_is_commit) |
| 222 | + if (NOT clone_result EQUAL 0 OR NOT fetch_result EQUAL 0 OR NOT checkout_result EQUAL 0) |
| 223 | + _yup_message (FATAL_ERROR "Failed to clone ${module_repository} at commit ${module_branch} for ${module_name}") |
| 224 | + endif() |
| 225 | + if (module_submodules_recurse AND NOT submodule_result EQUAL 0) |
| 226 | + _yup_message (FATAL_ERROR "Failed to update submodules for ${module_repository} at commit ${module_branch}") |
| 227 | + endif() |
| 228 | + else() |
| 229 | + if (NOT clone_result EQUAL 0) |
| 230 | + _yup_message (FATAL_ERROR "Failed to clone ${module_repository} for ${module_name}") |
| 231 | + endif() |
| 232 | + endif() |
| 233 | + |
| 234 | + set (${output_target_variable} "" PARENT_SCOPE) |
170 | 235 | endif() |
171 | 236 | endfunction() |
172 | 237 |
|
@@ -485,19 +550,23 @@ function (yup_add_module module_path modules_definitions module_group) |
485 | 550 | set (module_repository "${value}") |
486 | 551 | elseif (${key} MATCHES "^branch$") |
487 | 552 | set (module_branch "${value}") |
| 553 | + elseif (${key} MATCHES "^submodules$") |
| 554 | + _yup_boolean_property ("${value}" module_submodules) |
488 | 555 | endif() |
489 | 556 | endforeach() |
490 | 557 |
|
491 | 558 | _yup_set_default (module_cpp_standard "20") |
492 | 559 | _yup_set_default (module_arc_enabled OFF) |
493 | 560 | _yup_set_default (module_needs_python OFF) |
| 561 | + _yup_set_default (module_submodules ON) |
494 | 562 | _yup_resolve_variable_paths ("${module_searchpaths}" module_searchpaths) |
495 | 563 |
|
| 564 | + set (module_upstream_target "") |
496 | 565 | if (module_upstream OR module_repository) |
497 | 566 | _yup_module_upstream_has_content ("${module_name}" "${module_path}" upstream_has_content) |
498 | 567 | if (NOT upstream_has_content) |
499 | 568 | if (YUP_FETCH_UPSTREAM_MODULES) |
500 | | - _yup_module_fetch_upstream ("${module_name}" "${module_path}" "${module_upstream}" "${module_sha256}" "${module_repository}" "${module_branch}") |
| 569 | + _yup_module_fetch_upstream ("${module_name}" "${module_path}" "${module_upstream}" "${module_sha256}" "${module_repository}" "${module_branch}" "${module_submodules}" module_upstream_target) |
501 | 570 | else() |
502 | 571 | _yup_message (WARNING "Upstream sources for ${module_name} are missing and YUP_FETCH_UPSTREAM_MODULES is OFF") |
503 | 572 | endif() |
@@ -702,6 +771,10 @@ function (yup_add_module module_path modules_definitions module_group) |
702 | 771 | "${module_dependencies}" |
703 | 772 | "${module_arc_enabled}") |
704 | 773 |
|
| 774 | + if (module_upstream_target) |
| 775 | + add_dependencies (${module_name} "${module_upstream_target}") |
| 776 | + endif() |
| 777 | + |
705 | 778 | #set (${module_name}_Configs "${module_user_configs}") |
706 | 779 | #set (${module_name}_Configs ${${module_name}_Configs} PARENT_SCOPE) |
707 | 780 |
|
|
0 commit comments