CMakeでCFLAGSのデフォルト値を変更する方法

CMakeで コンパイラに渡すオプションの初期値を変更する方法です

CMakeの公式FAQに「正しい」方法が書いてあるので、その方法を紹介します
https://gitlab.kitware.com/cmake/community/-/wikis/FAQ

設定ファイルの作成

ファイル名はなんでもよいのですが、設定ファイルを二つ作成します。とりあえずFAQにならい、c_flag_overrides.cmake と cxx_flag_overrides.cmake というファイル名にします

この二つのファイルを CMakeLists.txt と同じディレクトリに保存します

c_flag_overrides.cmakeの中身は以下の通り

if(MSVC)
  set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
  set(CMAKE_C_FLAGS_MINSIZEREL_INIT     "/MT /O1 /Ob1 /D NDEBUG")
  set(CMAKE_C_FLAGS_RELEASE_INIT        "/MT /O2 /Ob2 /D NDEBUG")
  set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG")
endif()

cxx_flag_overrides.cmakeの中身は以下の通り

if(MSVC)
  set(CMAKE_CXX_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
  set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT     "/MT /O1 /Ob1 /D NDEBUG")
  set(CMAKE_CXX_FLAGS_RELEASE_INIT        "/MT /O2 /Ob2 /D NDEBUG")
  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG")
endif()

CMAKE_C_FLAGS_??? がC言語用のオプションの初期値、 CMAKE_CXX_FLAGS_???が C++用のオプションの初期値になります。

また _DEBUG_INIT はDEBUGビルド、_RELEASE_INIT はReleaseビルド、とリリース毎に初期値が指定できます。ここでいう「リリース」とはCMAKE_BUILD_TYPEで指定したものに対応します。


上記の例は if(MSVS)を使って、visual studioでビルドした場合だけ コンパイラオプションの初期値を変更するようにしています。GCCXcodeをつかう場合は適宜

if (APPLE)
elseif (MSVC)
elseif (LINUX)
else()
endif()

などで切り替えましょう

CmakeLists.txt の 編集

次に CMakeLists.txt を編集します

CMakeLists.txt には project(hogehoge)という行が必ずあります。「その行よりも前に」 以下のコードを追加します

set(CMAKE_USER_MAKE_RULES_OVERRIDE
  ${CMAKE_CURRENT_SOURCE_DIR}/c_flag_overrides.cmake)
set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX
  ${CMAKE_CURRENT_SOURCE_DIR}/cxx_flag_overrides.cmake)
project(hogehoge)

これで設定は完了です。

注意事項

cmakeは前回実行したcmakeの結果をキャッシュしてます。キャッシュに古い情報が残っていると、上記の編集結果が反映されません。