我要实现的目标
我尝试建立一个工具链来编译用于Intel FPGA的OpenCL应用程序。因此,在构建基于C ++的主机应用程序下面,我需要为OpenCL内核调用Intel 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源文件的情况下调用custom命令?
答案 0 :(得分:1)
您会在错误消息中看到,bash会解释整个命令行
<link href="/Styles/Site.css" rel="stylesheet" type="text/css" />
作为单个可执行文件。
这是因为您用双引号将COMMAND包裹在脚本中。
删除这些双引号,以便一切正常。
与许多其他脚本语言一样,在CMake中,双引号使引用的字符串被解释为函数或宏的单个参数。
但是在<head></head>
/ /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 会启动参数列表,其中第一个表示可执行文件,其他表示可执行文件-分开该可执行文件的参数。