タイトルが調子いけど、ひさびさにCMakeについて調べたついでのメモ代わりとして。
全部知ってたとか言わないで。
cmake コマンドの実行
ビルドシステムの生成 (cmake ..) from 3.13
-S と -B オプションで、ソースツリーとビルドツリーの場所を指定できる。
mkdir build;cd build; cmake .. とかしなくていい。
ビルドツリーで指定したディレクトリが存在しない場合は自動的に作成される。
$ cmake -S <ソースツリー> -B <ビルドツリー>
CI script ならこちらのほうが好まれそう
ビルドの実行 (--build オプション)
ビルドシステムに依存せずに、ビルドを実行できる。
$ cmake --build <ビルドツリー>
ビルドスクリプトなどでこの記述にしておくとビルドシステムを透過的に扱える。
ターミナルで実行している場合は、make って叩いたほうが速いけどね
インストール先の変更 (--install と --prefix オプション) from 3.15
--install オプションで、make install 相当のことができる。さらに --prefix オプションで CMAKE_INSTALL_PREFIX を上書きできる。
$ cmake --install <ビルドツリー> --prefix <インストールprefix>
あの長い変数名を打たなくていいし、何よりビルドからやり直さなくていい。
ビルド時の実行コマンドを表示する
実行されるコマンドを確認したい場合、以下の2つの方法がある(Makefileのみで実機確認)
方法1. cmake コマンドでのビルドシステム作成時に-DCMAKE_VERBOSE_MAKEFILE=1を指定する。
$ cmake -B build -DCMAKE_VERBOSE_MAKEFILE=1
この記事にあるように CMakeファイルに直接set() コマンドで記述してもよい。
方法2. make時に VERBOSE環境変数を設定する。(値はなんでもいい)
$ VERBOSE=1 make
find_package() コマンドがパッケージを見つけてくれない
cmake コマンドでのビルドシステム作成時に -DCMAKE_FIND_DEBUG_MODE=1を指定すると、以下のコマンドの検索履歴が表示される。
- find_program()
- find_library()
- find_file()
- find_path()
- find_package()
CMakeLists.txt の記述
find_package() を project() の前に書かない
StackOverflow: CMake on Linux: “target platform does not support dynamic linking”
実機検証中に「お前のプラットフォームは実行時リンクをサポートしてないぞ」とか怒られてハマった。
便利モジュール
CMakeプロジェクトをダウンロード (FetchContent) from 3.11
FetchContent モジュールでは、GitなどのSCMや、httpでtar.gzで取得した CMakeプロジェクトを、CMakeLists.txtで扱える形で(ここ重要) CMakeLists.txtの中で利用できる。
似たようなExternalProject というモジュールが以前からあったけど、こちらはダウンロードしたファイルを CMakeLists.txt で扱えなかった(cmake コマンド実行時にはまだダウンロードされていない)ため、正直「これ何に使うんだろう」とか「調査に費やした時間を返して」とか思っていました。
add_subdirectory("${foo_SOURCE_DIR}")と実行すれば、fooプロジェクトのターゲットがそのまま使える。
これが欲しかったんですよ。