Hatena::ブログ(Diary)

あさっては曇りのち晴れ

2013-01-12

CMakeでデフォルトのコンパイラを書き換える微妙な方法

| 11:54

あけましておめでとうございます。

年が明けて2週間ほど経ちまして、今年最初の更新はまたしてもCMakeネタです。以下言語はC++を例としておりますのであしからず。

さて、コンパイラなんぞはよしなに設定してくれるCMakeですが、時にそれが気に入らない場合もあります。例えば…

  1. Macのg++は古いのでというかC++11使いたいのでclang++がいい
  2. スパコン等でg++じゃなくてベンダさんが指定してるコンパイラを使いたい

なんかg++ディスってるみたいに見えますがそんなことはないです。(メッセージはclangの方が親切だけどこないだ試したら最適化能力はg++の方が高かった。)

で、普通の方法その1。CMake叩くときにセットします。

cmake -DCMAKE_CXX_COMPILER=clang++

いちいちそんなのタイプしてらんないよ。シェルの履歴使…ゲフンゲフン

では普通の方法その2。環境変数をセットします。

export CXX=clang++

シェルの設定に書いておけばいちいちタイプせずに済みます。え?タイプしたくないけど他はg++使いたいだって?いやだからシェルの履…ゲフンゲフン

しょうがないので微妙な方法。CMakeLists.txt冒頭でごにょごにょします。

project(dummy NONE)
  if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
    set(CMAKE_CXX_COMPILER clang++)
  endif()
project(myproject CXX)

先に言語を有効にしないdummyプロジェクトでCMAKE_SYSTEM_NAMEを使えるようにして環境を判別、コンパイラを書き換えます。上の例ではMacなら問答無用でclang++を使います。

ただユーザーがいるようなものならデフォルトの挙動を勝手に変更するのはちょいと考え物かも。あるいは、俺新しいg++入れてっからC++11使いたいからって勝手にclang++にすんじゃねーぞ、という方向けにON/OFFオプションを付けるのも一興かと思います。自分だけで使う分にはやっちゃえばいいと思いますが。

なお以上のネタ元は例によってCMakeのMLよりOrder of operations in CMakeLists.txt file?でした。