cmake add_custom_target 转义
Posted
技术标签:
【中文标题】cmake add_custom_target 转义【英文标题】:cmake add_custom_target escaping 【发布时间】:2018-01-17 23:37:52 【问题描述】:这是重现问题的最小CMakeLists.txt
:
cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
set(BUILD_INFO_CPP "$CMAKE_BINARY_DIR/build_info.cpp")
add_custom_target(GenerateBuildInfo ALL
COMMAND $CMAKE_COMMAND -E echo "#include Something" > "$BUILD_INFO_CPP"
)
在每次构建时我都想重新生成$CMAKE_BINARY_DIR/build_info.cpp
,
但是这段代码没有创建build_info.cpp
,因为cmake
像这样执行它:
/usr/bin/cmake -E echo #include > /tmp/2/build/build_info.cpp
据了解,shell 将 #
解释为 cmets 的开头,因此这相当于
/usr/bin/cmake -E echo
我想知道cmake
中没有实现特殊符号转义吗?
我使用 linux/bash 和 Makefile 生成器。
【问题讨论】:
你试过-E echo \"#include Something\" > \"$BUILD_INFO_CPP\"
吗?
@Pablo 这无济于事,cmake
吃引号。但看起来VERBATIM
有效。
【参考方案1】:
根据add_custom_target
(CMake 3.0)的官方文档:
如果给定了 VERBATIM,那么命令的所有参数都将为构建工具正确转义,以便调用的命令接收每个参数不变。请注意,在 add_custom_target 甚至看到参数之前,CMake 语言处理器仍然使用一级转义。建议使用 VERBATIM,因为它可以实现正确的行为。 当没有给出 VERBATIM 时,行为是特定于平台的,因为没有对特定于工具的特殊字符的保护。
因此,添加VERBATIM
以便命令在add_custom_target
中正确转义。
这同样适用于所有版本及 CMake 2.8。
【讨论】:
以上是关于cmake add_custom_target 转义的主要内容,如果未能解决你的问题,请参考以下文章