【问题标题】:CMake appends backslash to command added by add_custom_targetCMake 将反斜杠附加到 add_custom_target 添加的命令
【发布时间】:2022-01-06 01:51:24
【问题描述】:

我有一个公司内部工具,它使用以下模式在每个命令行获取多个文件

-i file1 -i file2

要将此工具添加到我的 CMake 构建中,我一直在使用 add_custom_target 命令,如下所示

add_custom_target(
  CustomTarget
  COMMAND ${CompanyTool} ${FILES} -o output"
  DEPENDS ActualTarget)

只要 FILES 仅扩展为单个文件,此方法就可以正常工作,但是当我传入多个文件时,该命令开始仅产生垃圾输出。在检查 CMake 生成的 build.ninja 文件后,我发现 custom_target 命令被转换为一个调用,其中参数后跟这样的反斜杠

\ -i\ file\

我怀疑这就是这不起作用的原因。

现在为什么 F. CMake 会这样做,我该如何摆脱这种行为?

/编辑
在将 FILES 字符串传递给 add_custom_target 之前打印它我看不到那些反斜杠...

好的,知道了。在 foreach 循环中构建一个新列表并附加 -i 和文件。

【问题讨论】:

    标签: string cmake add-custom-target


    【解决方案1】:

    您似乎没有创建 cmake 列表变量,而是创建了一个包含多个空格的值的单值变量。您看不到由; 分隔的值,而是由空格分隔的事实清楚地表明了这一点。 CMake 会根据需要自动转义值,以在命令行中使用确切的值调用命令:

    错误:

    set(FILES "foo.txt bar.txt baz.txt file with space.txt")
    

    正确

    set(FILES foo.txt bar.txt baz.txt "file with space.txt")
    
    # example command concatenating the file contents
    add_custom_target(
      CustomTarget
      COMMAND ${CMAKE_COMMAND} -E cat ${FILES}
      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
    

    Visual Studio 的 cmake 生成器将其转换为我系统上的以下命令:

    "D:\Program Files\CMake\bin\cmake.exe" -E cat foo.txt bar.txt baz.txt "file with space.txt"
    

    (加上一些额外的错误处理等内容。)运行该命令确实会按预期将连接的文件内容打印到控制台。


    顺便说一句:output" 中的单个 " 实际上应该会导致 cmake 错误。除非在其他地方有相应的"。如果这不仅仅是一个复制和粘贴错误,则表明 cmake 正在做一些你期望它在那里做的事情。

    【讨论】:

    • 不,绝对不是。我最初有一个由 set(var a b c) 创建的列表,并将 -i 添加到每个元素。据我所知,这是可行的,至少打印结果显示了我的预期。但是,将此列表传递给 add_custom_target 并使用 ninja 作为生成器不起作用,并且创建的 ninja 规则包含反斜杠。
    猜你喜欢
    • 2015-10-23
    • 2022-07-05
    • 2012-03-31
    • 2019-07-04
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多