cmake add_custom_target转义

时间:2018-01-17 23:37:53

标签: c++ c cmake escaping

以下是重现问题的最小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生成器。

1 个答案:

答案 0 :(得分:1)

根据add_custom_target(CMake 3.0)的官方文档:

  

如果给出了VERBATIM 那么命令的所有参数都将针对构建工具正确转义,以便被调用的命令接收每个参数不变。请注意,在add_custom_target甚至看到参数之前,CMake语言处理器仍然使用一级转义。建议使用VERBATIM,因为它可以实现正确的行为。 当没有给出VERBATIM时,行为是特定于平台的,因为没有特定于工具的特殊字符的保护。

因此,添加VERBATIM以便在add_custom_target中正确转义命令。

这同样适用于所有版本以及CMake 2.8。