aboutsummaryrefslogtreecommitdiffstats
path: root/cmake/QtIRProcessHelpers.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/QtIRProcessHelpers.cmake')
-rw-r--r--cmake/QtIRProcessHelpers.cmake165
1 files changed, 165 insertions, 0 deletions
diff --git a/cmake/QtIRProcessHelpers.cmake b/cmake/QtIRProcessHelpers.cmake
new file mode 100644
index 00000000..db7bf2cb
--- /dev/null
+++ b/cmake/QtIRProcessHelpers.cmake
@@ -0,0 +1,165 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# A low-level execute_process wrapper that can be used to execute a single command
+# while controlling the verbosity and error handling.
+function(qt_ir_execute_process)
+ set(options
+ QUIET
+ )
+ set(oneValueArgs
+ WORKING_DIRECTORY
+ OUT_RESULT_VAR
+ OUT_OUTPUT_VAR
+ OUT_ERROR_VAR
+ )
+ set(multiValueArgs
+ COMMAND_ARGS
+ EP_EXTRA_ARGS
+ )
+ cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+ if(NOT arg_COMMAND_ARGS)
+ message(FATAL_ERROR "Missing arguments to qt_ir_execute_process")
+ endif()
+
+ if(arg_WORKING_DIRECTORY)
+ set(working_dir_value "${arg_WORKING_DIRECTORY}")
+ else()
+ set(working_dir_value ".")
+ endif()
+ set(working_dir WORKING_DIRECTORY "${working_dir_value}")
+
+ set(result_variable "")
+ if(arg_OUT_RESULT_VAR)
+ set(result_variable RESULT_VARIABLE proc_result)
+ endif()
+
+ set(swallow_output "")
+ if(arg_OUT_OUTPUT_VAR OR arg_QUIET)
+ list(APPEND swallow_output OUTPUT_VARIABLE proc_output)
+ endif()
+ if(arg_OUT_ERROR_VAR OR arg_QUIET)
+ list(APPEND swallow_output ERROR_VARIABLE proc_error)
+ endif()
+ if(NOT arg_QUIET)
+ set(working_dir_message "")
+
+ qt_ir_is_verbose(verbose)
+ if(verbose)
+ set(working_dir_message " current working dir: ")
+ if(NOT working_dir_value STREQUAL ".")
+ string(APPEND working_dir_message "${working_dir_value}")
+ endif()
+ endif()
+
+ string(REPLACE ";" " " command_args_string "${arg_COMMAND_ARGS}")
+ message("+ ${command_args_string}${working_dir_message}")
+ endif()
+
+ execute_process(
+ COMMAND ${arg_COMMAND_ARGS}
+ ${working_dir}
+ ${result_variable}
+ ${swallow_output}
+ ${arg_EP_EXTRA_ARGS}
+ )
+
+ if(arg_OUT_RESULT_VAR)
+ set(${arg_OUT_RESULT_VAR} "${proc_result}" PARENT_SCOPE)
+ endif()
+ if(arg_OUT_OUTPUT_VAR)
+ set(${arg_OUT_OUTPUT_VAR} "${proc_output}" PARENT_SCOPE)
+ endif()
+ if(arg_OUT_ERROR_VAR)
+ set(${arg_OUT_ERROR_VAR} "${proc_error}" PARENT_SCOPE)
+ endif()
+endfunction()
+
+# A higher level execute_process wrapper that can be used to execute a single command
+# that is a bit more opinionated and expects options related to init-repository
+# functionality.
+# It handles queietness, error handling and logging.
+# It also allows for slightly more compact syntax for calling processes.
+function(qt_ir_execute_process_and_log_and_handle_error)
+ set(options
+ NO_HANDLE_ERROR
+ FORCE_VERBOSE
+ FORCE_QUIET
+ )
+ set(oneValueArgs
+ WORKING_DIRECTORY
+ OUT_RESULT_VAR
+ OUT_OUTPUT_VAR
+ OUT_ERROR_VAR
+ ERROR_MESSAGE
+ )
+ set(multiValueArgs
+ COMMAND_ARGS
+ EP_EXTRA_ARGS
+ )
+ cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+ qt_ir_get_option_value(quiet quiet)
+ set(quiet_option "")
+ if((quiet OR arg_FORCE_QUIET) AND NOT arg_FORCE_VERBOSE)
+ set(quiet_option "QUIET")
+ endif()
+
+ set(working_dir "")
+ if(arg_WORKING_DIRECTORY)
+ set(working_dir WORKING_DIRECTORY "${arg_WORKING_DIRECTORY}")
+ endif()
+
+ set(extra_args "")
+ if(arg_EP_EXTRA_ARGS)
+ set(extra_args EP_EXTRA_ARGS "${arg_EP_EXTRA_ARGS}")
+ endif()
+
+ set(out_output_var "")
+ if(arg_OUT_OUTPUT_VAR OR quiet)
+ set(out_output_var OUT_OUTPUT_VAR proc_output)
+ endif()
+
+ set(out_error_var "")
+ if(arg_OUT_ERROR_VAR OR quiet)
+ set(out_error_var OUT_ERROR_VAR proc_error)
+ endif()
+
+ qt_ir_execute_process(
+ ${quiet_option}
+ COMMAND_ARGS ${arg_COMMAND_ARGS}
+ OUT_RESULT_VAR proc_result
+ ${extra_args}
+ ${working_dir}
+ ${out_output_var}
+ ${out_error_var}
+ )
+
+ if(NOT proc_result EQUAL 0 AND NOT arg_NO_HANDLE_ERROR)
+ set(error_message "")
+ if(arg_ERROR_MESSAGE)
+ set(error_message "${arg_ERROR_MESSAGE}\n")
+ endif()
+
+ string(REPLACE ";" " " cmd "${arg_COMMAND_ARGS}")
+ string(APPEND error_message "${cmd} exited with status: ${proc_result}\n")
+ if(proc_output)
+ string(APPEND error_message "stdout: ${proc_output}\n")
+ endif()
+ if(proc_error)
+ string(APPEND error_message "stderr: ${proc_error}\n")
+ endif()
+ message(FATAL_ERROR "${error_message}")
+ endif()
+
+ if(arg_OUT_RESULT_VAR)
+ set(${arg_OUT_RESULT_VAR} "${proc_result}" PARENT_SCOPE)
+ endif()
+ if(arg_OUT_OUTPUT_VAR)
+ set(${arg_OUT_OUTPUT_VAR} "${proc_output}" PARENT_SCOPE)
+ endif()
+ if(arg_OUT_ERROR_VAR)
+ set(${arg_OUT_ERROR_VAR} "${proc_error}" PARENT_SCOPE)
+ endif()
+endfunction()