CMake add_custom_command терпит неудачу с bin / sh: 1: ... не найден - PullRequest
0 голосов
/ 16 апреля 2019

Чего я хочу достичь

Я пытаюсь настроить набор инструментов для компиляции приложений OpenCL для Intel FPGA. Поэтому после создания хост-приложения на основе C ++ мне нужно вызвать автономный компилятор Intel 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)

Что не работает Запуск этого в CLion IDE под Linux приводит к этой ошибке:

/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 был отредактирован?

1 Ответ

1 голос
/ 17 апреля 2019

Как видно из сообщения об ошибке, 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

как отдельный исполняемый файл .

Это потому, что вы заключаете КОМАНДУ в своем скрипте с двойными кавычками .

Удалите эти двойные кавычки, чтобы все работало.


Как и во многих других сценарияхна языках в двойных кавычках CMake строка в кавычках интерпретируется как единственный аргумент для функции или макроса.

Но в add_custom_command / add_custom_target действует ключевое слово COMMAND запускает список аргументов , первый из которых обозначает исполняемый файл и другие разделенные параметры для этого исполняемого файла.

...