vcpkg/scripts/cmake/vcpkg_execute_required_process_repeat.cmake
nicole mazzuca d369df7ecf
[rollup:2021-07-06] Rollup PR (#18838)
* [rollup:2021-07-06 1/8] PR #18272 (@strega-nil)

[scripts-audit] vcpkg_from_*

* [rollup:2021-07-06 2/8] PR #18319 (@strega-nil)

[scripts-audit] add guidelines for cmake

* [rollup 2021-07-06 3/8] PR #18410 (@mheyman)

[vcpkg-cmake-config] documentation fix

* [rollup:2021-07-06 4/8] PR #18488 (@strega-nil)

[scripts-audit] vcpkg_execute_*

* [rollup:2021-07-06 5/8] PR #18517 (@strega-nil)

[scripts-audit] vcpkg_extract_source_archive

* [rollup:2021-07-06 6/8] PR #18674 (@NancyLi1013)

[vcpkg doc] Update examples

* [rollup:2021-07-06 7/8] PR #18695 (@JackBoosY)

[vcpkg] Update the minimum version of vcpkg

* [rollup:2021-07-06 8/8] PR #18758 (@ras0219-msft)

[vcpkg_from_git] Fix error if downloads folder does not exist

* build docs!

* fix bond:*-windows

* fix nmap

Co-authored-by: nicole mazzuca <mazzucan@outlook.com>
Co-authored-by: Michael Heyman <Michael.Heyman@jhuapl.edu>
Co-authored-by: NancyLi1013 <lirui09@beyondsoft.com>
Co-authored-by: JackBoosY <yuzaiyang@beyondsoft.com>
Co-authored-by: Robert Schumacher <ras0219@outlook.com>
2021-07-14 12:45:18 -07:00

85 lines
2.5 KiB
CMake

#[===[.md:
# vcpkg_execute_required_process_repeat
Execute a process until the command succeeds, or until the COUNT is reached.
## Usage
```cmake
vcpkg_execute_required_process_repeat(
COMMAND <cmd> [<arguments>]
COUNT <num>
WORKING_DIRECTORY <directory>
LOGNAME <name>
[ALLOW_IN_DOWNLOAD_MODE]
)
```
#]===]
function(vcpkg_execute_required_process_repeat)
cmake_parse_arguments(PARSE_ARGV 0 arg
"ALLOW_IN_DOWNLOAD_MODE"
"COUNT;WORKING_DIRECTORY;LOGNAME"
"COMMAND"
)
if(DEFINED arg_UNPARSED_ARGUMENTS)
message(WARNING "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
endif()
foreach(required_arg IN ITEMS COUNT WORKING_DIRECTORY LOGNAME COMMAND)
if(NOT DEFINED arg_${required_arg})
message(FATAL_ERROR "${required_arg} must be specified.")
endif()
endforeach()
# also checks for COUNT being an integer
if(NOT arg_COUNT GREATER_EQUAL "1")
message(FATAL_ERROR "COUNT (${arg_COUNT}) must be greater than or equal to 1.")
endif()
if (DEFINED VCPKG_DOWNLOAD_MODE AND NOT arg_ALLOW_IN_DOWNLOAD_MODE)
message(FATAL_ERROR
[[
This command cannot be executed in Download Mode.
Halting portfile execution.
]])
endif()
set(all_logs "")
foreach(loop_count RANGE 1 ${arg_COUNT})
set(out_log "${CURRENT_BUILDTREES_DIR}/${arg_LOGNAME}-out-${loop_count}.log")
set(err_log "${CURRENT_BUILDTREES_DIR}/${arg_LOGNAME}-out-${loop_count}.log")
list(APPEND all_logs "${out_log}" "${err_log}")
vcpkg_execute_in_download_mode(
COMMAND ${arg_COMMAND}
OUTPUT_FILE "${out_log}"
ERROR_FILE "${err_log}"
RESULT_VARIABLE error_code
WORKING_DIRECTORY "${arg_WORKING_DIRECTORY}"
)
if(error_code EQUAL "0")
return()
endif()
endforeach()
set(stringified_logs "")
foreach(log IN LISTS all_logs)
if(NOT EXISTS "${log}")
continue()
endif()
file(SIZE "${log}" log_size)
if(NOT log_size EQUAL "0")
file(TO_NATIVE_PATH "${log}" native_log)
string(APPEND stringified_logs " ${native_log}\n")
endif()
endforeach()
z_vcpkg_prettify_command_line(pretty_command ${arg_COMMAND})
message(FATAL_ERROR
" Command failed: ${pretty_command}\n"
" Working Directory: ${arg_WORKING_DIRECTORY}\n"
" See logs for more information:\n"
"${stringifed_logs}"
)
endfunction()