以下是重现问题的最小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将#
解释为评论的开头,因此这相当于
/usr/bin/cmake -E echo
我想知道在cmake
中没有实现的特殊符号转义?
我使用linux / bash和Makefile生成器。
答案 0 :(得分:1)
根据add_custom_target
(CMake 3.0)的官方文档:
如果给出了VERBATIM 那么命令的所有参数都将针对构建工具正确转义,以便被调用的命令接收每个参数不变。请注意,在add_custom_target甚至看到参数之前,CMake语言处理器仍然使用一级转义。建议使用VERBATIM,因为它可以实现正确的行为。 当没有给出VERBATIM时,行为是特定于平台的,因为没有特定于工具的特殊字符的保护。
因此,添加VERBATIM
以便在add_custom_target
中正确转义命令。
这同样适用于所有版本以及CMake 2.8。