mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-20 11:05:54 +00:00
A bridge connects two blockchains: a locking chain and an issuing chain (also called a mainchain and a sidechain). Both are independent ledgers, with their own validators and potentially their own custom transactions. Importantly, there is a way to move assets from the locking chain to the issuing chain and a way to return those assets from the issuing chain back to the locking chain: the bridge. This key operation is called a cross-chain transfer. A cross-chain transfer is not a single transaction. It happens on two chains, requires multiple transactions, and involves an additional server type called a "witness". A bridge does not exchange assets between two ledgers. Instead, it locks assets on one ledger (the "locking chain") and represents those assets with wrapped assets on another chain (the "issuing chain"). A good model to keep in mind is a box with an infinite supply of wrapped assets. Putting an asset from the locking chain into the box will release a wrapped asset onto the issuing chain. Putting a wrapped asset from the issuing chain back into the box will release one of the existing locking chain assets back onto the locking chain. There is no other way to get assets into or out of the box. Note that there is no way for the box to "run out of" wrapped assets - it has an infinite supply. Co-authored-by: Gregory Popovitch <greg7mdp@gmail.com>
210 lines
6.7 KiB
CMake
210 lines
6.7 KiB
CMake
|
|
macro(group_sources_in source_dir curdir)
|
|
file(GLOB children RELATIVE ${source_dir}/${curdir}
|
|
${source_dir}/${curdir}/*)
|
|
foreach (child ${children})
|
|
if (IS_DIRECTORY ${source_dir}/${curdir}/${child})
|
|
group_sources_in(${source_dir} ${curdir}/${child})
|
|
else()
|
|
string(REPLACE "/" "\\" groupname ${curdir})
|
|
source_group(${groupname} FILES
|
|
${source_dir}/${curdir}/${child})
|
|
endif()
|
|
endforeach()
|
|
endmacro()
|
|
|
|
macro(group_sources curdir)
|
|
group_sources_in(${PROJECT_SOURCE_DIR} ${curdir})
|
|
endmacro()
|
|
|
|
macro (exclude_from_default target_)
|
|
if(target_)
|
|
set_target_properties (${target_} PROPERTIES EXCLUDE_FROM_ALL ON)
|
|
set_target_properties (${target_} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON)
|
|
endif()
|
|
endmacro ()
|
|
|
|
macro (exclude_if_included target_)
|
|
get_directory_property(has_parent PARENT_DIRECTORY)
|
|
if (has_parent)
|
|
exclude_from_default (${target_})
|
|
endif ()
|
|
endmacro ()
|
|
|
|
function (print_ep_logs _target)
|
|
ExternalProject_Get_Property (${_target} STAMP_DIR)
|
|
add_custom_command(TARGET ${_target} POST_BUILD
|
|
COMMENT "${_target} BUILD OUTPUT"
|
|
COMMAND ${CMAKE_COMMAND}
|
|
-DIN_FILE=${STAMP_DIR}/${_target}-build-out.log
|
|
-P ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/echo_file.cmake
|
|
COMMAND ${CMAKE_COMMAND}
|
|
-DIN_FILE=${STAMP_DIR}/${_target}-build-err.log
|
|
-P ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/echo_file.cmake)
|
|
endfunction ()
|
|
|
|
#[=========================================================[
|
|
This is a function override for one function in the
|
|
standard ExternalProject module. We want to change
|
|
the generated build script slightly to include printing
|
|
the build logs in the case of failure. Those modifications
|
|
have been made here. This function override could break
|
|
in the future if the ExternalProject module changes internal
|
|
function names or changes the way it generates the build
|
|
scripts.
|
|
See:
|
|
https://gitlab.kitware.com/cmake/cmake/blob/df1ddeec128d68cc636f2dde6c2acd87af5658b6/Modules/ExternalProject.cmake#L1855-1952
|
|
#]=========================================================]
|
|
|
|
function(_ep_write_log_script name step cmd_var)
|
|
ExternalProject_Get_Property(${name} stamp_dir)
|
|
set(command "${${cmd_var}}")
|
|
|
|
set(make "")
|
|
set(code_cygpath_make "")
|
|
if(command MATCHES "^\\$\\(MAKE\\)")
|
|
# GNU make recognizes the string "$(MAKE)" as recursive make, so
|
|
# ensure that it appears directly in the makefile.
|
|
string(REGEX REPLACE "^\\$\\(MAKE\\)" "\${make}" command "${command}")
|
|
set(make "-Dmake=$(MAKE)")
|
|
|
|
if(WIN32 AND NOT CYGWIN)
|
|
set(code_cygpath_make "
|
|
if(\${make} MATCHES \"^/\")
|
|
execute_process(
|
|
COMMAND cygpath -w \${make}
|
|
OUTPUT_VARIABLE cygpath_make
|
|
ERROR_VARIABLE cygpath_make
|
|
RESULT_VARIABLE cygpath_error
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
if(NOT cygpath_error)
|
|
set(make \${cygpath_make})
|
|
endif()
|
|
endif()
|
|
")
|
|
endif()
|
|
endif()
|
|
|
|
set(config "")
|
|
if("${CMAKE_CFG_INTDIR}" MATCHES "^\\$")
|
|
string(REPLACE "${CMAKE_CFG_INTDIR}" "\${config}" command "${command}")
|
|
set(config "-Dconfig=${CMAKE_CFG_INTDIR}")
|
|
endif()
|
|
|
|
# Wrap multiple 'COMMAND' lines up into a second-level wrapper
|
|
# script so all output can be sent to one log file.
|
|
if(command MATCHES "(^|;)COMMAND;")
|
|
set(code_execute_process "
|
|
${code_cygpath_make}
|
|
execute_process(COMMAND \${command} RESULT_VARIABLE result)
|
|
if(result)
|
|
set(msg \"Command failed (\${result}):\\n\")
|
|
foreach(arg IN LISTS command)
|
|
set(msg \"\${msg} '\${arg}'\")
|
|
endforeach()
|
|
message(FATAL_ERROR \"\${msg}\")
|
|
endif()
|
|
")
|
|
set(code "")
|
|
set(cmd "")
|
|
set(sep "")
|
|
foreach(arg IN LISTS command)
|
|
if("x${arg}" STREQUAL "xCOMMAND")
|
|
if(NOT "x${cmd}" STREQUAL "x")
|
|
string(APPEND code "set(command \"${cmd}\")${code_execute_process}")
|
|
endif()
|
|
set(cmd "")
|
|
set(sep "")
|
|
else()
|
|
string(APPEND cmd "${sep}${arg}")
|
|
set(sep ";")
|
|
endif()
|
|
endforeach()
|
|
string(APPEND code "set(command \"${cmd}\")${code_execute_process}")
|
|
file(GENERATE OUTPUT "${stamp_dir}/${name}-${step}-$<CONFIG>-impl.cmake" CONTENT "${code}")
|
|
set(command ${CMAKE_COMMAND} "-Dmake=\${make}" "-Dconfig=\${config}" -P ${stamp_dir}/${name}-${step}-$<CONFIG>-impl.cmake)
|
|
endif()
|
|
|
|
# Wrap the command in a script to log output to files.
|
|
set(script ${stamp_dir}/${name}-${step}-$<CONFIG>.cmake)
|
|
set(logbase ${stamp_dir}/${name}-${step})
|
|
set(code "
|
|
${code_cygpath_make}
|
|
function (_echo_file _fil)
|
|
file (READ \${_fil} _cont)
|
|
execute_process (COMMAND \${CMAKE_COMMAND} -E echo \"\${_cont}\")
|
|
endfunction ()
|
|
set(command \"${command}\")
|
|
execute_process(
|
|
COMMAND \${command}
|
|
RESULT_VARIABLE result
|
|
OUTPUT_FILE \"${logbase}-out.log\"
|
|
ERROR_FILE \"${logbase}-err.log\"
|
|
)
|
|
if(result)
|
|
set(msg \"Command failed: \${result}\\n\")
|
|
foreach(arg IN LISTS command)
|
|
set(msg \"\${msg} '\${arg}'\")
|
|
endforeach()
|
|
execute_process (COMMAND \${CMAKE_COMMAND} -E echo \"Build output for ${logbase} : \")
|
|
_echo_file (\"${logbase}-out.log\")
|
|
_echo_file (\"${logbase}-err.log\")
|
|
set(msg \"\${msg}\\nSee above\\n\")
|
|
message(FATAL_ERROR \"\${msg}\")
|
|
else()
|
|
set(msg \"${name} ${step} command succeeded. See also ${logbase}-*.log\")
|
|
message(STATUS \"\${msg}\")
|
|
endif()
|
|
")
|
|
file(GENERATE OUTPUT "${script}" CONTENT "${code}")
|
|
set(command ${CMAKE_COMMAND} ${make} ${config} -P ${script})
|
|
set(${cmd_var} "${command}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
find_package(Git)
|
|
|
|
# function that calls git log to get current hash
|
|
function (git_hash hash_val)
|
|
# note: optional second extra string argument not in signature
|
|
if (NOT GIT_FOUND)
|
|
return ()
|
|
endif ()
|
|
set (_hash "")
|
|
set (_format "%H")
|
|
if (ARGC GREATER_EQUAL 2)
|
|
string (TOLOWER ${ARGV1} _short)
|
|
if (_short STREQUAL "short")
|
|
set (_format "%h")
|
|
endif ()
|
|
endif ()
|
|
execute_process (COMMAND ${GIT_EXECUTABLE} "log" "--pretty=${_format}" "-n1"
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
RESULT_VARIABLE _git_exit_code
|
|
OUTPUT_VARIABLE _temp_hash
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
ERROR_QUIET)
|
|
if (_git_exit_code EQUAL 0)
|
|
set (_hash ${_temp_hash})
|
|
endif ()
|
|
set (${hash_val} "${_hash}" PARENT_SCOPE)
|
|
endfunction ()
|
|
|
|
function (git_branch branch_val)
|
|
if (NOT GIT_FOUND)
|
|
return ()
|
|
endif ()
|
|
set (_branch "")
|
|
execute_process (COMMAND ${GIT_EXECUTABLE} "rev-parse" "--abbrev-ref" "HEAD"
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
RESULT_VARIABLE _git_exit_code
|
|
OUTPUT_VARIABLE _temp_branch
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
ERROR_QUIET)
|
|
if (_git_exit_code EQUAL 0)
|
|
set (_branch ${_temp_branch})
|
|
endif ()
|
|
set (${branch_val} "${_branch}" PARENT_SCOPE)
|
|
endfunction ()
|
|
|