Commits (20)
if (CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS "3.12")
cmake_minimum_required(VERSION 3.12)
if (CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS "3.18")
cmake_minimum_required(VERSION 3.18 FATAL_ERROR)
endif ()
if (POLICY CMP0114)
......@@ -71,7 +71,7 @@ if(BUILD_SHARED_LIBS AND NOT CMAKE_POSITION_INDEPENDENT_CODE)
if (NOT _superbuild_no_static_everywhere)
message(WARNING "Forcing CMAKE_POSITION_INDEPENDENT_CODE to be ON as required by BUILD_SHARED_LIBS.")
endif ()
set_property(CACHE CMAKE_POSITION_INDEPENDENT_CODE PROPERTY VALUE ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()
#-----------------------------------------------------------------------------
......
......@@ -6,7 +6,7 @@ additional support for managing environments, parallel build settings, download
management, and output suppression.
#]==]
if (CMAKE_VERSION VERSION_LESS "3.17")
if (CMAKE_VERSION VERSION_LESS "3.20")
# Needed for fixes.
include("${CMAKE_CURRENT_LIST_DIR}/patches/ExternalProject.cmake")
else ()
......@@ -31,10 +31,6 @@ if (CMAKE_GENERATOR MATCHES "Makefiles")
set(superbuild_make_program "${CMAKE_MAKE_PROGRAM}")
endif ()
# Add `PROCESS_ENVIRONMENT` to the list of keywords.
string(REPLACE ")" "|PROCESS_ENVIRONMENT)"
_ep_keywords__superbuild_ExternalProject_add "${_ep_keywords_ExternalProject_Add}")
add_custom_target(download-all)
set(old_policy_114 1)
......@@ -72,10 +68,12 @@ function (_superbuild_ep_strip_extra_arguments name)
set(arguments)
set(accumulate FALSE)
_ep_get_add_keywords(keywords)
foreach (arg IN LISTS ARGN)
if (arg STREQUAL "PROCESS_ENVIRONMENT")
set(skip TRUE)
elseif (arg MATCHES "${_ep_keywords_ExternalProject_Add}")
elseif (arg IN_LIST keywords)
set(skip FALSE)
endif ()
......@@ -141,7 +139,10 @@ endfunction ()
function (_superbuild_ExternalProject_add name)
# Create a temporary target so we can query target properties.
add_custom_target("sb-${name}")
_ep_parse_arguments(_superbuild_ExternalProject_add "sb-${name}" _EP_ "${ARGN}")
_ep_get_add_keywords(keywords)
list(APPEND keywords
PROCESS_ENVIRONMENT)
_ep_parse_arguments("${keywords}" "sb-${name}" _EP_ "${ARGN}")
get_property(has_process_environment TARGET "sb-${name}"
PROPERTY _EP_PROCESS_ENVIRONMENT SET)
......@@ -168,10 +169,15 @@ function (_superbuild_ExternalProject_add name)
"${install_command}")
# Now strip `PROCESS_ENVIRONMENT` and commands from arguments.
set(skippable_args
PROCESS_ENVIRONMENT
BUILD_COMMAND
INSTALL_COMMAND
CONFIGURE_COMMAND)
set(skip FALSE)
foreach (arg IN LISTS ARGN)
if (arg MATCHES "${_ep_keywords__superbuild_ExternalProject_add}")
if (arg MATCHES "^(PROCESS_ENVIRONMENT|BUILD_COMMAND|INSTALL_COMMAND|CONFIGURE_COMMAND)$")
if (arg IN_LIST keywords)
if (arg IN_LIST skippable_args)
set(skip TRUE)
else ()
set(skip FALSE)
......
......@@ -116,10 +116,15 @@ function (superbuild_add_project name)
set(help_string)
set(depends)
set(optional_depends)
set(process_environment)
set(ep_arguments)
set(grab)
_ep_get_add_keywords(keywords)
list(APPEND keywords
PROCESS_ENVIRONMENT)
foreach (arg IN LISTS ARGN)
if (arg STREQUAL "CAN_USE_SYSTEM")
set(can_use_system TRUE)
......@@ -145,7 +150,7 @@ function (superbuild_add_project name)
set(grab depends)
elseif (arg STREQUAL "DEPENDS_OPTIONAL")
set(grab optional_depends)
elseif (arg MATCHES "${_ep_keywords__superbuild_ExternalProject_add}")
elseif (arg IN_LIST keywords)
set(grab ep_arguments)
list(APPEND ep_arguments
"${arg}")
......@@ -394,6 +399,70 @@ function (superbuild_require_python_package _name package)
"${ARGN}")
endfunction ()
#[==[.md
### `pyproject.toml`
```
superbuild_add_project_python_toml(<NAME> <ARG>...)
```
Same as `superbuild_add_project`, but sets build commands to
work properly out of the box for `pyproject.toml`.
#]==]
macro (superbuild_add_project_python_toml _name)
cmake_parse_arguments(_superbuild_python_project
""
"PACKAGE"
""
${ARGN})
if (NOT DEFINED _superbuild_python_project_PACKAGE)
message(FATAL_ERROR
"Python requires that projects have a package specified")
endif ()
if (SUPERBUILD_SKIP_PYTHON_PROJECTS)
superbuild_require_python_package("${_name}" "${_superbuild_python_project_PACKAGE}")
else ()
if (WIN32)
if (python3_enabled OR ENABLE_python3)
set(_superbuild_python_args
"--prefix=Python")
else ()
set(_superbuild_python_args
"--prefix=bin")
endif ()
else ()
set(_superbuild_python_args
"--prefix=.")
endif ()
set (extra_dependencies)
if (ENABLE_python3 OR python3_enabled)
set(extra_dependencies "python3")
else()
set(extra_dependencies "python2")
endif()
superbuild_add_project("${_name}"
BUILD_IN_SOURCE 1
DEPENDS python ${extra_dependencies} ${_superbuild_python_project_UNPARSED_ARGUMENTS}
CONFIGURE_COMMAND
""
BUILD_COMMAND
""
INSTALL_COMMAND
${superbuild_python_pip}
install
--no-index
--no-deps
--root=<INSTALL_DIR>
${_superbuild_python_args}
${${_name}_python_install_args}
.)
endif ()
endmacro ()
#[==[.md
### Wheels
......@@ -423,6 +492,7 @@ macro (superbuild_add_project_python_wheel _name)
${superbuild_python_pip}
install
--no-index
--no-deps
--prefix=<INSTALL_DIR>
"<DOWNLOADED_FILE>")
endmacro ()
......
# 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)
if("@LOCAL@" STREQUAL "")
message(FATAL_ERROR "LOCAL can't be empty")
endif()
if(NOT EXISTS "@LOCAL@")
message(FATAL_ERROR "File not found: @LOCAL@")
endif()
if("@ALGO@" STREQUAL "")
message(WARNING "File will not be verified since no URL_HASH specified")
return()
endif()
if("@EXPECT_VALUE@" STREQUAL "")
message(FATAL_ERROR "EXPECT_VALUE can't be empty")
endif()
message(STATUS "verifying file...
file='@LOCAL@'")
file("@ALGO@" "@LOCAL@" actual_value)
if(NOT "${actual_value}" STREQUAL "@EXPECT_VALUE@")
message(FATAL_ERROR "error: @ALGO@ hash of
@LOCAL@
does not match expected value
expected: '@EXPECT_VALUE@'
actual: '${actual_value}'
")
endif()
message(STATUS "verifying file... done")
This diff is collapsed.
# 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()
# 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)
file(REMOVE_RECURSE "@to_dir@")
# Copy the _contents_ of the source dir into the destination dir, hence the
# trailing slash on the from_dir
file(COPY "@from_dir@/" DESTINATION "@to_dir@")
execute_process(
COMMAND @this_command@
WORKING_DIRECTORY "@work_dir@"
RESULT_VARIABLE result
${capture_output}
)
_ep_command_check_result(result)
# 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()
......@@ -79,84 +89,117 @@ if("@REMOTE@" STREQUAL "")
message(FATAL_ERROR "REMOTE can't be empty")
endif()
if(EXISTS "@LOCAL@")
check_file_hash(has_hash hash_is_good)
if(has_hash)
if(hash_is_good)
message(STATUS "File already exists and hash match (skip download):
function(download_and_verify)
if(EXISTS "@LOCAL@")
check_file_hash(has_hash hash_is_good)
if(has_hash)
if(hash_is_good)
_ep_message_quiet_capture(STATUS
"File already exists and hash match (skip download):
file='@LOCAL@'
@ALGO@='@EXPECT_VALUE@'"
)
return()
)
set(accumulated_output "${accumulated_output}" PARENT_SCOPE)
return()
else()
_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 "File already exists but hash mismatch. Removing...")
file(REMOVE "@LOCAL@")
endif()
else()
message(STATUS "File already exists but no hash specified (use URL_HASH):
_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."
)
file(REMOVE "@LOCAL@")
)
file(REMOVE "@LOCAL@")
endif()
endif()
endif()
set(retry_number 5)
set(retry_number 5)
message(STATUS "Downloading...
_ep_message_quiet_capture(STATUS "Downloading...
dst='@LOCAL@'
timeout='@TIMEOUT_MSG@'"
)
foreach(i RANGE ${retry_number})
sleep_before_download(${i})
foreach(url @REMOTE@)
message(STATUS "Using src='${url}'")
@TLS_VERIFY_CODE@
@TLS_CAINFO_CODE@
@NETRC_CODE@
@NETRC_FILE_CODE@
file(
DOWNLOAD
"${url}" "@LOCAL@"
@SHOW_PROGRESS@
@TIMEOUT_ARGS@
STATUS status
LOG log
@USERPWD_ARGS@
@HTTP_HEADERS_ARGS@
)
list(GET status 0 status_code)
list(GET status 1 status_string)
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...")
file(REMOVE "@LOCAL@")
else()
message(STATUS "Downloading... done")
return()
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)
foreach(i RANGE ${retry_number})
if(status_code IN_LIST download_retry_codes)
sleep_before_download(${i})
endif()
foreach(url @REMOTE@)
if(NOT url IN_LIST skip_url_list)
_ep_message_quiet_capture(STATUS "Using src='${url}'")
set(accumulated_output "${accumulated_output}" PARENT_SCOPE)
@TLS_VERIFY_CODE@
@TLS_CAINFO_CODE@
@NETRC_CODE@
@NETRC_FILE_CODE@
file(
DOWNLOAD
"${url}" "@LOCAL@"
@SHOW_PROGRESS@
@TIMEOUT_ARGS@
@INACTIVITY_TIMEOUT_ARGS@
STATUS status
LOG log
@USERPWD_ARGS@
@HTTP_HEADERS_ARGS@
)
list(GET status 0 status_code)
list(GET status 1 status_string)
if(status_code EQUAL 0)
check_file_hash(has_hash hash_is_good)
if(has_hash AND NOT hash_is_good)
_ep_message_quiet_capture(STATUS "Hash mismatch, removing...")
set(accumulated_output "${accumulated_output}" PARENT_SCOPE)
file(REMOVE "@LOCAL@")
else()
_ep_message_quiet_capture(STATUS "Downloading... done")
set(accumulated_output "${accumulated_output}" PARENT_SCOPE)
return()
endif()
else()
string(APPEND logFailedURLs
"error: downloading '${url}' failed
status_code: ${status_code}
status_string: ${status_string}
log:
--- LOG BEGIN ---
${log}
--- LOG END ---
"
)
if(NOT status_code IN_LIST download_retry_codes)
list(APPEND skip_url_list "${url}")
break()
endif()
endif()
else()
string(APPEND logFailedURLs "error: downloading '${url}' failed
status_code: ${status_code}
status_string: ${status_string}
log:
--- LOG BEGIN ---
${log}
--- LOG END ---
"
)
endif()
endforeach()
endforeach()
endforeach()
message(FATAL_ERROR "Each download failed!
_ep_message_quiet_capture(FATAL_ERROR
"Each download failed!
${logFailedURLs}
"
)
)
endfunction()
download_and_verify()
set(extract_script @extract_script_filename@)
if(NOT "${extract_script}" STREQUAL "")
include(${extract_script})
endif()
# 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)
# Make file names absolute:
#
get_filename_component(filename "@filename@" ABSOLUTE)
get_filename_component(directory "@directory@" ABSOLUTE)
_ep_message_quiet_capture(STATUS "extracting...
src='${filename}'
dst='${directory}'"
)
if(NOT EXISTS "${filename}")
_ep_message_quiet_capture(FATAL_ERROR
"File to extract does not exist: '${filename}'"
)
endif()
# Prepare a space for extracting:
#
set(i 1234)
while(EXISTS "${directory}/../ex-@name@${i}")
math(EXPR i "${i} + 1")
endwhile()
set(ut_dir "${directory}/../ex-@name@${i}")
file(MAKE_DIRECTORY "${ut_dir}")
# Extract it:
#
_ep_message_quiet_capture(STATUS "extracting... [tar @args@]")
execute_process(COMMAND ${CMAKE_COMMAND} -E tar @args@ ${filename}
WORKING_DIRECTORY ${ut_dir}
RESULT_VARIABLE rv
${capture_output}
)
_ep_accumulate_captured_output()
if(NOT rv EQUAL 0)
_ep_message_quiet_capture(STATUS "extracting... [error clean up]")
file(REMOVE_RECURSE "${ut_dir}")
_ep_message_quiet_capture(FATAL_ERROR "Extract of '${filename}' failed")
endif()
# Analyze what came out of the tar file:
#
_ep_message_quiet_capture(STATUS "extracting... [analysis]")
file(GLOB contents "${ut_dir}/*")
list(REMOVE_ITEM contents "${ut_dir}/.DS_Store")
list(LENGTH contents n)
if(NOT n EQUAL 1 OR NOT IS_DIRECTORY "${contents}")
set(contents "${ut_dir}")
endif()
# Move "the one" directory to the final directory:
#
_ep_message_quiet_capture(STATUS "extracting... [rename]")
file(REMOVE_RECURSE ${directory})
get_filename_component(contents ${contents} ABSOLUTE)
file(RENAME ${contents} ${directory})
# Clean up:
#
_ep_message_quiet_capture(STATUS "extracting... [clean up]")
file(REMOVE_RECURSE "${ut_dir}")
_ep_message_quiet_capture(STATUS "extracting... done")
# 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)
if(EXISTS "@gitclone_stampfile@" AND EXISTS "@gitclone_infofile@" AND
"@gitclone_stampfile@" IS_NEWER_THAN "@gitclone_infofile@")
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
${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@"
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)
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--@
WORKING_DIRECTORY "@work_dir@/@src_name@"
RESULT_VARIABLE error_code
${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@
WORKING_DIRECTORY "@work_dir@/@src_name@"
RESULT_VARIABLE error_code
${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:
#
execute_process(
COMMAND ${CMAKE_COMMAND} -E copy "@gitclone_infofile@" "@gitclone_stampfile@"
RESULT_VARIABLE error_code
${capture_output}
)
_ep_command_check_result(
error_code "Failed to copy script-last-run stamp file: '@gitclone_stampfile@'"
)
# 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)
function(get_hash_for_ref ref out_var err_var)
execute_process(
COMMAND "@git_EXECUTABLE@" rev-parse "${ref}"
WORKING_DIRECTORY "@work_dir@"
RESULT_VARIABLE error_code
OUTPUT_VARIABLE ref_hash
ERROR_VARIABLE error_msg
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(error_code)
set(${out_var} "" PARENT_SCOPE)
else()
set(${out_var} "${ref_hash}" PARENT_SCOPE)
endif()
set(${err_var} "${error_msg}" PARENT_SCOPE)
endfunction()
get_hash_for_ref(HEAD head_sha error_msg)
if(head_sha STREQUAL "")
message(FATAL_ERROR "Failed to get the hash for HEAD:\n${error_msg}")
endif()
execute_process(
COMMAND "@git_EXECUTABLE@" show-ref "@git_tag@"
WORKING_DIRECTORY "@work_dir@"
OUTPUT_VARIABLE show_ref_output
)
if(show_ref_output MATCHES "^[a-z0-9]+[ \\t]+refs/remotes/")
# Given a full remote/branch-name and we know about it already. Since
# branches can move around, we always have to fetch.
set(fetch_required YES)
set(checkout_name "@git_tag@")
elseif(show_ref_output MATCHES "^[a-z0-9]+[ \\t]+refs/tags/")
# Given a tag name that we already know about. We don't know if the tag we
# have matches the remote though (tags can move), so we should fetch.
set(fetch_required YES)
set(checkout_name "@git_tag@")
# Special case to preserve backward compatibility: if we are already at the
# same commit as the tag we hold locally, don't do a fetch and assume the tag
# hasn't moved on the remote.
# 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)
_ep_message_quiet_capture(VERBOSE "Already at requested tag: ${tag_sha}")
return()
endif()
elseif(show_ref_output MATCHES "^[a-z0-9]+[ \\t]+refs/heads/")
# Given a branch name without any remote and we already have a branch by that
# name. We might already have that branch checked out or it might be a
# different branch. It isn't safe to use a bare branch name without the
# remote, so do a fetch and replace the ref with one that includes the remote.
set(fetch_required YES)
set(checkout_name "@git_remote_name@/@git_tag@")
else()
get_hash_for_ref("@git_tag@" tag_sha error_msg)
if(tag_sha STREQUAL head_sha)
# Have the right commit checked out already
_ep_message_quiet_capture(VERBOSE "Already at requested ref: ${tag_sha}")
return()
elseif(tag_sha STREQUAL "")
# We don't know about this ref yet, so we have no choice but to fetch.
# We deliberately swallow any error message at the default log level
# because it can be confusing for users to see a failed git command.
# That failure is being handled here, so it isn't an error.
set(fetch_required YES)
set(checkout_name "@git_tag@")
if(NOT error_msg STREQUAL "")
_ep_message_quiet_capture(VERBOSE "${error_msg}")
endif()
else()
# We have the commit, so we know we were asked to find a commit hash
# (otherwise it would have been handled further above), but we don't
# have that commit checked out yet
set(fetch_required NO)
set(checkout_name "@git_tag@")
if(NOT error_msg STREQUAL "")
_ep_message_quiet_capture(WARNING "${error_msg}")
endif()
endif()
endif()
if(fetch_required)
_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@"
RESULT_VARIABLE error_code
${capture_output}
)
_ep_command_check_result(
error_code "Failed to fetch from the remote @git_remote_name@'"
)
endif()
set(git_update_strategy "@git_update_strategy@")
if(git_update_strategy STREQUAL "")
# Backward compatibility requires REBASE as the default behavior
set(git_update_strategy REBASE)
endif()
if(git_update_strategy MATCHES "^REBASE(_CHECKOUT)?$")
# Asked to potentially try to rebase first, maybe with fallback to checkout.
# We can't if we aren't already on a branch and we shouldn't if that local
# branch isn't tracking the one we want to checkout.
execute_process(
COMMAND "@git_EXECUTABLE@" symbolic-ref -q HEAD
WORKING_DIRECTORY "@work_dir@"
OUTPUT_VARIABLE current_branch
OUTPUT_STRIP_TRAILING_WHITESPACE
# Don't test for an error. If this isn't a branch, we get a non-zero error
# code but empty output.
)
if(current_branch STREQUAL "")
# Not on a branch, checkout is the only sensible option since any rebase
# would always fail (and backward compatibility requires us to checkout in
# this situation)
set(git_update_strategy CHECKOUT)
else()
execute_process(
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
${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
# commits added to the ref we were asked to checkout if the current local
# branch happens to be able to rebase onto the target branch. There would
# be no error message and the user wouldn't know this was occurring.
set(git_update_strategy CHECKOUT)
endif()
endif()
elseif(NOT git_update_strategy STREQUAL "CHECKOUT")
_ep_message_quiet_capture(FATAL_ERROR
"Unsupported git update strategy: ${git_update_strategy}"
)
endif()
# Check if stash is needed
execute_process(
COMMAND "@git_EXECUTABLE@" status --porcelain
WORKING_DIRECTORY "@work_dir@"
RESULT_VARIABLE error_code
OUTPUT_VARIABLE repo_status
${capture_error_only}
)
_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
# rebase or checkout without losing those changes permanently
if(need_stash)
execute_process(
COMMAND "@git_EXECUTABLE@" stash save @git_stash_save_options@
WORKING_DIRECTORY "@work_dir@"
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@"
RESULT_VARIABLE error_code
${capture_output}
)
_ep_command_check_result(error_code)
else()
execute_process(
COMMAND "@git_EXECUTABLE@" rebase "${checkout_name}"
WORKING_DIRECTORY "@work_dir@"
RESULT_VARIABLE error_code
OUTPUT_VARIABLE rebase_output
ERROR_VARIABLE rebase_output
)
if(error_code)
# Rebase failed, undo the rebase attempt before continuing
execute_process(
COMMAND "@git_EXECUTABLE@" rebase --abort
WORKING_DIRECTORY "@work_dir@"
)
if(NOT git_update_strategy STREQUAL "REBASE_CHECKOUT")
# Not allowed to do a checkout as a fallback, so cannot proceed
if(need_stash)
execute_process(
COMMAND "@git_EXECUTABLE@" stash pop --index --quiet
WORKING_DIRECTORY "@work_dir@"
)
endif()
_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
# can manually inspect the situation and revert if required.
# We can't log the failed rebase output because MSVC sees it and
# intervenes, causing the build to fail even though it completes.
# Write it to a file instead.
string(TIMESTAMP tag_timestamp "%Y%m%dT%H%M%S" UTC)
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}")
_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@"
RESULT_VARIABLE error_code
${capture_output}
)
_ep_command_check_result(error_code)
execute_process(
COMMAND "@git_EXECUTABLE@" checkout "${checkout_name}"
WORKING_DIRECTORY "@work_dir@"
RESULT_VARIABLE error_code
${capture_output}
)
_ep_command_check_result(error_code)
endif()
endif()
if(need_stash)
# Put back the stashed changes
execute_process(
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"
)
endif()
endif()
endif()
set(init_submodules "@init_submodules@")
if(init_submodules)
execute_process(
COMMAND "@git_EXECUTABLE@" submodule update @git_submodules_recurse@ --init @git_submodules@
WORKING_DIRECTORY "@work_dir@"
RESULT_VARIABLE error_code
${capture_output}
)
_ep_command_check_result(error_code)
endif()
# 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)
if(EXISTS "@hgclone_stampfile@" AND EXISTS "@hgclone_infofile@" AND
"@hgclone_stampfile@" IS_NEWER_THAN "@hgclone_infofile@")
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
${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
${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
${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
${capture_output}
)
_ep_command_check_result(
error_code "Failed to copy script-last-run stamp file: '@hgclone_stampfile@'"
)
# 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.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
WORKING_DIRECTORY "@work_dir@"
RESULT_VARIABLE error_code
${capture_output}
)
_ep_command_check_result(error_code)
execute_process(
COMMAND "@hg_EXECUTABLE@" update @hg_tag@
WORKING_DIRECTORY "@work_dir@"
RESULT_VARIABLE error_code
${capture_output}
)
_ep_command_check_result(error_code)
# 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)
file(MAKE_DIRECTORY
"@source_dir@"
"@binary_dir@"
"@install_dir@"
"@tmp_dir@"
"@stamp_dir@"
"@download_dir@"
"@log_dir@"
)
set(configSubDirs @CMAKE_CONFIGURATION_TYPES@)
foreach(subDir IN LISTS configSubDirs)
file(MAKE_DIRECTORY "@stamp_dir@/${subDir}")
endforeach()
# 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)
if("@LOCAL@" STREQUAL "")
message(FATAL_ERROR "LOCAL can't be empty")
endif()
if(NOT EXISTS "@LOCAL@")
message(FATAL_ERROR "File not found: @LOCAL@")
endif()
function(do_verify)
if("@ALGO@" STREQUAL "")
_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 "")
_ep_message_quiet_capture(FATAL_ERROR "EXPECT_VALUE can't be empty")
endif()
_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@")
_ep_message_quiet_capture(FATAL_ERROR
"error: @ALGO@ hash of
@LOCAL@
does not match expected value
expected: '@EXPECT_VALUE@'
actual: '${actual_value}'
")
endif()
_ep_message_quiet_capture(STATUS "verifying file... done")
set(accumulated_output "${accumulated_output}" PARENT_SCOPE)
endfunction()
do_verify()
set(extract_script "@extract_script_filename@")
if(NOT "${extract_script}" STREQUAL "")
include("${extract_script}")
endif()
......@@ -5,6 +5,7 @@ superbuild_add_project(hdf5
CMAKE_ARGS
-DBUILD_TESTING:BOOL=OFF
-DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
-DHDF5_BUILD_EXAMPLES:BOOL=OFF
-DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=TRUE
-DHDF5_ENABLE_SZIP_SUPPORT:BOOL=TRUE
-DHDF5_ENABLE_SZIP_ENCODING:BOOL=TRUE
......