Настройка различных компиляторов в CMake для создания общей библиотеки

Я хочу установить различные компиляторы для разных папок в моем проекте, которые должны компилироваться в общую библиотеку.

Структура проекта следующая:

/Cuda
    a.cu
    b.cu
    c.cu
    header.cuh
/SYCL
    a.cpp
    b.cpp
    c.cpp
    header.h
main.cpp
test.cpp

Все файлы в папке Cuda должны быть скомпилированы nvcc, а файлы в папке SYCL — специальным компилятором, который присутствует по пути в системе. Все файлы за пределами этих папок (а именно main.cpp и test.cpp) представляют собой обычный код C++ и используют заголовки, присутствующие в этих двух папках, и должны быть скомпилированы с помощью GCC.

Как мне написать CMake для такой структуры проекта (которая должна быть общей библиотекой).

Изменить. В проекте не обязательно должен быть только один выделенный CMake. Мой подход был следующим:

  • Каждая папка (Cuda и SYCL) может иметь свой выделенный файл CmakeLists.txt, в котором будет указан компилятор и различные флаги для него.
  • Главный CMake вне папки может использовать команду add_subdirectory. И вот тут я застрял, не знаю, что делать дальше, как связать эти две папки с основным и тестовым файлами.

person Atharva Dubey    schedule 27.06.2021    source источник
comment
Это сообщение может ответить на ваш вопрос. Короче говоря, CMake не поддерживает использование нескольких компиляторов для одного и того же языка в одном проекте CMake.   -  person Jérôme Richard    schedule 27.06.2021
comment
Спасибо за ваш ответ @JérômeRichard. Хотя один файл CMake может не иметь такой функциональности, я подумал, что, возможно, каждая папка может содержать выделенный файл CMakeLists.txt, а главный CMake может использовать команду add_subdirectory. А выделенный Cmake может указать компиляторы и все остальное. Кроме того, я полагаю, что этот ответ устарел. Как следует из этого ответа (stackoverflow.com/questions/58861467/), можно указать язык компиляции для определенных файлов в проекте.   -  person Atharva Dubey    schedule 27.06.2021


Ответы (1)


CMake позволяет использовать один компилятор для каждого языка, поэтому достаточно просто написать это:

cmake_minimum_required(VERSION 3.20)
project(example LANGUAGES CXX CUDA)

add_subdirectory(Cuda)
add_subdirectory(SYCL)

Вы можете отдельно установить компиляторы C++ и CUDA, установив CMAKE_CXX_COMPILER и CMAKE_CUDA_COMPILER в командной строке configure.

$ cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_CXX_COMPILER=g++ -DCMAKE_CUDA_COMPILER=nvcc

Кроме того, я хочу прояснить это заблуждение:

Каждая папка (Cuda и SYCL) может иметь свой выделенный файл CmakeLists.txt, в котором будет указан компилятор и различные флаги для него.

Файл CMakeLists.txt не должен пытаться указать компилятор. Это сложно сделать правильно, это не всегда можно сделать (особенно в случае add_subdirectory) и излишне ограничивает вашу возможность отключить компилятор. Возможно, у вас установлены и GCC 10, и 11, и вы хотите сравнить их.

Точно так же вы не должны указывать в файле CMakeLists.txt флаги, которые не являются абсолютно необходимыми для сборки, и вы должны всегда проверять документацию CMake, чтобы убедиться, что интересующие вас флаги были абстрагированы. для тебя. Например, CMake имеет специальную обработку стандарта языка C++ (через target_compile_features) и разделяемую компиляцию CUDA (через свойство target CUDA_SEPARABLE_COMPILATION).

Лучшее решение, как я описал здесь, — установить необязательные флаги с помощью переменных *_FLAGS* в предустановке или цепочке инструментов.

person Alex Reinking    schedule 27.06.2021
comment
Спасибо за ответ, я постараюсь продолжить в том же духе и опубликую его как ответ, чтобы сообщество могло просмотреть и сообщить больше о передовом опыте. Кроме того, SYCL по сути является абстракцией C++ OpenCL. Таким образом, третий компилятор, о котором идет речь, по сути является компилятором на основе clang, который компилирует код SYCL в файл C++ и генерирует SPIR. Поэтому я, вероятно, предоставлю компилятору доступ к этим файлам. В любом случае, язык компоновщика по-прежнему C++. - person Atharva Dubey; 28.06.2021