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 转义的主要内容,如果未能解决你的问题,请参考以下文章

cmake add_custom_target 转义

CMake add_custom_target:忍者在命令完成之前抑制输出,因此无法进行用户交互

cmake 的正确打开方式

使用 cmake 构建外部库

在CMake中生成命令后执行命令

CMake 的默认构建目标的名称是啥?