CMake separate_arguments用法详解
separate_arguments
是 CMake 中用于将字符串分割成参数列表的命令,适用于处理包含空格的参数或复杂命令行参数。以下是其用法详解:
基本语法
separate_arguments(<variable> [UNIX|WINDOWS_COMMAND] [PROGRAM <program>] [ARGS <args>])
<variable>
: 存储分割后结果的变量名。- 模式选择:
UNIX_COMMAND
: 按 UNIX Shell 规则分割参数(默认模式),处理空格、引号和转义符。WINDOWS_COMMAND
: 按 Windows 命令行规则分割参数。
PROGRAM
和ARGS
: 指定程序及其参数,自动选择对应平台的分割方式。
使用场景
-
处理带空格的路径或参数
set(ARGS_STRING "src/main.cpp -Iinclude -O2 \"Hello World.cpp\"") separate_arguments(SPLIT_ARGS UNIX_COMMAND ${ARGS_STRING}) message("分割结果: ${SPLIT_ARGS}")
输出:
分割结果: src/main.cpp;-Iinclude;-O2;Hello World.cpp
-
从环境变量读取参数
set(ENV{CFLAGS} "-O2 -Wall -DNAME=\"My Project\"") separate_arguments(MY_CFLAGS UNIX_COMMAND $ENV{CFLAGS}) target_compile_options(myapp PRIVATE ${MY_CFLAGS})
-
跨平台参数处理
if(WIN32)separate_arguments(ARGS WINDOWS_COMMAND "C:/Program Files/app.exe --flag") else()separate_arguments(ARGS UNIX_COMMAND "/usr/local/bin/app --flag") endif()
关键注意事项
- 引号与转义:
- UNIX 模式识别双引号
"
和反斜杠转义的空格(如\
)。 - Windows 模式遵循其命令行解析规则。
- UNIX 模式识别双引号
- 分号处理:
- CMake 列表以分号分隔,分割后的变量可直接用于需要列表的地方(如
target_compile_options
)。
- CMake 列表以分号分隔,分割后的变量可直接用于需要列表的地方(如
- 默认模式:
- 若不指定模式,默认使用
UNIX_COMMAND
。
- 若不指定模式,默认使用
示例:传递复杂参数
# 定义包含空格的参数
set(ARGS "--input=input.txt" "--output=output file.txt" "-DOPTION=\"A String\"")
separate_arguments(ARGS_LIST UNIX_COMMAND ${ARGS})# 在自定义命令中使用
add_custom_command(OUTPUT result.txtCOMMAND some_tool ${ARGS_LIST}DEPENDS input.txt
)
此例确保 some_tool
正确接收 --input=input.txt
、--output=output file.txt
和 -DOPTION="A String"
三个参数。
总结
- 用途:将字符串转换为 CMake 列表,便于处理复杂参数。
- 模式选择:根据目标平台选择
UNIX_COMMAND
或WINDOWS_COMMAND
。 - 适用场景:处理环境变量、用户输入或跨平台构建时的参数分割。