diff options
Diffstat (limited to 'scripts/cmake/vcpkg_execute_required_process.cmake')
| -rw-r--r-- | scripts/cmake/vcpkg_execute_required_process.cmake | 121 |
1 files changed, 73 insertions, 48 deletions
diff --git a/scripts/cmake/vcpkg_execute_required_process.cmake b/scripts/cmake/vcpkg_execute_required_process.cmake index c38fd2ed8..27024fecf 100644 --- a/scripts/cmake/vcpkg_execute_required_process.cmake +++ b/scripts/cmake/vcpkg_execute_required_process.cmake @@ -48,28 +48,27 @@ This should be a unique name for different triplets so that the logs don't confl #]===] function(vcpkg_execute_required_process) - # parse parameters such that semicolons in options arguments to COMMAND don't get erased - cmake_parse_arguments(PARSE_ARGV 0 vcpkg_execute_required_process "ALLOW_IN_DOWNLOAD_MODE" "WORKING_DIRECTORY;LOGNAME;TIMEOUT;OUTPUT_VARIABLE;ERROR_VARIABLE" "COMMAND") - set(LOG_OUT "${CURRENT_BUILDTREES_DIR}/${vcpkg_execute_required_process_LOGNAME}-out.log") - set(LOG_ERR "${CURRENT_BUILDTREES_DIR}/${vcpkg_execute_required_process_LOGNAME}-err.log") + cmake_parse_arguments(PARSE_ARGV 0 arg + "ALLOW_IN_DOWNLOAD_MODE" + "WORKING_DIRECTORY;LOGNAME;TIMEOUT;OUTPUT_VARIABLE;ERROR_VARIABLE" + "COMMAND" + ) - if(vcpkg_execute_required_process_TIMEOUT) - set(TIMEOUT_PARAM "TIMEOUT;${vcpkg_execute_required_process_TIMEOUT}") - else() - set(TIMEOUT_PARAM "") - endif() - if(vcpkg_execute_required_process_OUTPUT_VARIABLE) - set(OUTPUT_VARIABLE_PARAM "OUTPUT_VARIABLE;${vcpkg_execute_required_process_OUTPUT_VARIABLE}") - else() - set(OUTPUT_VARIABLE_PARAM "") + if(DEFINED arg_UNPARSED_ARGUMENTS) + message(WARNING "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}") endif() - if(vcpkg_execute_required_process_ERROR_VARIABLE) - set(ERROR_VARIABLE_PARAM "ERROR_VARIABLE;${vcpkg_execute_required_process_ERROR_VARIABLE}") - else() - set(ERROR_VARIABLE_PARAM "") + foreach(required_arg IN ITEMS WORKING_DIRECTORY COMMAND) + if(NOT DEFINED arg_${required_arg}) + message(FATAL_ERROR "${required_arg} must be specified.") + endif() + endforeach() + + if(NOT DEFINED arg_LOGNAME) + message(WARNING "LOGNAME should be specified.") + set(arg_LOGNAME "required") endif() - if (DEFINED VCPKG_DOWNLOAD_MODE AND NOT vcpkg_execute_required_process_ALLOW_IN_DOWNLOAD_MODE) + if (VCPKG_DOWNLOAD_MODE AND NOT arg_ALLOW_IN_DOWNLOAD_MODE) message(FATAL_ERROR [[ This command cannot be executed in Download Mode. @@ -77,43 +76,69 @@ Halting portfile execution. ]]) endif() - vcpkg_execute_in_download_mode( - COMMAND ${vcpkg_execute_required_process_COMMAND} - OUTPUT_FILE ${LOG_OUT} - ERROR_FILE ${LOG_ERR} - RESULT_VARIABLE error_code - WORKING_DIRECTORY ${vcpkg_execute_required_process_WORKING_DIRECTORY} - ${TIMEOUT_PARAM} - ${OUTPUT_VARIABLE_PARAM} - ${ERROR_VARIABLE_PARAM}) - if(error_code) - set(LOGS) - file(READ "${LOG_OUT}" out_contents) - file(READ "${LOG_ERR}" err_contents) - if(out_contents) - list(APPEND LOGS "${LOG_OUT}") + set(log_out "${CURRENT_BUILDTREES_DIR}/${arg_LOGNAME}-out.log") + set(log_err "${CURRENT_BUILDTREES_DIR}/${arg_LOGNAME}-err.log") + + set(timeout_param "") + set(output_and_error_same OFF) + set(output_variable_param "") + set(error_variable_param "") + + if(DEFINED arg_TIMEOUT) + set(timeout_param TIMEOUT "${arg_TIMEOUT}") + endif() + if(DEFINED arg_OUTPUT_VARIABLE AND DEFINED arg_ERROR_VARIABLE AND arg_OUTPUT_VARIABLE STREQUAL arg_ERROR_VARIABLE) + set(output_variable_param OUTPUT_VARIABLE out_err_var) + set(error_variable_param ERROR_VARIABLE out_err_var) + set(output_and_error_same ON) + else() + if(DEFINED arg_OUTPUT_VARIABLE) + set(output_variable_param OUTPUT_VARIABLE out_var) endif() - if(err_contents) - list(APPEND LOGS "${LOG_ERR}") + if(DEFINED arg_ERROR_VARIABLE) + set(error_variable_param ERROR_VARIABLE err_var) endif() - set(STRINGIFIED_LOGS) - foreach(LOG ${LOGS}) - file(TO_NATIVE_PATH "${LOG}" NATIVE_LOG) - list(APPEND STRINGIFIED_LOGS " ${NATIVE_LOG}\n") + endif() + + vcpkg_execute_in_download_mode( + COMMAND ${arg_COMMAND} + OUTPUT_FILE "${log_out}" + ERROR_FILE "${log_err}" + RESULT_VARIABLE error_code + WORKING_DIRECTORY "${arg_WORKING_DIRECTORY}" + ${timeout_param} + ${output_variable_param} + ${error_variable_param} + ) + if(NOT error_code EQUAL 0) + set(stringified_logs "") + foreach(log IN ITEMS "${log_out}" "${log_err}") + 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(vcpkg_execute_required_process_COMMAND_PRETTY ${vcpkg_execute_required_process_COMMAND}) + + z_vcpkg_prettify_command_line(pretty_command ${arg_COMMAND}) message(FATAL_ERROR - " Command failed: ${vcpkg_execute_required_process_COMMAND_PRETTY}\n" - " Working Directory: ${vcpkg_execute_required_process_WORKING_DIRECTORY}\n" + " Command failed: ${pretty_command}\n" + " Working Directory: ${arg_WORKING_DIRECTORY}\n" " Error code: ${error_code}\n" " See logs for more information:\n" - ${STRINGIFIED_LOGS} + "${stringified_logs}" ) endif() + # pass output parameters back to caller's scope - foreach(arg OUTPUT_VARIABLE ERROR_VARIABLE) - if(vcpkg_execute_required_process_${arg}) - set(${vcpkg_execute_required_process_${arg}} ${${vcpkg_execute_required_process_${arg}}} PARENT_SCOPE) - endif() - endforeach() + if(output_and_error_same) + z_vcpkg_forward_output_variable(arg_OUTPUT_VARIABLE out_err_var) + # arg_ERROR_VARIABLE = arg_OUTPUT_VARIABLE, so no need to set it again + else() + z_vcpkg_forward_output_variable(arg_OUTPUT_VARIABLE out_var) + z_vcpkg_forward_output_variable(arg_ERROR_VARIABLE err_var) + endif() endfunction() |
