CMakeで実行ファイルとライブラリをinstallするときの設定

CMakeでビルドできるようになった後、次に必要になるのがinstall設定です。

手元で動かすだけなら build/ の中にある実行ファイルを直接使えば十分です。ただ、配布、パッケージ化、CI成果物の整理まで考えると、install() を書いておいた方が扱いやすくなります。

実行ファイルをinstallする

add_executable(my_app
  src/main.cpp
)

install(TARGETS my_app
  RUNTIME DESTINATION bin
)

install(TARGETS) はターゲットをinstall対象にするコマンドです。

https://cmake.org/cmake/help/latest/command/install.html

RUNTIME DESTINATION bin は、実行ファイルを bin に配置する設定です。

ライブラリをinstallする

ライブラリも同じように書けます。

add_library(my_lib
  src/lib.cpp
)

install(TARGETS my_lib
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib
  RUNTIME DESTINATION bin
)

ざっくり分けるとこうです。

種類 使うDESTINATION
実行ファイル RUNTIME
静的ライブラリ ARCHIVE
共有ライブラリ LIBRARY

WindowsではDLLが RUNTIME 側になるため、共有ライブラリを扱うなら RUNTIME も書いておきます。

ヘッダーをinstallする

ヘッダーは install(FILES) で配置できます。

install(FILES
  include/my_lib.hpp
  DESTINATION include
)

複数のヘッダーをまとめるなら、ディレクトリごとinstallする形もあります。

install(DIRECTORY include/
  DESTINATION include
)

実行するコマンド

cmake -S . -B build
cmake --build build
cmake --install build --prefix dist

この場合、dist 以下にinstallされます。

dist/
├── bin/
│   └── my_app
└── lib/
    └── libmy_lib.a

--prefix を指定しない場合は、CMAKE_INSTALL_PREFIX が使われます。

https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html

クロスコンパイル時の注意

クロスコンパイルでは、ターゲット上の配置先とホスト上の一時配置先を分けることがあります。

その場合は CMAKE_STAGING_PREFIX も関係します。

sysrootやstagingの話は CMakeのクロスコンパイルでsysrootを設定する理由 に分けています。

まとめ

CMakeで成果物を整理するなら、install() を書いておきます。

  • 実行ファイルは RUNTIME DESTINATION bin
  • 静的ライブラリは ARCHIVE DESTINATION lib
  • 共有ライブラリは LIBRARY DESTINATION lib
  • ヘッダーは install(FILES) または install(DIRECTORY)
  • 実行は cmake --install build --prefix dist

ビルドできるだけで終わらせず、どこに置くかまでCMakeに書いておくと、CIや配布で使いやすくなります。

関連記事

参考