vcpkg/scripts/test_ports/unit-test-cmake/test-vcpkg_execute_required_process.cmake
Kai Pastor 5a5242aee4
[world rebuild][vcpkg scripts] Test, fix, extend vcpkg_execute_required_process (#39445)
Fixes `OUTPUT_VARIABLE`, `ERROR_VARIABLE`. 

vcpkg always wants logfiles. CMake (`execute_process`) doesn't send
stdout/stderr to files and variables at the same time, and even "the
precedence is not specified". So simultaneous output has to be handled
in `vcpkg_execute_required_process`.

At this occasion, port the arguments for stripping trailing whitespace.

`tensorflow-common` implicitly relied on the broken behavior. I chose
the minimal fix: drop the pointless calls, just set the empty value.
2024-06-28 22:21:10 -07:00

190 lines
5.8 KiB
CMake

# vcpkg_execute_required_process
#[[
"ALLOW_IN_DOWNLOAD_MODE;OUTPUT_STRIP_TRAILING_WHITESPACE;ERROR_STRIP_TRAILING_WHITESPACE"
"WORKING_DIRECTORY;LOGNAME;TIMEOUT;OUTPUT_VARIABLE;ERROR_VARIABLE"
"COMMAND;SAVE_LOG_FILES"
]]
block(SCOPE_FOR VARIABLES)
set(logname "test-vcpkg_execute_required_process")
function(count_log_files out_var)
set(count 0)
if(EXISTS "${CURRENT_BUILDTREES_DIR}/${logname}-out.log")
math(EXPR count "${count} + 1")
endif()
if(EXISTS "${CURRENT_BUILDTREES_DIR}/${logname}-err.log")
math(EXPR count "${count} + 1")
endif()
if(EXISTS "${CURRENT_BUILDTREES_DIR}/${logname}-extra.log")
math(EXPR count "${count} + 1")
endif()
set("${out_var}" "${count}" PARENT_SCOPE)
endfunction()
function(reset_log_files)
file(REMOVE "${CURRENT_BUILDTREES_DIR}/${logname}-out.log")
file(REMOVE "${CURRENT_BUILDTREES_DIR}/${logname}-err.log")
file(REMOVE "${CURRENT_BUILDTREES_DIR}/${logname}-extra.log")
endfunction()
# ALLOW_IN_DOWNLOAD_MODE
set(VCPKG_DOWNLOAD_MODE 1)
unit_test_ensure_success([[
vcpkg_execute_required_process(
COMMAND "${CMAKE_COMMAND}" -E echo Success
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
LOGNAME "${logname}"
ALLOW_IN_DOWNLOAD_MODE
)]]
)
unit_test_ensure_fatal_error([[
vcpkg_execute_required_process(
COMMAND "${CMAKE_COMMAND}" -E echo Success
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
LOGNAME "${logname}"
)]]
)
set(VCPKG_DOWNLOAD_MODE "")
unit_test_ensure_success([[
vcpkg_execute_required_process(
COMMAND "${CMAKE_COMMAND}" -E echo Success
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
LOGNAME "${logname}"
ALLOW_IN_DOWNLOAD_MODE
)]]
)
unit_test_ensure_success([[
vcpkg_execute_required_process(
COMMAND "${CMAKE_COMMAND}" -E echo Success
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
LOGNAME "${logname}"
)]]
)
# COMMAND, LOGNAME
reset_log_files()
unit_test_check_variable_equal([[count_log_files(count)]] count 0)
unit_test_ensure_success([[
vcpkg_execute_required_process(
COMMAND "${CMAKE_COMMAND}" -E echo Hello world
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
LOGNAME "${logname}"
)]]
)
unit_test_check_variable_equal([[ count_log_files(count) ]] count 2)
unit_test_check_variable_equal([[ file(STRINGS "${CURRENT_BUILDTREES_DIR}/${logname}-out.log" stdout) ]] stdout "Hello world")
# WORKING_DIRECTORY, SAVE_LOG_FILES
file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/vcpkg_execute_required_process-dir/subdir")
file(MAKE_DIRECTORY "${CURRENT_BUILDTREES_DIR}/vcpkg_execute_required_process-dir/subdir")
file(WRITE "${CURRENT_BUILDTREES_DIR}/vcpkg_execute_required_process-dir/source" "extra log")
file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/subdir")
reset_log_files()
unit_test_check_variable_equal([[count_log_files(count)]] count 0)
unit_test_ensure_success([[
vcpkg_execute_required_process(
COMMAND "${CMAKE_COMMAND}" -E rename source subdir/extra.log
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}/vcpkg_execute_required_process-dir"
LOGNAME "${logname}"
SAVE_LOG_FILES "subdir/extra.log"
)]]
)
unit_test_check_variable_equal([[ count_log_files(count) ]] count 3)
unit_test_check_variable_equal([[ file(STRINGS "${CURRENT_BUILDTREES_DIR}/${logname}-extra.log" extra) ]] extra "extra log")
# OUTPUT_VARIABLE, OUTPUT_STRIP_TRAILING_WHITESPACE
reset_log_files()
unit_test_check_variable_equal([[count_log_files(count)]] count 0)
unit_test_check_variable_equal([[
vcpkg_execute_required_process(
COMMAND "${CMAKE_COMMAND}" -E echo Hello world
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
LOGNAME "${logname}"
OUTPUT_VARIABLE outvar
)]]
outvar "Hello world\n"
)
unit_test_check_variable_equal([[
vcpkg_execute_required_process(
COMMAND "${CMAKE_COMMAND}" -E echo Hello world
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
LOGNAME "${logname}"
OUTPUT_VARIABLE outvar
OUTPUT_STRIP_TRAILING_WHITESPACE
)]]
outvar "Hello world"
)
unit_test_check_variable_equal([[ count_log_files(count) ]] count 2)
# ERROR_VARIABLE
reset_log_files()
unit_test_check_variable_equal([[count_log_files(count)]] count 0)
file(WRITE "${CURRENT_BUILDTREES_DIR}/vcpkg_execute_required_process-dir/stderr.cmake" "message(WARNING on-stderr)\n")
unit_test_check_variable_not_equal([[
vcpkg_execute_required_process(
COMMAND "${CMAKE_COMMAND}" -P "${CURRENT_BUILDTREES_DIR}/vcpkg_execute_required_process-dir/stderr.cmake"
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
LOGNAME "${logname}"
ERROR_VARIABLE outvar
)
string(FIND "${outvar}" "on-stderr" pos)
]] pos -1
)
unit_test_check_variable_equal([[ count_log_files(count) ]] count 2)
# OUTPUT_VARIABLE == ERROR_VARIABLE
reset_log_files()
unit_test_check_variable_equal([[count_log_files(count)]] count 0)
file(WRITE "${CURRENT_BUILDTREES_DIR}/vcpkg_execute_required_process-dir/combined.cmake" [[
message(WARNING on-stderr)
message(STATUS on-stdout)
]])
unit_test_check_variable_not_equal([[
vcpkg_execute_required_process(
COMMAND "${CMAKE_COMMAND}" -P "${CURRENT_BUILDTREES_DIR}/vcpkg_execute_required_process-dir/combined.cmake"
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
LOGNAME "${logname}"
OUTPUT_VARIABLE outvar
ERROR_VARIABLE outvar
)
string(REGEX MATCH "on-stderr.*on-stdout" match "${outvar}")
]] CMAKE_MATCH_0 ""
)
unit_test_check_variable_equal([[ count_log_files(count) ]] count 2)
# TIMEOUT (if not flaky)
unit_test_ensure_fatal_error([[
vcpkg_execute_required_process(
COMMAND "${CMAKE_COMMAND}" -E sleep 10
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
LOGNAME "${logname}"
TIMEOUT 1
)]]
)
endblock()