mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-01 03:29:18 -05:00
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
This commit is contained in:
@@ -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()
|
||||
@@ -0,0 +1,8 @@
|
||||
|
||||
execute_process(
|
||||
COMMAND @this_command@
|
||||
WORKING_DIRECTORY "@work_dir@"
|
||||
RESULT_VARIABLE result
|
||||
${capture_output}
|
||||
)
|
||||
_ep_command_check_result(result)
|
||||
@@ -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)
|
||||
@@ -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}
|
||||
"
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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@'"
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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@'"
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user