CMake add_custom_command 失败并显示 bin/sh:1 : ... 未找到

CMake add_custom_command fails with bin/sh:1 : ... not found

我想达到的目标

我尝试建立一个工具链来为英特尔 FPGA 编译 OpenCL 应用程序。因此,在构建基于 C++ 的主机应用程序时,我需要为 OpenCL 内核调用英特尔 OpenCL 离线编译器。

仅当编辑了 cl 源文件或生成的二进制文件丢失时才应执行此步骤。我的方法是添加一个自定义命令来调用 CL 编译器,并创建一个依赖于此命令生成的输出的自定义目标。离线 Open CL 编译器称为 aoc,由于系统上可能存在多个 SDK 版本,我使用存储在 aocExecutable 中的绝对路径调用它。这是我 CMakeLists.txt

的相关部分
set (CLKernelName "vector_add")
set (CLKernelSourceFile "${PROJECT_SOURCE_DIR}/${CLKernelName}.cl")
set (CLKernelBinary     "${PROJECT_BINARY_DIR}/${CLKernelName}.aocx")

add_executable (HostApplication main.cpp)

# ------ a lot of unneccessary details here ------ 

add_custom_command (OUTPUT  "${CLKernelBinary}"
                    COMMAND "${aocExecutable} -march=emulator ${CLKernelSourceFile} -o ${CLKernelBinary}"
                    DEPENDS "${CLKernelSourceFile}"
)


add_custom_target (CompileCLSources DEPENDS "${CLKernelBinary}")
add_dependencies (HostApplication CompileCLSources)

什么不起作用 运行 Linux 下的 CLion IDE 中的这个会导致此错误:

/bin/sh: 1: /home/me/SDKsAndFrameworks/intelFPGA/18.1/hld/bin/aoc -march=emulator /home/me/CLionProjects/cltest/vector_add.cl -o /home/me/CLionProjects/cltest/cmake-build-debug-openclintelfpgasimulation/vector_add.aocx: not found

整个命令正确扩展,将其复制并粘贴到终端中没有问题,所以我不确定 not found 错误是什么意思。

进一步的问题

假设上述问题将得到解决,如何实现不仅在构建目录中不存在输出文件时调用自定义命令,而且在编辑 CL 源文件时调用自定义命令?

如您在错误消息中所见,bash 解释了 整个命令行

/home/me/SDKsAndFrameworks/intelFPGA/18.1/hld/bin/aoc -march=emulator /home/me/CLionProjects/cltest/vector_add.cl -o /home/me/CLionProjects/cltest/cmake-build-debug-openclintelfpgasimulation/vector_add.aocx

作为单个可执行文件

这是因为您在脚本中使用 双引号 将 COMMAND 包装起来。

删除这些双引号,这样一切都会正常。


与许多其他脚本语言一样,在 CMake 中,双引号使引用的字符串被解释为函数或宏的单个参数

但在 add_custom_command/add_custom_target 函数中,关键字 COMMAND 启动了一个 参数列表 ,第一个表示一个可执行文件和其他 - 该可执行文件的分隔参数。