C++

cmakeでのDEBUG/RELEASEモード別・サブディレクトリ別のコンパイルオプションの分け方

投稿日:

仕事で使うので備忘録として。

対象となるソースコードツリーは、拙作のcppのプロジェクトのテンプレートで行う

環境は以下

[CPU]
processor       : 0
model name      : Intel(R) Atom(TM) CPU  C2750  @ 2.40GHz
processor       : 1
model name      : Intel(R) Atom(TM) CPU  C2750  @ 2.40GHz

[MEMORY]
MemTotal:        2049756 kB

[KERNEL]
Linux hostname 4.4.88-mainline-rev1 #1 SMP Wed Sep 13 23:49:03 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

[DISTRIBUTION]
Ubuntu 16.04.1 LTS \n \l

[LANGUAGES]
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
Python 2.7.12
Python 3.5.2
GNU Make 4.1
cmake version 3.5.1
Docker version 17.09.0-ce, build afdb6d4

DEBUG/RELEASEモード別コンパイルオプションの分け方

cmakeではデフォルトでDEBUG/RELEASEモードでコンパイルオプションが分けられるようになっている
cmake -Dで以下のオプションを渡すと、通常のビルドオプションであるCMAKE_CXX_FLAGSに加え、追加で設定しておいたオプションを加えてくれる

  • cmake -D で CMAKE_BUILD_TYPE=RELEASE を指定
    • CMakeLists.txt内で CMAKE_CXX_FLAGS_RELEASE として設定したオプションを追加
  • cmake -D で CMAKE_BUILD_TYPE=DEBUG を指定
    • CMakeLists.txt内で CMAKE_CXX_FLAGS_DEBUG として設定したオプションを追加

例となるCMakeListsは以下

ビルドしてみると、オプションが切り替わっていることがわかる

サブディレクトリ別コンパイルオプションの分け方

cmakeのsubdirectory以下に書いたCMakeLists.txtにおいて、setコマンドで設定する各変数は同階層の別のsubdirectoryには波及しない(すなわち、スコープがある)。
したがって、legacyなモジュールをsubdirectoryに移しておいて、当該モジュールではWno-errorにより警告を無視する、といったことが可能になる。

下記のようなソースツリーにおいて、一部のmodule(module1)だけCMakeLists.txtを変えてみる。

|--src
|  |--CMakeLists.txt
|  |--module1
|  |  |--Bar.cpp
|  |  |--Bar.h
|  |  |--CMakeLists.txt
|  |  |--export
|  |  |  |--Foo.h
|  |  |--Foo.cpp
|  |  |--main.cpp
|  |  |--test
|  |  |  |--Bar.h
|  |  |  |--mock.cpp
|  |  |  |--test.cpp
|  |--module2
|  |  |--Bar.cpp
|  |  |--Bar.h
|  |  |--CMakeLists.txt
|  |  |--export
|  |  |  |--Foo.h
|  |  |--Foo.cpp
|  |  |--main.cpp
|  |  |--test
|  |  |  |--Bar.h
|  |  |  |--mock.cpp
|  |  |  |--test.cpp

 

ビルドしてみると、module1のみ-Wno-errorがついていることがわかる

 

 

-C++

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

関連記事

pthread_cancelすると何が行われるのか

仕事でのメモ。 目次1 pthread_cancel2 pthread_cancelで何が行われるのか2.1 シグナル送出2.2 注意2.3 ソースコードを読む2.4 pthread_cancel時の …

C++メタプログラミングでmemcpyを少し安全にする

目次1 背景2 環境3 要件と仕様4 設計・実装5 テスト6 まとめ6.0.1 関連 背景 筆者はC++11を使用して開発を行っています。 開発していると、危険なlibcの関数をラップしてUtilit …

cmake, googletestを利用したC++開発環境の構築テスト

自学用メモ。 業務で使用しているcmakeの勉強がてら、業務に近いソースツリーを作成した。 googletestを用いた単体テストも合わせて書けるような構成になっている。 テンプレートとして、今後のC …

C++のマルチスレッド環境における問題とvalgrindを用いた検出方法

私は仕事でC++を使用してソフトウェアを実装しています。 今回は、C++マルチスレッドプログラミングで発生する問題点とその検出方法を(自分のメモも兼ねて)記述します。 環境は以下になっております。 O …

C++11で作るTypeList(型情報コンテナ)とfor_each

目次1 経緯2 要件と仕様3 設計と実装3.1 LokiのTypeList3.2 C++11時代のTypeList3.3 TypeListへのアクセッサ(リストのサイズ・添字アクセス・型からの添字抽出 …