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

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 に答える