zsh + CMake:命令行选项未拆分
zsh + CMake: command line options not split
考虑以下 CMakeLists.txt
:
cmake_minimum_required(VERSION 3.18..3.21)
project(myproject)
option(USE_ASSERT "Use assertions" ON)
option(USE_DEBUG "Compile in debug mode" OFF)
message(STATUS "USE_ASSERT=${USE_ASSERT}")
message(STATUS "USE_DEBUG=${USE_DEBUG}")
有了这个,下面
cmake -Bbuild -DUSE_ASSERT=0 -DUSE_DEBUG=1
按预期打印:
...
-- USE_ASSERT=0
-- USE_DEBUG=1
...
然而,在 zsh 上,使用中间变量这突然失败了。例如
export CMAKE_ARGS="-DUSE_ASSERT=1 -DUSE_DEBUG=0"
cmake -Bbuild ${CMAKE_ARGS}
现在打印
...
-- USE_ASSERT=1 -DUSE_DEBUG=0
-- USE_DEBUG=OFF
...
CMake 因此无法拆分选项。为什么是这样?我怎样才能避免这个问题?
完整性:
- Bash:一切正常。
- Zsh:在 Linux 和 OSx 上始终失败。
这与CMake无关。
相反,它与您的 shell 处理变量扩展和分词的方式有关。因为你是运行zsh
,不是bash
,在变量展开时默认不会分词。要为特定参数恢复此行为,请改写 ${=CMAKE_ARGS}
。
考虑以下 CMakeLists.txt
:
cmake_minimum_required(VERSION 3.18..3.21)
project(myproject)
option(USE_ASSERT "Use assertions" ON)
option(USE_DEBUG "Compile in debug mode" OFF)
message(STATUS "USE_ASSERT=${USE_ASSERT}")
message(STATUS "USE_DEBUG=${USE_DEBUG}")
有了这个,下面
cmake -Bbuild -DUSE_ASSERT=0 -DUSE_DEBUG=1
按预期打印:
...
-- USE_ASSERT=0
-- USE_DEBUG=1
...
然而,在 zsh 上,使用中间变量这突然失败了。例如
export CMAKE_ARGS="-DUSE_ASSERT=1 -DUSE_DEBUG=0"
cmake -Bbuild ${CMAKE_ARGS}
现在打印
...
-- USE_ASSERT=1 -DUSE_DEBUG=0
-- USE_DEBUG=OFF
...
CMake 因此无法拆分选项。为什么是这样?我怎样才能避免这个问题?
完整性:
- Bash:一切正常。
- Zsh:在 Linux 和 OSx 上始终失败。
这与CMake无关。
相反,它与您的 shell 处理变量扩展和分词的方式有关。因为你是运行zsh
,不是bash
,在变量展开时默认不会分词。要为特定参数恢复此行为,请改写 ${=CMAKE_ARGS}
。