Как включить заголовки, созданные компилятором ISPC, в проект CMake?
Я использую ISPC для компиляции файлов .ispc и связывания их с моим проектом C++ с помощью CMake. Особенностью ISPC является то, что он генерирует файлы заголовков, которые должны быть включены в код C++. Для простоты сборки все мои файлы ISPC находятся в одной статической библиотеке. Ядро моего кода на C++ находится в статической библиотеке, которая зависит от библиотеки ISPC. Наконец, исполняемый файл моего проекта является отдельным проектом и связан с основным кодом C++ (это для модульного тестирования, но здесь это не имеет значения).
Вот моя файловая структура:
src/
|
+ core/
| |
| +--CMakeLists.txt
| +--core_code.cpp
| |
| + ispc/
| |
| +--CmakeLists.txt
| +--simd_code.ispc
|
+ runner/
|
+--CMakeLists.txt
+--main.cpp
Соответствующие части моих файлов CMakeLists следующие:
# src/CMakeList.txt
add_subdirectory(core)
add_subdirectory(runner)
# src/core/CMakeLists.txt
add_library(CoreLib STATIC)
target_sources(CoreLib PUBLIC core_code.cpp)
# Add ISPC dependent code
add_subdirectory(ispc)
target_link_libraries(CoreLib PUBLIC IspcLib)
target_include_directories(CoreLib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# I believe I need to specify another include dirs here - where the ISPC headers are generated
# src/core/ispc/CMakeLists.txt
add_library(IspcLib STATIC simd_code.ispc)
# No include dirs or link libs since the ispc code is stand-alone
# src/runner/CMakeLists.txt
add_executable(ProjectExe main.cpp)
target_link_libraries(ProjectExe PRIVATE CoreLib)
Удивительно, но я могу создать свою цель CoreLib (core_code.cpp включает в себяsimd_code_ispc.h
, сгенерированный заголовок). Глядя на файл make, можно увидеть, что каталог включения, который он указывает при сборке основной цели,C:\\...\MyProject\cmake-build-debug\src\core\ispc\CMakeFiles\IspcLib.dir\\.\
и, конечно же, это место, где ISPC сгенерировал файлы. Я не могу построить свою цель бегуна, которая зависит от ядра, из-за ошибки, которую#include simd_code_ispc.h
не найден.
Я знаю, что могу жестко закодировать этот каталог в своих включениях, но я ищу, как мне это сделать; таким образом, который не является специфичным для моей машины, но все же позволяет мне изменить структуру моего проекта и будет работать во время сборки и установки.
Я видел в Интернете несколько примеров, в которых используется пользовательская команда (включая этот пост об обмене стеками ), но CMake добавил интеграцию ISPC в 3.19, поэтому я бы предпочел использовать ее.