summaryrefslogtreecommitdiffstats
path: root/Modules/ExternalProject
diff options
context:
space:
mode:
authorCraig Scott <craig.scott@crascit.com>2021-01-29 12:22:45 (GMT)
committerCraig Scott <craig.scott@crascit.com>2021-02-04 20:33:38 (GMT)
commit17e5516e608ba5c9c1f2dfad3d64f8f90874f108 (patch)
treeae0f88a262c3734cda45ee1040aee303e131d13d /Modules/ExternalProject
parent4f3d1abbb4dca3d1e6b019471fa5d8be296492e3 (diff)
downloadCMake-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.cmake55
-rw-r--r--Modules/ExternalProject/customcommand.cmake.in8
-rw-r--r--Modules/ExternalProject/customcommand_preamble.cmake.in8
-rw-r--r--Modules/ExternalProject/download.cmake.in46
-rw-r--r--Modules/ExternalProject/extractfile.cmake.in32
-rw-r--r--Modules/ExternalProject/gitclone.cmake.in77
-rw-r--r--Modules/ExternalProject/gitupdate.cmake.in92
-rw-r--r--Modules/ExternalProject/hgclone.cmake.in47
-rw-r--r--Modules/ExternalProject/hgupdate.cmake.in12
-rw-r--r--Modules/ExternalProject/verify.cmake.in22
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()