[解決済み】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 を使ってコンパイルする場合、システムのデフォルトではなくなるのでしょうか?どう違うのでしょうか?
解決方法は?
CMake は環境変数を尊重する
CC
と
CXX
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- ..
これをまとめると、環境変数を設定するシェルラッパーを書くことができます。
CC
と
CXX
を起動し
cmake
を、前述の変数のオーバーライドで使用します。
こちらもご覧ください CMake FAQ を上書きしてください。
関連
-
[解決済み] CMakeは "make uninstall "をサポートしていますか?
-
[解決済み] CMake の add_definitions が動作しないようです。
-
[解決済み] CMake でモジュールディレクトリが見つからない
-
[解決済み] CMakeでポータブルパラレルビルドを設定するには?
-
[解決済み] CMAKE_SOURCE_DIRはどこですか?
-
[解決済み] CMakeのオプション()をコマンドラインで設定する方法
-
[解決済み] .cmakeファイルの目的は何ですか?
-
[解決済み] MakefileとCMakeを使ったコンパイルの違いについて
-
[解決済み】CMakeをGNU Makeと一緒に使う:正確なコマンドを見るにはどうすればいい?
-
[解決済み】CMakeは具体的にどのように動作するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] CMakeは "make uninstall "をサポートしていますか?
-
[解決済み] プロジェクトでCMAKE_CXX_FLAGSを変更する
-
[解決済み] CMake の add_definitions が動作しないようです。
-
[解決済み] CMAKE_SOURCE_DIRはどこですか?
-
[解決済み] cmakeのincludeコマンドにおいて、ファイルとモジュールの違いは何ですか?
-
[解決済み] CMakeのオプション()をコマンドラインで設定する方法
-
[解決済み】CMakeをGNU Makeと一緒に使う:正確なコマンドを見るにはどうすればいい?
-
[解決済み】CMakeでGCCとClang/LLVMの切り替えを行う。
-
[解決済み】CMake:スクリプト内のアクセス可能なすべての変数を出力する
-
[解決済み】CMakeは具体的にどのように動作するのですか?