Я хочу позволить пользователям запускать инструмент конфигурации 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 ().
Есть лучший способ сделать это? Я неправильно понимаю, как я должен настроить компилятор?
Лучший способ сделать это, и это поощряется CMake, — это иметь несколько каталогов компоновки вне источника с различными конфигурациями.
Общеизвестно, что, возможно, даже невозможно изменить компилятор после создания кэша cmake, поэтому разумнее напрямую установить этот параметр при первом вызове cmake с использованием командной строки:
mkdir mpi-build && cd mpi-build && cmake -DUSE_MPI=ON ..
Ты можешь использовать 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
Я просто добавляю это в «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()