0

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

-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 会这样做,我该如何摆脱这种行为?

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

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

4

1 回答 1

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 正在做一些你期望它在那里做的事情。

于 2022-01-05T17:45:03.487 回答