46
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ここで差がつく cmake TIPS

Posted at

タイトルが調子いけど、ひさびさに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プロジェクトのターゲットがそのまま使える。

これが欲しかったんですよ。

46
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?