Как мне разрешить пользователям перенастраивать компилятор для использования с cmake?

Я хочу позволить пользователям запускать инструмент конфигурации cmake (например, ccmake или cmake-gui), чтобы изменить используемый компилятор. Это необходимо, так как я создаю кроссплатформенную программу, которая иногда запускается в кластере (и, следовательно, нуждается в специфичных для кластера компиляторах, которые имеют соответствующую конструкцию MPI), но иногда работает в режиме без MPI.

Давайте предположим, что компилятор обычно может быть тем, чего ожидает платформа (обычно gcc / g ++ или в худшем случае MSVC), но когда мы используем MPI, мы всегда знаем, что нам нужно компилировать через mpicc / mpicxx.

Я чувствую, что следующий код должен работать:

cmake_minimum_required(VERSION 2.4)

option(USE_MPI "Is this on an MPI system?" OFF)

if (USE_MPI)
message(STATUS "Setting compiler to MPIC")
set(CMAKE_CXX_COMPILER mpicxx)
set(CMAKE_C_COMPILER mpicc)
endif(USE_MPI)

project(test_project)

add_executable(testprogram test.cpp)

Выше приведен упрощенный пример, но я считаю, что он демонстрирует то, что я пытаюсь сделать.

Это предполагает, что mpicxx и mpicc находятся на пути, но это не проблема. Проблема возникает потому, что когда вы запускаете ccmake или cmake-gui, он оценивает и опускает путь по умолчанию для опции «off», затем попадает в строку проекта и записывает в кеш путь и варианты выбора, подходящие для стандартного, собственного компилятора (обычно GCC). Вы можете изменить параметры в графическом интерфейсе, но это слишком поздно, повторная настройка / генерация не обновит кэш. Даже если пользователь включит эту опцию, компилятор останется включенным.

То, что я, похоже, хочу сделать, это перезапустить процедуру поиска компилятора, которая происходит в строке project ().

Есть лучший способ сделать это? Я неправильно понимаю, как я должен настроить компилятор?

4

Решение

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

Общеизвестно, что, возможно, даже невозможно изменить компилятор после создания кэша cmake, поэтому разумнее напрямую установить этот параметр при первом вызове cmake с использованием командной строки:

mkdir mpi-build && cd mpi-build && cmake -DUSE_MPI=ON ..
3

Другие решения

Ты можешь использовать CMAKE_TOOLCHAIN_FILE чтобы установить компилятор вам нужно:

# gcc.cmake
message("We will use GCC compiler")
set(CMAKE_C_COMPILER gcc CACHE STRING "C compiler" FORCE)
set(CMAKE_CXX_COMPILER g++ CACHE STRING "C++ compiler" FORCE)

# clang.cmake
message("We will use Clang compiler")
set(CMAKE_C_COMPILER clang CACHE STRING "C compiler" FORCE)
set(CMAKE_CXX_COMPILER clang++ CACHE STRING "C++ compiler" FORCE)

использование

> cmake -H. -B_builds/clang -DCMAKE_TOOLCHAIN_FILE=clang.cmake
We will use Clang compiler
-- The C compiler identification is Clang 3.5.0
-- The CXX compiler identification is Clang 3.5.0

> cmake -H. -B_builds/gcc -DCMAKE_TOOLCHAIN_FILE=gcc.cmake
We will use GCC compiler
-- The C compiler identification is GNU 4.9.0
-- The CXX compiler identification is GNU 4.9.0

Примеры

1

Я просто добавляю это в «CMakeLists.txt», и это работает.

    option(USE_MPI "Build with MPI" ON)

if(USE_MPI)
message("We will use mpi compiler")
set(CMAKE_C_COMPILER mpicc CACHE STRING "mpicc compiler" FORCE)
set(CMAKE_CXX_COMPILER mpic++ CACHE STRING "mpiC++ compiler" FORCE)
endif()
0