CMake を使用して GCC と Clang/LLVM を切り替える 質問する

CMake を使用して GCC と Clang/LLVM を切り替える 質問する

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 を使用してコンパイルする場合、システムのデフォルトではなくプログラムを使用する必要がありますか? 違いは何ですか?

ベストアンサー1

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オーバーライドファイルに入れて、CMAKE_USER_MAKE_RULES_OVERRIDE~/ClangOverrides.txt変数を追加します。次の内容のファイルを作成します。

SET (CMAKE_C_FLAGS_INIT                "-Wall -std=c11")
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 -std=c++17")
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*_FLAGSCMake は対応する変数を指定された値で初期化します。次に、cmake次のように呼び出します。

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

最後に、LLVM binutils の使用を強制するには、内部変数を設定します_CMAKE_TOOLCHAIN_PREFIX。この変数はモジュールによって尊重されますCMakeFindBinUtils

$ cmake -D_CMAKE_TOOLCHAIN_PREFIX=llvm- ..

_CMAKE_TOOLCHAIN_LOCATIONCMake バージョン 3.9 以降では設定は不要になりました。

CCこれらすべてを組み合わせると、環境変数を設定し、前述の変数オーバーライドでCXX呼び出すシェル ラッパーを作成できます。cmake

こちらもご覧くださいCMake に関するよくある質問オーバーライドファイルの作成時。

おすすめ記事