我正在借助CMake 3.13.1构建一个简单的VS2017 C ++项目
考虑我用特定于配置的生成器表达式填写的CMake列表类型:
foreach(config ${configuration_types})
assign_config_host_flags(host_flags ${config})
foreach(f ${host_flags})
list(APPEND flags $<$<CONFIG:${config}>:-Xcompiler> $<$<CONFIG:${config}>:${f}>)
endforeach()
endforeach()
${configuration_types}
包含两个配置:“ Debug”和“ Release”;
和assign_config_host_flags(...)
是一个宏(这里实际上是伪代码),它用特定于配置的标志填充${host_flags}
。例如,${host_flags}
包含诸如“调试”的/MDd
或“发布”的/MD
之类的条目。假设每个特定于配置的${host_flags}
仅包含1个特定条目(/MDd
或/Md
)。
现在,我正在构建一个自定义构建步骤,该步骤仅打印${flags}
的输出(例如,它可能是编译器选项):
add_custom_command(
...
COMMAND echo ${flags}
...
)
想法是前面提到的命令仅用于打印符合构建配置的条目,例如调试或发布。
构建调试配置时会发生什么,就是当调用上面的命令时,会产生以下输出:
-Xcompiler /MDd "" ""
两个双引号来自我有两个构建配置的事实:调试和发布。这意味着两个生成器表达式$<$<CONFIG:${config}>:-Xcompiler>
和$<$<CONFIG:${config}>:${f}>
的计算结果为空字符串,因为当前构建CONFIG
是“ Debug”,而当前(遍历循环)${config}
成为“发布”。
问题:是否有办法摆脱这两个双引号,而只保留与当前构建配置相关的选项?如果我要制作一个将add_custom_command
传递给编译器的自定义生成步骤(另一个${flags}
),这些空的双引号字符串可能会特别讨厌。
最后,当我在构建Debug配置时调用上述自定义命令时,我想观察以下输出:
-Xcompiler /MDd
当我构建发布配置时:
-Xcompiler /MD