4

我想允许用户运行一个 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() 行上发生的编译器查找例程。

有一个更好的方法吗?我是否误解了我应该如何设置编译器?

4

3 回答 3

3

这样做的最好方法,也是 CMake 鼓励的,是有几个具有不同配置的源外构建目录。

众所周知,在创建 cmake 缓存之后甚至不可能更改编译器,因此在第一次使用命令行调用 cmake 时直接设置选项更为明智:

mkdir mpi-build && cd mpi-build && cmake -DUSE_MPI=ON ..
于 2014-07-10T23:19:22.783 回答
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

例子

于 2014-07-11T05:04:36.340 回答
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()
于 2018-07-11T21:54:45.433 回答