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や配布で使いやすくなります。


