【发布时间】:2021-12-15 08:15:22
【问题描述】:
我想要达到的目标
我尝试设置一个工具链来为英特尔 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 将整个命令行 解释为可执行文件。这是因为您将
COMMAND用双引号括在脚本中。删除这些双引号,所以一切都会工作。至于其他问题,如果您希望COMMAND在更改的文件上重新运行,那么您需要将此文件添加到DEPENDS列表中。 -
@Tsyvarev 您的评论应该是一个答案,因为它解决了我所有的问题。谢谢你。我对 CMake 很陌生,我想我应该阅读一下何时使用引号以及何时不使用...
标签: cmake intel clion intel-fpga