我想允许用户运行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)。您可以更改gui中的选项,但为时已晚,再次配置/生成将不会更新缓存。即使用户确实打开了该选项,编译器仍保持设置状态。
我似乎想要做的是重新运行在project()行上发生的编译器查找例程。
有更好的方法吗?我是否误解了如何设置编译器?
答案 0 :(得分:3)
这样做的最佳方式,也是CMake鼓励的,是有几个不同配置的源外构建目录。
在创建cmake缓存之后更改编译器是非常困难甚至是不可能的,因此在使用命令行首次调用cmake时直接设置选项更明智:
mkdir mpi-build && cd mpi-build && cmake -DUSE_MPI=ON ..
答案 1 :(得分:1)
您可以使用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
答案 2 :(得分: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()