1. ホーム
  2. cmake

[解決済み】CMakeでGCCとClang/LLVMの切り替えを行う。

2022-03-29 14:22:20

質問

CMakeを使ってビルドしたプロジェクトがいくつかあるのですが、それらをコンパイルするためにGCCとClang/LLVMのどちらを使うかを簡単に切り替えられるようにしたいのです。私は、Clangを使用するために、以下を設定する必要があると信じています(私が間違っているならば、私を修正してください!)。

    SET (CMAKE_C_COMPILER             "/usr/bin/clang")
    SET (CMAKE_C_FLAGS                "-Wall -std=c99")
    SET (CMAKE_C_FLAGS_DEBUG          "-g")
    SET (CMAKE_C_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
    SET (CMAKE_C_FLAGS_RELEASE        "-O4 -DNDEBUG")
    SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")

    SET (CMAKE_CXX_COMPILER             "/usr/bin/clang++")
    SET (CMAKE_CXX_FLAGS                "-Wall")
    SET (CMAKE_CXX_FLAGS_DEBUG          "-g")
    SET (CMAKE_CXX_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
    SET (CMAKE_CXX_FLAGS_RELEASE        "-O4 -DNDEBUG")
    SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")

    SET (CMAKE_AR      "/usr/bin/llvm-ar")
    SET (CMAKE_LINKER  "/usr/bin/llvm-ld")
    SET (CMAKE_NM      "/usr/bin/llvm-nm")
    SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
    SET (CMAKE_RANLIB  "/usr/bin/llvm-ranlib")

これらの変数とデフォルトのGCC変数の間を切り替える簡単な方法はありますか?できれば、プロジェクト固有ではなく、システム全体の変更として(すなわち、プロジェクトのCMakeLists.txtにそれらを追加するだけでなく)?

また llvm-* のプログラムは、gcc の代わりに clang を使ってコンパイルする場合、システムのデフォルトではなくなるのでしょうか?どう違うのでしょうか?

解決方法は?

CMake は環境変数を尊重する CCCXX CコンパイラとC++コンパイラを検出した場合。

$ export CC=/usr/bin/clang
$ export CXX=/usr/bin/clang++
$ cmake ..
-- The C compiler identification is Clang
-- The CXX compiler identification is Clang

コンパイラ固有のフラグは、make override ファイルに記述し、そのファイル中の CMAKE_USER_MAKE_RULES_OVERRIDE 変数に格納します。ファイルを作成する ~/ClangOverrides.txt を以下の内容で作成します。

SET (CMAKE_C_FLAGS_INIT                "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG_INIT          "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL_INIT     "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE_INIT        "-O3 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")

SET (CMAKE_CXX_FLAGS_INIT                "-Wall")
SET (CMAKE_CXX_FLAGS_DEBUG_INIT          "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL_INIT     "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE_INIT        "-O3 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")

サフィックス _INIT は、CMake が対応する *_FLAGS 変数に与えられた値で 次に cmake を次のようにしてください。

$ cmake -DCMAKE_USER_MAKE_RULES_OVERRIDE=~/ClangOverrides.txt ..

最後に、LLVM binutilsの使用を強制するために、内部変数に _CMAKE_TOOLCHAIN_PREFIX . この変数は CMakeFindBinUtils モジュールで使用されます。

$ cmake -D_CMAKE_TOOLCHAIN_PREFIX=llvm- ..

これをまとめると、環境変数を設定するシェルラッパーを書くことができます。 CCCXX を起動し cmake を、前述の変数のオーバーライドで使用します。

こちらもご覧ください CMake FAQ を上書きしてください。