From a3a8e3421e7d8313c1806c0490db5609c884f3b3 Mon Sep 17 00:00:00 2001 From: Alexey Edelev Date: Wed, 10 Apr 2024 19:08:36 +0200 Subject: [PATCH] Fix the broken semicolon separated list arguments for configure When evaluating the arguments from the config.tl.opt file we need to consider that arguments may contain the escaped semicolons for the list arguments. The escaped semicolons '\;' needs to be converted to a CMake brace escaped sequence to make sure that semicolon persist when running the command. Fixes: QTBUG-124265 Change-Id: I051f856b43f75b0bac17ae13bd8c7de540f8c794 Reviewed-by: Alexandru Croitor --- cmake/QtIRCommandLineHelpers.cmake | 1 + cmake/QtIRHelpers.cmake | 2 +- cmake/QtIRProcessHelpers.cmake | 24 ++++++++++++++++++++++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/cmake/QtIRCommandLineHelpers.cmake b/cmake/QtIRCommandLineHelpers.cmake index 465a994b..65c5d6aa 100644 --- a/cmake/QtIRCommandLineHelpers.cmake +++ b/cmake/QtIRCommandLineHelpers.cmake @@ -244,6 +244,7 @@ endfunction() # Reads the command line arguments from the optfile_path. function(qt_ir_get_raw_args_from_optfile optfile_path out_var) file(STRINGS "${optfile_path}" args) + qt_ir_escape_semicolons(args "${args}") set(${out_var} "${args}" PARENT_SCOPE) endfunction() diff --git a/cmake/QtIRHelpers.cmake b/cmake/QtIRHelpers.cmake index 9f372932..8e2af7f8 100644 --- a/cmake/QtIRHelpers.cmake +++ b/cmake/QtIRHelpers.cmake @@ -225,7 +225,7 @@ endfunction() # to run the perly script manually. function(qt_ir_show_error_how_to_run_perl opt_file unsupported_option_name) qt_ir_get_raw_args_from_optfile("${opt_file}" args) - string(REPLACE ";" " " args "${args}") + qt_ir_prettify_command_args(args "${args}") set(perl_cmd "perl ./init-repository.pl ${args}") diff --git a/cmake/QtIRProcessHelpers.cmake b/cmake/QtIRProcessHelpers.cmake index db7bf2cb..cddd2736 100644 --- a/cmake/QtIRProcessHelpers.cmake +++ b/cmake/QtIRProcessHelpers.cmake @@ -53,10 +53,11 @@ function(qt_ir_execute_process) endif() endif() - string(REPLACE ";" " " command_args_string "${arg_COMMAND_ARGS}") + qt_ir_prettify_command_args(command_args_string "${arg_COMMAND_ARGS}") message("+ ${command_args_string}${working_dir_message}") endif() + qt_ir_unescape_semicolons(arg_COMMAND_ARGS "${arg_COMMAND_ARGS}") execute_process( COMMAND ${arg_COMMAND_ARGS} ${working_dir} @@ -76,6 +77,25 @@ function(qt_ir_execute_process) endif() endfunction() +# Guards the escaped semicolon sequences with square brackets. +function(qt_ir_escape_semicolons out_var input_string) + string(REPLACE "\;" "[[;]]" ${out_var} "${input_string}") + set(${out_var} "${${out_var}}" PARENT_SCOPE) +endfunction() + +# Removes the square bracket guards around semicolons and escape them. +function(qt_ir_unescape_semicolons out_var input_string) + string(REPLACE "[[;]]" "\;" ${out_var} "${input_string}") + set(${out_var} "${${out_var}}" PARENT_SCOPE) +endfunction() + +# Converts the command line arguments to a nice bash runnable string +function(qt_ir_prettify_command_args output args) + list(JOIN args " " ${output}) + qt_ir_unescape_semicolons(${output} "${${output}}") + set(${output} "${${output}}" PARENT_SCOPE) +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. @@ -142,7 +162,7 @@ function(qt_ir_execute_process_and_log_and_handle_error) set(error_message "${arg_ERROR_MESSAGE}\n") endif() - string(REPLACE ";" " " cmd "${arg_COMMAND_ARGS}") + qt_ir_prettify_command_args(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")