summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2020-10-29 11:34:32 +0100
committerJoerg Bornemann <joerg.bornemann@qt.io>2020-10-30 08:22:30 +0100
commit2a29426e3915ecc7fa5b4cbb06c7565c40ca2ec6 (patch)
tree95ca992725cbea7f42592992b486e53b119c3c02
parentde3bd644259b134d68414dcb8479f66f2f39fe70 (diff)
CMake: Fix argument passing for configure.bat / qt-configure-module.bat
Passing arguments with equal signs was broken for configure.bat and qt-configure-module.bat. An argument FOO=BAR was split at = and written as FOO BAR to config.opt, breaking every attempt of assigning CMake variables. We must not iterate over %* in batch files to avoid splitting arguments at equal signs. Instead, pass %* unmodified to a CMake script that writes config.opt. Fixes: QTBUG-88019 Change-Id: I7c743a206961d1ed168f2313f864905f6b345b49 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
-rw-r--r--bin/qt-configure-module.bat.in13
-rw-r--r--cmake/QtBaseGlobalTargets.cmake1
-rw-r--r--cmake/QtWriteArgsFile.cmake31
-rw-r--r--configure.bat3
4 files changed, 35 insertions, 13 deletions
diff --git a/bin/qt-configure-module.bat.in b/bin/qt-configure-module.bat.in
index a4858d412c..9d9243f5b8 100644
--- a/bin/qt-configure-module.bat.in
+++ b/bin/qt-configure-module.bat.in
@@ -17,18 +17,9 @@ if not exist "%module_root%\CMakeLists.txt" (
exit /b 1
)
-echo. > "config.opt"
-set first_iteration=indeed
-for %%a in (%*) do (
- if defined first_iteration (
- :: Drop the first argument, which is the module root.
- set first_iteration=
- ) else (
- echo %%a >> "config.opt"
- )
-)
-
set cmake_scripts_dir=%script_dir_path%\@__relative_path_to_cmake_scripts_dir@
+call "%script_dir_path%"\qt-cmake.bat -DSKIP_ARGS=1 -DOUT_FILE=config.opt ^
+ -P "%cmake_scripts_dir%\QtWriteArgsFile.cmake" %*
call "%script_dir_path%"\qt-cmake-private.bat -DOPTFILE=config.opt -DMODULE_ROOT="%module_root%" ^
-DCMAKE_COMMAND="%script_dir_path%\qt-cmake-private.bat" ^
-P "%cmake_scripts_dir%\QtProcessConfigureArgs.cmake"
diff --git a/cmake/QtBaseGlobalTargets.cmake b/cmake/QtBaseGlobalTargets.cmake
index ae1fc89a5b..2fd8b260a9 100644
--- a/cmake/QtBaseGlobalTargets.cmake
+++ b/cmake/QtBaseGlobalTargets.cmake
@@ -216,6 +216,7 @@ qt_copy_or_install(FILES
cmake/QtToolchainHelpers.cmake
cmake/QtToolHelpers.cmake
cmake/QtWrapperScriptHelpers.cmake
+ cmake/QtWriteArgsFile.cmake
DESTINATION "${__GlobalConfig_install_dir}"
)
diff --git a/cmake/QtWriteArgsFile.cmake b/cmake/QtWriteArgsFile.cmake
new file mode 100644
index 0000000000..b4fa833f79
--- /dev/null
+++ b/cmake/QtWriteArgsFile.cmake
@@ -0,0 +1,31 @@
+# This script writes its arguments to the file determined by OUT_FILE.
+# Each argument appears on a separate line.
+# This is used for writing the config.opt file.
+#
+# This script takes the following arguments:
+# OUT_FILE: The output file.
+# SKIP_ARGS: Number of arguments to skip from the front of the arguments list.
+
+# Look for the -P argument to determine the start of the actual script arguments
+math(EXPR stop "${CMAKE_ARGC} - 1")
+set(start 0)
+foreach(i RANGE 1 ${stop})
+ if(CMAKE_ARGV${i} STREQUAL "-P")
+ math(EXPR start "${i} + 2")
+ break()
+ endif()
+endforeach()
+
+# Skip arguments if requested
+if(DEFINED SKIP_ARGS)
+ math(EXPR start "${start} + ${SKIP_ARGS}")
+endif()
+
+# Write config.opt
+set(content "")
+if(start LESS_EQUAL stop)
+ foreach(i RANGE ${start} ${stop})
+ string(APPEND content "${CMAKE_ARGV${i}}\n")
+ endforeach()
+endif()
+file(WRITE "${OUT_FILE}" "${content}")
diff --git a/configure.bat b/configure.bat
index d90ebd150d..90d2eaa4f5 100644
--- a/configure.bat
+++ b/configure.bat
@@ -317,8 +317,7 @@ goto :eof
rem Write config.opt if we're not currently -redo'ing
if "%rargs%" == "" (
- if exist "%TOPQTDIR%\config.opt" del "%TOPQTDIR%\config.opt"
- for %%a in (%ARGS%) do echo %%a >> "%TOPQTDIR%\config.opt"
+ cmake -DOUT_FILE=config.opt -P "%QTSRC%\cmake\QtWriteArgsFile.cmake" %*
)
rem Launch CMake-based configure