我想要实现的目标
我尝试建立一个工具链来编译适用于英特尔 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
整个命令正确展开,复制它并将其粘贴到终端中不会出现任何问题,所以我不确定未找到
错误意味着什么。
进一步问题
假设上述问题得到解决,如何实现不仅在构建目录中不存在输出文件时调用自定义命令,而且在编辑 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 启动一个参数列表,其中第一个表示可执行文件和其他 - 该可执行文件的分隔参数。
关于CMake add_custom_command 失败,bin/sh :1 : . ..未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55711749/