【问题标题】:cmake add_custom_target escapingcmake add_custom_target 转义
【发布时间】: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 有效。

标签: c++ c cmake escaping


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多