diff options
author | Craig Scott <craig.scott@crascit.com> | 2021-01-29 12:22:45 (GMT) |
---|---|---|
committer | Craig Scott <craig.scott@crascit.com> | 2021-02-04 20:33:38 (GMT) |
commit | 17e5516e608ba5c9c1f2dfad3d64f8f90874f108 (patch) | |
tree | ae0f88a262c3734cda45ee1040aee303e131d13d /Modules/ExternalProject | |
parent | 4f3d1abbb4dca3d1e6b019471fa5d8be296492e3 (diff) | |
download | CMake-17e5516e608ba5c9c1f2dfad3d64f8f90874f108.zip CMake-17e5516e608ba5c9c1f2dfad3d64f8f90874f108.tar.gz CMake-17e5516e608ba5c9c1f2dfad3d64f8f90874f108.tar.bz2 |
FetchContent: Invoke steps directly and avoid a separate sub-build
The cost of setting up and executing a separate sub-build to do the
download, update and patch steps required for FetchContent population
can be significant with some platforms and CMake generators. Avoid the
sub-build altogether by invoking the step scripts directly.
Previously, if no generator was set (e.g. population was being done in
script mode), a generator needed to be available on the default PATH.
Since we no longer use a sub-build, this restriction is also now gone.
Fixes: #21703
Diffstat (limited to 'Modules/ExternalProject')
-rw-r--r-- | Modules/ExternalProject/captured_process_setup.cmake | 55 | ||||
-rw-r--r-- | Modules/ExternalProject/customcommand.cmake.in | 8 | ||||
-rw-r--r-- | Modules/ExternalProject/customcommand_preamble.cmake.in | 8 | ||||
-rw-r--r-- | Modules/ExternalProject/download.cmake.in | 46 | ||||
-rw-r--r-- | Modules/ExternalProject/extractfile.cmake.in | 32 | ||||
-rw-r--r-- | Modules/ExternalProject/gitclone.cmake.in | 77 | ||||
-rw-r--r-- | Modules/ExternalProject/gitupdate.cmake.in | 92 | ||||
-rw-r--r-- | Modules/ExternalProject/hgclone.cmake.in | 47 | ||||
-rw-r--r-- | Modules/ExternalProject/hgupdate.cmake.in | 12 | ||||
-rw-r--r-- | Modules/ExternalProject/verify.cmake.in | 22 |
10 files changed, 296 insertions, 103 deletions
diff --git a/Modules/ExternalProject/captured_process_setup.cmake b/Modules/ExternalProject/captured_process_setup.cmake new file mode 100644 index 0000000..9c8abb1 --- /dev/null +++ b/Modules/ExternalProject/captured_process_setup.cmake @@ -0,0 +1,55 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +if(quiet) + set(capture_output + OUTPUT_VARIABLE out_var + ERROR_VARIABLE out_var + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + set(capture_error_only + ERROR_VARIABLE out_var + ERROR_STRIP_TRAILING_WHITESPACE + ) +else() + unset(capture_output) + unset(capture_error_only) +endif() + +set(out_var "") +set(accumulated_output "") + +macro(_ep_message_quiet_capture mode) + if("${mode}" STREQUAL "FATAL_ERROR") + string(JOIN "" detail "${ARGN}") + if(NOT detail STREQUAL "" AND NOT accumulated_output STREQUAL "") + string(PREPEND detail "\n") + endif() + message(FATAL_ERROR "${accumulated_output}${detail}") + endif() + + if(quiet) + if("${mode}" MATCHES "WARNING") + # We can't provide the full CMake backtrace, but we can at least record + # the warning message with a sensible prefix + string(APPEND accumulated_output "${mode}: ") + endif() + string(APPEND accumulated_output "${ARGN}\n") + else() + message(${mode} ${ARGN}) + endif() +endmacro() + +macro(_ep_accumulate_captured_output) + if(NOT "${out_var}" STREQUAL "") + string(APPEND accumulated_output "${out_var}\n") + endif() +endmacro() + +macro(_ep_command_check_result result) + _ep_accumulate_captured_output() + if(result) + _ep_message_quiet_capture(FATAL_ERROR ${ARGN}) + endif() +endmacro() diff --git a/Modules/ExternalProject/customcommand.cmake.in b/Modules/ExternalProject/customcommand.cmake.in new file mode 100644 index 0000000..d41f31b --- /dev/null +++ b/Modules/ExternalProject/customcommand.cmake.in @@ -0,0 +1,8 @@ + +execute_process( + COMMAND @this_command@ + WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE result + ${capture_output} +) +_ep_command_check_result(result) diff --git a/Modules/ExternalProject/customcommand_preamble.cmake.in b/Modules/ExternalProject/customcommand_preamble.cmake.in new file mode 100644 index 0000000..ae4fec6 --- /dev/null +++ b/Modules/ExternalProject/customcommand_preamble.cmake.in @@ -0,0 +1,8 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +cmake_minimum_required(VERSION 3.5) + +set(quiet "@quiet@") +set(script_dir "@CMAKE_CURRENT_FUNCTION_LIST_DIR@/ExternalProject") +include(${script_dir}/captured_process_setup.cmake) diff --git a/Modules/ExternalProject/download.cmake.in b/Modules/ExternalProject/download.cmake.in index 6ef4eb1..c8d2f28 100644 --- a/Modules/ExternalProject/download.cmake.in +++ b/Modules/ExternalProject/download.cmake.in @@ -3,13 +3,17 @@ cmake_minimum_required(VERSION 3.5) +set(quiet "@quiet@") +set(script_dir "@CMAKE_CURRENT_FUNCTION_LIST_DIR@/ExternalProject") +include(${script_dir}/captured_process_setup.cmake) + function(check_file_hash has_hash hash_is_good) if("${has_hash}" STREQUAL "") - message(FATAL_ERROR "has_hash Can't be empty") + _ep_message_quiet_capture(FATAL_ERROR "has_hash Can't be empty") endif() if("${hash_is_good}" STREQUAL "") - message(FATAL_ERROR "hash_is_good Can't be empty") + _ep_message_quiet_capture(FATAL_ERROR "hash_is_good Can't be empty") endif() if("@ALGO@" STREQUAL "") @@ -21,18 +25,20 @@ function(check_file_hash has_hash hash_is_good) set("${has_hash}" TRUE PARENT_SCOPE) - message(STATUS "verifying file... + _ep_message_quiet_capture(STATUS "verifying file... file='@LOCAL@'") + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) file("@ALGO@" "@LOCAL@" actual_value) if(NOT "${actual_value}" STREQUAL "@EXPECT_VALUE@") set("${hash_is_good}" FALSE PARENT_SCOPE) - message(STATUS "@ALGO@ hash of + _ep_message_quiet_capture(STATUS "@ALGO@ hash of @LOCAL@ does not match expected value expected: '@EXPECT_VALUE@' actual: '${actual_value}'") + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) else() set("${hash_is_good}" TRUE PARENT_SCOPE) endif() @@ -44,7 +50,8 @@ function(sleep_before_download attempt) endif() if(attempt EQUAL 1) - message(STATUS "Retrying...") + _ep_message_quiet_capture(STATUS "Retrying...") + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) return() endif() @@ -66,7 +73,10 @@ function(sleep_before_download attempt) set(sleep_seconds 1200) endif() - message(STATUS "Retry after ${sleep_seconds} seconds (attempt #${attempt}) ...") + _ep_message_quiet_capture(STATUS + "Retry after ${sleep_seconds} seconds (attempt #${attempt}) ..." + ) + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep "${sleep_seconds}") endfunction() @@ -84,18 +94,22 @@ function(download_and_verify) check_file_hash(has_hash hash_is_good) if(has_hash) if(hash_is_good) - message(STATUS + _ep_message_quiet_capture(STATUS "File already exists and hash match (skip download): file='@LOCAL@' @ALGO@='@EXPECT_VALUE@'" ) + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) return() else() - message(STATUS "File already exists but hash mismatch. Removing...") + _ep_message_quiet_capture(STATUS + "File already exists but hash mismatch. Removing..." + ) + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) file(REMOVE "@LOCAL@") endif() else() - message(STATUS + _ep_message_quiet_capture(STATUS "File already exists but no hash specified (use URL_HASH): file='@LOCAL@' Old file will be removed and new file downloaded from URL." @@ -106,11 +120,12 @@ Old file will be removed and new file downloaded from URL." set(retry_number 5) - message(STATUS "Downloading... + _ep_message_quiet_capture(STATUS "Downloading... dst='@LOCAL@' timeout='@TIMEOUT_MSG@' inactivity timeout='@INACTIVITY_TIMEOUT_MSG@'" ) + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) set(download_retry_codes 7 6 8 15) set(skip_url_list) set(status_code) @@ -120,7 +135,8 @@ Old file will be removed and new file downloaded from URL." endif() foreach(url @REMOTE@) if(NOT url IN_LIST skip_url_list) - message(STATUS "Using src='${url}'") + _ep_message_quiet_capture(STATUS "Using src='${url}'") + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) @TLS_VERIFY_CODE@ @TLS_CAINFO_CODE@ @@ -145,10 +161,12 @@ Old file will be removed and new file downloaded from URL." if(status_code EQUAL 0) check_file_hash(has_hash hash_is_good) if(has_hash AND NOT hash_is_good) - message(STATUS "Hash mismatch, removing...") + _ep_message_quiet_capture(STATUS "Hash mismatch, removing...") + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) file(REMOVE "@LOCAL@") else() - message(STATUS "Downloading... done") + _ep_message_quiet_capture(STATUS "Downloading... done") + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) return() endif() else() @@ -171,7 +189,7 @@ Old file will be removed and new file downloaded from URL." endforeach() endforeach() - message(FATAL_ERROR + _ep_message_quiet_capture(FATAL_ERROR "Each download failed! ${logFailedURLs} " diff --git a/Modules/ExternalProject/extractfile.cmake.in b/Modules/ExternalProject/extractfile.cmake.in index d9e07f1..d46de73 100644 --- a/Modules/ExternalProject/extractfile.cmake.in +++ b/Modules/ExternalProject/extractfile.cmake.in @@ -3,17 +3,24 @@ cmake_minimum_required(VERSION 3.5) +set(quiet "@quiet@") +set(script_dir "@CMAKE_CURRENT_FUNCTION_LIST_DIR@/ExternalProject") +include(${script_dir}/captured_process_setup.cmake) + # Make file names absolute: # get_filename_component(filename "@filename@" ABSOLUTE) get_filename_component(directory "@directory@" ABSOLUTE) -message(STATUS "extracting... +_ep_message_quiet_capture(STATUS "extracting... src='${filename}' - dst='${directory}'") + dst='${directory}'" +) if(NOT EXISTS "${filename}") - message(FATAL_ERROR "File to extract does not exist: '${filename}'") + _ep_message_quiet_capture(FATAL_ERROR + "File to extract does not exist: '${filename}'" + ) endif() # Prepare a space for extracting: @@ -27,20 +34,23 @@ file(MAKE_DIRECTORY "${ut_dir}") # Extract it: # -message(STATUS "extracting... [tar @args@]") +_ep_message_quiet_capture(STATUS "extracting... [tar @args@]") execute_process(COMMAND ${CMAKE_COMMAND} -E tar @args@ ${filename} WORKING_DIRECTORY ${ut_dir} - RESULT_VARIABLE rv) + RESULT_VARIABLE rv + ${capture_output} +) +_ep_accumulate_captured_output() if(NOT rv EQUAL 0) - message(STATUS "extracting... [error clean up]") + _ep_message_quiet_capture(STATUS "extracting... [error clean up]") file(REMOVE_RECURSE "${ut_dir}") - message(FATAL_ERROR "Extract of '${filename}' failed") + _ep_message_quiet_capture(FATAL_ERROR "Extract of '${filename}' failed") endif() # Analyze what came out of the tar file: # -message(STATUS "extracting... [analysis]") +_ep_message_quiet_capture(STATUS "extracting... [analysis]") file(GLOB contents "${ut_dir}/*") list(REMOVE_ITEM contents "${ut_dir}/.DS_Store") list(LENGTH contents n) @@ -50,14 +60,14 @@ endif() # Move "the one" directory to the final directory: # -message(STATUS "extracting... [rename]") +_ep_message_quiet_capture(STATUS "extracting... [rename]") file(REMOVE_RECURSE ${directory}) get_filename_component(contents ${contents} ABSOLUTE) file(RENAME ${contents} ${directory}) # Clean up: # -message(STATUS "extracting... [clean up]") +_ep_message_quiet_capture(STATUS "extracting... [clean up]") file(REMOVE_RECURSE "${ut_dir}") -message(STATUS "extracting... done") +_ep_message_quiet_capture(STATUS "extracting... done") diff --git a/Modules/ExternalProject/gitclone.cmake.in b/Modules/ExternalProject/gitclone.cmake.in index 5e5c415..a2e900c 100644 --- a/Modules/ExternalProject/gitclone.cmake.in +++ b/Modules/ExternalProject/gitclone.cmake.in @@ -3,57 +3,81 @@ cmake_minimum_required(VERSION 3.5) +set(quiet "@quiet@") +set(script_dir "@CMAKE_CURRENT_FUNCTION_LIST_DIR@/ExternalProject") +include(${script_dir}/captured_process_setup.cmake) + if(NOT "@gitclone_infofile@" IS_NEWER_THAN "@gitclone_stampfile@") - message(STATUS "Avoiding repeated git clone, stamp file is up to date: '@gitclone_stampfile@'") + if(NOT quiet) + message(STATUS + "Avoiding repeated git clone, stamp file is up to date: " + "'@gitclone_stampfile@'" + ) + endif() return() endif() execute_process( COMMAND ${CMAKE_COMMAND} -E rm -rf "@source_dir@" RESULT_VARIABLE error_code - ) -if(error_code) - message(FATAL_ERROR "Failed to remove directory: '@source_dir@'") -endif() + ${capture_output} +) +_ep_command_check_result( + error_code "Failed to remove directory: '@source_dir@'" +) # try the clone 3 times in case there is an odd git clone issue set(error_code 1) set(number_of_tries 0) while(error_code AND number_of_tries LESS 3) + # If you are seeing the following call hang and you have QUIET enabled, try + # turning QUIET off to show any output immediately. The command may be + # blocking while waiting for user input (e.g. a password to a SSH key). execute_process( - COMMAND "@git_EXECUTABLE@" @git_options@ clone @git_clone_options@ "@git_repository@" "@src_name@" + COMMAND "@git_EXECUTABLE@" @git_options@ + clone @git_clone_options@ "@git_repository@" "@src_name@" WORKING_DIRECTORY "@work_dir@" RESULT_VARIABLE error_code - ) + ${capture_output} + ) + if(NOT "${out_var}" STREQUAL "") + string(APPEND accumulated_output "${out_var}\n") + endif() math(EXPR number_of_tries "${number_of_tries} + 1") endwhile() if(number_of_tries GREATER 1) - message(STATUS "Had to git clone more than once: - ${number_of_tries} times.") -endif() -if(error_code) - message(FATAL_ERROR "Failed to clone repository: '@git_repository@'") + set(msg "Had to git clone more than once: ${number_of_tries} times.") + if(quiet) + string(APPEND accumulated_output "${msg}\n") + else() + message(STATUS "${msg}") + endif() endif() +_ep_command_check_result( + error_code "Failed to clone repository: '@git_repository@'" +) execute_process( - COMMAND "@git_EXECUTABLE@" @git_options@ checkout "@git_tag@" @git_checkout_explicit--@ + COMMAND "@git_EXECUTABLE@" @git_options@ + checkout "@git_tag@" @git_checkout_explicit--@ WORKING_DIRECTORY "@work_dir@/@src_name@" RESULT_VARIABLE error_code - ) -if(error_code) - message(FATAL_ERROR "Failed to checkout tag: '@git_tag@'") -endif() + ${capture_output} +) +_ep_command_check_result(error_code "Failed to checkout tag: '@git_tag@'") set(init_submodules @init_submodules@) if(init_submodules) execute_process( - COMMAND "@git_EXECUTABLE@" @git_options@ submodule update @git_submodules_recurse@ --init @git_submodules@ + COMMAND "@git_EXECUTABLE@" @git_options@ + submodule update @git_submodules_recurse@ --init @git_submodules@ WORKING_DIRECTORY "@work_dir@/@src_name@" RESULT_VARIABLE error_code - ) -endif() -if(error_code) - message(FATAL_ERROR "Failed to update submodules in: '@work_dir@/@src_name@'") + ${capture_output} + ) + _ep_command_check_result( + error_code "Failed to update submodules in: '@work_dir@/@src_name@'" + ) endif() # Complete success, update the script-last-run stamp file: @@ -61,7 +85,8 @@ endif() execute_process( COMMAND ${CMAKE_COMMAND} -E copy "@gitclone_infofile@" "@gitclone_stampfile@" RESULT_VARIABLE error_code - ) -if(error_code) - message(FATAL_ERROR "Failed to copy script-last-run stamp file: '@gitclone_stampfile@'") -endif() + ${capture_output} +) +_ep_command_check_result( + error_code "Failed to copy script-last-run stamp file: '@gitclone_stampfile@'" +) diff --git a/Modules/ExternalProject/gitupdate.cmake.in b/Modules/ExternalProject/gitupdate.cmake.in index 7033918..fc2a6ab 100644 --- a/Modules/ExternalProject/gitupdate.cmake.in +++ b/Modules/ExternalProject/gitupdate.cmake.in @@ -3,6 +3,10 @@ cmake_minimum_required(VERSION 3.5) +set(quiet "@quiet@") +set(script_dir "@CMAKE_CURRENT_FUNCTION_LIST_DIR@/ExternalProject") +include(${script_dir}/captured_process_setup.cmake) + function(get_hash_for_ref ref out_var err_var) execute_process( COMMAND "@git_EXECUTABLE@" rev-parse "${ref}" @@ -49,7 +53,7 @@ elseif(show_ref_output MATCHES "^[a-z0-9]+[ \\t]+refs/tags/") # FIXME: We should provide an option to always fetch for this case get_hash_for_ref("@git_tag@" tag_sha error_msg) if(tag_sha STREQUAL head_sha) - message(VERBOSE "Already at requested tag: ${tag_sha}") + _ep_message_quiet_capture(VERBOSE "Already at requested tag: ${tag_sha}") return() endif() @@ -65,7 +69,7 @@ else() get_hash_for_ref("@git_tag@" tag_sha error_msg) if(tag_sha STREQUAL head_sha) # Have the right commit checked out already - message(VERBOSE "Already at requested ref: ${tag_sha}") + _ep_message_quiet_capture(VERBOSE "Already at requested ref: ${tag_sha}") return() elseif(tag_sha STREQUAL "") @@ -76,7 +80,7 @@ else() set(fetch_required YES) set(checkout_name "@git_tag@") if(NOT error_msg STREQUAL "") - message(VERBOSE "${error_msg}") + _ep_message_quiet_capture(VERBOSE "${error_msg}") endif() else() @@ -86,18 +90,22 @@ else() set(fetch_required NO) set(checkout_name "@git_tag@") if(NOT error_msg STREQUAL "") - message(WARNING "${error_msg}") + _ep_message_quiet_capture(WARNING "${error_msg}") endif() endif() endif() if(fetch_required) - message(VERBOSE "Fetching latest from the remote @git_remote_name@") + _ep_message_quiet_capture(VERBOSE "Fetching latest from the remote @git_remote_name@") execute_process( COMMAND "@git_EXECUTABLE@" fetch --tags --force "@git_remote_name@" WORKING_DIRECTORY "@work_dir@" - COMMAND_ERROR_IS_FATAL ANY + RESULT_VARIABLE error_code + ${capture_output} + ) + _ep_command_check_result( + error_code "Failed to fetch from the remote @git_remote_name@'" ) endif() @@ -128,12 +136,15 @@ if(git_update_strategy MATCHES "^REBASE(_CHECKOUT)?$") else() execute_process( - COMMAND "@git_EXECUTABLE@" for-each-ref "--format='%(upstream:short)'" "${current_branch}" + COMMAND "@git_EXECUTABLE@" for-each-ref + "--format='%(upstream:short)'" "${current_branch}" WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code # There is no error if no upstream is set OUTPUT_VARIABLE upstream_branch OUTPUT_STRIP_TRAILING_WHITESPACE - COMMAND_ERROR_IS_FATAL ANY # There is no error if no upstream is set + ${capture_error_only} ) + _ep_command_check_result(error_code) if(NOT upstream_branch STREQUAL checkout_name) # Not safe to rebase when asked to checkout a different branch to the one # we are tracking. If we did rebase, we could end up with arbitrary @@ -145,7 +156,9 @@ if(git_update_strategy MATCHES "^REBASE(_CHECKOUT)?$") endif() elseif(NOT git_update_strategy STREQUAL "CHECKOUT") - message(FATAL_ERROR "Unsupported git update strategy: ${git_update_strategy}") + _ep_message_quiet_capture(FATAL_ERROR + "Unsupported git update strategy: ${git_update_strategy}" + ) endif() @@ -155,10 +168,9 @@ execute_process( WORKING_DIRECTORY "@work_dir@" RESULT_VARIABLE error_code OUTPUT_VARIABLE repo_status + ${capture_error_only} ) -if(error_code) - message(FATAL_ERROR "Failed to get the status") -endif() +_ep_command_check_result(error_code "Failed to get the status") string(LENGTH "${repo_status}" need_stash) # If not in clean state, stash changes in order to be able to perform a @@ -167,16 +179,20 @@ if(need_stash) execute_process( COMMAND "@git_EXECUTABLE@" stash save @git_stash_save_options@ WORKING_DIRECTORY "@work_dir@" - COMMAND_ERROR_IS_FATAL ANY + RESULT_VARIABLE error_code + ${capture_output} ) + _ep_command_check_result(error_code) endif() if(git_update_strategy STREQUAL "CHECKOUT") execute_process( COMMAND "@git_EXECUTABLE@" checkout "${checkout_name}" WORKING_DIRECTORY "@work_dir@" - COMMAND_ERROR_IS_FATAL ANY + RESULT_VARIABLE error_code + ${capture_output} ) + _ep_command_check_result(error_code) else() execute_process( COMMAND "@git_EXECUTABLE@" rebase "${checkout_name}" @@ -198,12 +214,14 @@ else() execute_process( COMMAND "@git_EXECUTABLE@" stash pop --index --quiet WORKING_DIRECTORY "@work_dir@" - ) + ) endif() - message(FATAL_ERROR "\nFailed to rebase in: '@work_dir@'." - "\nOutput from the attempted rebase follows:" - "\n${rebase_output}" - "\n\nYou will have to resolve the conflicts manually") + _ep_message_quiet_capture(FATAL_ERROR + "\nFailed to rebase in: '@work_dir@'." + "\nOutput from the attempted rebase follows:" + "\n${rebase_output}" + "\n\nYou will have to resolve the conflicts manually" + ) endif() # Fall back to checkout. We create an annotated tag so that the user @@ -215,21 +233,27 @@ else() set(tag_name _cmake_ExternalProject_moved_from_here_${tag_timestamp}Z) set(error_log_file ${CMAKE_CURRENT_LIST_DIR}/rebase_error_${tag_timestamp}Z.log) file(WRITE ${error_log_file} "${rebase_output}") - message(WARNING "Rebase failed, output has been saved to ${error_log_file}" - "\nFalling back to checkout, previous commit tagged as ${tag_name}") + _ep_message_quiet_capture(WARNING + "Rebase failed, output has been saved to ${error_log_file}" + "\nFalling back to checkout, previous commit tagged as ${tag_name}" + ) execute_process( COMMAND "@git_EXECUTABLE@" tag -a -m "ExternalProject attempting to move from here to ${checkout_name}" ${tag_name} WORKING_DIRECTORY "@work_dir@" - COMMAND_ERROR_IS_FATAL ANY + RESULT_VARIABLE error_code + ${capture_output} ) + _ep_command_check_result(error_code) execute_process( COMMAND "@git_EXECUTABLE@" checkout "${checkout_name}" WORKING_DIRECTORY "@work_dir@" - COMMAND_ERROR_IS_FATAL ANY + RESULT_VARIABLE error_code + ${capture_output} ) + _ep_command_check_result(error_code) endif() endif() @@ -239,30 +263,42 @@ if(need_stash) COMMAND "@git_EXECUTABLE@" stash pop --index --quiet WORKING_DIRECTORY "@work_dir@" RESULT_VARIABLE error_code - ) + ${capture_output} + ) + _ep_accumulate_captured_output() if(error_code) # Stash pop --index failed: Try again dropping the index execute_process( COMMAND "@git_EXECUTABLE@" reset --hard --quiet WORKING_DIRECTORY "@work_dir@" + ${capture_output} ) + _ep_accumulate_captured_output() execute_process( COMMAND "@git_EXECUTABLE@" stash pop --quiet WORKING_DIRECTORY "@work_dir@" RESULT_VARIABLE error_code + ${capture_output} ) + _ep_accumulate_captured_output() if(error_code) # Stash pop failed: Restore previous state. execute_process( COMMAND "@git_EXECUTABLE@" reset --hard --quiet ${head_sha} WORKING_DIRECTORY "@work_dir@" + ${capture_output} ) + _ep_accumulate_captured_output() execute_process( COMMAND "@git_EXECUTABLE@" stash pop --index --quiet WORKING_DIRECTORY "@work_dir@" + ${capture_output} + ) + _ep_accumulate_captured_output() + _ep_message_quiet_capture(FATAL_ERROR + "Failed to unstash changes in: '@work_dir@'.\n" + "You will have to resolve the conflicts manually" ) - message(FATAL_ERROR "\nFailed to unstash changes in: '@work_dir@'." - "\nYou will have to resolve the conflicts manually") endif() endif() endif() @@ -272,6 +308,8 @@ if(init_submodules) execute_process( COMMAND "@git_EXECUTABLE@" submodule update @git_submodules_recurse@ --init @git_submodules@ WORKING_DIRECTORY "@work_dir@" - COMMAND_ERROR_IS_FATAL ANY + RESULT_VARIABLE error_code + ${capture_output} ) + _ep_command_check_result(error_code) endif() diff --git a/Modules/ExternalProject/hgclone.cmake.in b/Modules/ExternalProject/hgclone.cmake.in index 09395cc..5561955 100644 --- a/Modules/ExternalProject/hgclone.cmake.in +++ b/Modules/ExternalProject/hgclone.cmake.in @@ -3,43 +3,56 @@ cmake_minimum_required(VERSION 3.5) +set(quiet "@quiet@") +set(script_dir "@CMAKE_CURRENT_FUNCTION_LIST_DIR@/ExternalProject") +include(${script_dir}/captured_process_setup.cmake) + if(NOT "@hgclone_infofile@" IS_NEWER_THAN "@hgclone_stampfile@") - message(STATUS "Avoiding repeated hg clone, stamp file is up to date: '@hgclone_stampfile@'") + if(NOT quiet) + message(STATUS + "Avoiding repeated hg clone, stamp file is up to date: " + "'@hgclone_stampfile@'" + ) + endif() return() endif() execute_process( COMMAND ${CMAKE_COMMAND} -E rm -rf "@source_dir@" RESULT_VARIABLE error_code - ) -if(error_code) - message(FATAL_ERROR "Failed to remove directory: '@source_dir@'") -endif() + ${capture_output} +) +_ep_command_check_result( + error_code "Failed to remove directory: '@source_dir@'" +) execute_process( COMMAND "@hg_EXECUTABLE@" clone -U "@hg_repository@" "@src_name@" WORKING_DIRECTORY "@work_dir@" RESULT_VARIABLE error_code - ) -if(error_code) - message(FATAL_ERROR "Failed to clone repository: '@hg_repository@'") -endif() + ${capture_output} +) +_ep_command_check_result( + error_code "Failed to clone repository: '@hg_repository@'" +) execute_process( COMMAND "@hg_EXECUTABLE@" update @hg_tag@ WORKING_DIRECTORY "@work_dir@/@src_name@" RESULT_VARIABLE error_code - ) -if(error_code) - message(FATAL_ERROR "Failed to checkout tag: '@hg_tag@'") -endif() + ${capture_output} +) +_ep_command_check_result( + error_code "Failed to checkout tag: '@hg_tag@'" +) # Complete success, update the script-last-run stamp file: # execute_process( COMMAND ${CMAKE_COMMAND} -E copy "@hgclone_infofile@" "@hgclone_stampfile@" RESULT_VARIABLE error_code - ) -if(error_code) - message(FATAL_ERROR "Failed to copy script-last-run stamp file: '@hgclone_stampfile@'") -endif() + ${capture_output} +) +_ep_command_check_result( + error_code "Failed to copy script-last-run stamp file: '@hgclone_stampfile@'" +) diff --git a/Modules/ExternalProject/hgupdate.cmake.in b/Modules/ExternalProject/hgupdate.cmake.in index f88e1ee..a82a819 100644 --- a/Modules/ExternalProject/hgupdate.cmake.in +++ b/Modules/ExternalProject/hgupdate.cmake.in @@ -3,14 +3,22 @@ cmake_minimum_required(VERSION 3.19) +set(quiet "@quiet@") +set(script_dir "@CMAKE_CURRENT_FUNCTION_LIST_DIR@/ExternalProject") +include(${script_dir}/captured_process_setup.cmake) + execute_process( COMMAND "@hg_EXECUTABLE@" pull - COMMAND_ERROR_IS_FATAL ANY WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + ${capture_output} ) +_ep_command_check_result(error_code) execute_process( COMMAND "@hg_EXECUTABLE@" update @hg_tag@ - COMMAND_ERROR_IS_FATAL ANY WORKING_DIRECTORY "@work_dir@" + RESULT_VARIABLE error_code + ${capture_output} ) +_ep_command_check_result(error_code) diff --git a/Modules/ExternalProject/verify.cmake.in b/Modules/ExternalProject/verify.cmake.in index f37059b..cd34ba9 100644 --- a/Modules/ExternalProject/verify.cmake.in +++ b/Modules/ExternalProject/verify.cmake.in @@ -3,6 +3,10 @@ cmake_minimum_required(VERSION 3.5) +set(quiet "@quiet@") +set(script_dir "@CMAKE_CURRENT_FUNCTION_LIST_DIR@/ExternalProject") +include(${script_dir}/captured_process_setup.cmake) + if("@LOCAL@" STREQUAL "") message(FATAL_ERROR "LOCAL can't be empty") endif() @@ -13,22 +17,27 @@ endif() function(do_verify) if("@ALGO@" STREQUAL "") - message(WARNING "File will not be verified since no URL_HASH specified") + _ep_message_quiet_capture(WARNING + "File will not be verified since no URL_HASH specified" + ) + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) return() endif() if("@EXPECT_VALUE@" STREQUAL "") - message(FATAL_ERROR "EXPECT_VALUE can't be empty") + _ep_message_quiet_capture(FATAL_ERROR "EXPECT_VALUE can't be empty") endif() - message(STATUS + _ep_message_quiet_capture(STATUS "verifying file... - file='@LOCAL@'") + file='@LOCAL@'" + ) + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) file("@ALGO@" "@LOCAL@" actual_value) if(NOT "${actual_value}" STREQUAL "@EXPECT_VALUE@") - message(FATAL_ERROR + _ep_message_quiet_capture(FATAL_ERROR "error: @ALGO@ hash of @LOCAL@ does not match expected value @@ -37,7 +46,8 @@ does not match expected value ") endif() - message(STATUS "verifying file... done") + _ep_message_quiet_capture(STATUS "verifying file... done") + set(accumulated_output "${accumulated_output}" PARENT_SCOPE) endfunction() do_verify() |