きちんとCMakeのfind_packageを使いましょう

Introduction

かなり前に、開発メモ その94 boostを使った最小のCMakeプロジェクト その2を記事にしたのですが

  • リンクするライブラリを個別に全部手書き
  • find_packageを使っていない

というあまり宜しくない作りをしていました。

といっても、個人的には、自分が何を使っているのか、明示的にどこのディレクトリにあるライブラリをリンクしているかを意識できるように、パスを外部から指摘できる方式は好んで使います。
CMakeはライブラリが見つからないさい、どこを探しに行ったのかという情報が見えづらかったり、親切な作りになっていないのが不満です。

無論、クロスプラットフォームで作ったりする際は絶大なパワーを発揮するのですが…

Boost程度、自分でビルドして、find_packageでサクッと使ってみようと思いました。

が、1点だけ嵌りました。
Windows、OSXはすんなりだったのに、Linuxだけはダメでした。

What’s wrong?

結論から言えば、CMakeにおけるConfigモード、つまり、 <パッケージ名>Config.cmakeの場所を環境変数で指定する方法で問題が起きました。
問題は環境変数名。
大文字と小文字を明確に区別したため、find_packageに失敗しました。
Windows、OSXでは大文字小文字を区別しなかったのですが…

WindowsとOSXでは

1
2
3
4
$env:BOOST_DIR = "${boost_dir}/${boost_source_dir}/win64/cmake/boost-${boost_version}"
cmake -G "Visual Studio 15 2017" -A x64 -T host=x64 `
-D BOOST_DIR="$env:BOOST_DIR" `
..

Linuxではこう。

1
2
3
$env:Boost_DIR = "${boost_dir}/${boost_source_dir}/linux/cmake/Boost-${boost_version}"
cmake -D Boost_DIR="$env:Boost_DIR" `
..

-Gオプションが違いますが、環境変数とCMakeの引数BOOST_DIRBOOSTBoostかどうかがミソです。
別に分ける必要はないですが、環境引数に合わせて大文字にしていたのが運の尽きでした。

ビルド後に生成されるCMakeの設定ファイルは、win64\cmake\Boost-1.73.0\BoostConfig.cmake のような感じですが、CMakeにおけるConfigモードではパッケージ名は <パッケージ名>Config.cmake です。
つまりBoostになります。
そして、環境変数による指定も、Boost_DIRとなります。

それだけですが…はまりました。