CMakeで実行ファイルの出力先を分けるときの設定

CMakeで複数ターゲットを作ると、実行ファイルやライブラリがどこに出るのか分かりづらくなることがあります。

build/app/my_app のようにディレクトリごとに分かれる構成もありますが、成果物をまとめたい場合は出力先を指定します。

実行ファイルの出力先

実行ファイルは RUNTIME_OUTPUT_DIRECTORY で指定できます。

add_executable(my_app
  src/main.cpp
)

set_target_properties(my_app PROPERTIES
  RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)

これで実行ファイルは build/bin に出ます。

https://cmake.org/cmake/help/latest/prop_tgt/RUNTIME_OUTPUT_DIRECTORY.html

ライブラリの出力先

静的ライブラリと共有ライブラリは、それぞれ設定が分かれます。

add_library(my_lib
  src/lib.cpp
)

set_target_properties(my_lib PROPERTIES
  ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
  LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
  RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
プロパティ 対象
RUNTIME_OUTPUT_DIRECTORY 実行ファイル、WindowsのDLL
LIBRARY_OUTPUT_DIRECTORY 共有ライブラリ
ARCHIVE_OUTPUT_DIRECTORY 静的ライブラリ

共有ライブラリをWindowsでも扱うなら、DLLが RUNTIME 側に出る点を見ておきます。

全ターゲット共通にする場合

ターゲットごとに書くのが面倒なら、変数で全体のデフォルトを指定できます。

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

この設定は、その後に作られるターゲットの初期値として使われます。

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

すでに作ったターゲットには効かないため、書く位置には注意します。

installとは別の話

出力先の設定と install() は別です。

RUNTIME_OUTPUT_DIRECTORY はビルド時にどこへ出すか。

install() はインストール時にどこへ配置するか。

配布やCI成果物として整理したい場合は、出力先だけでなく CMakeで実行ファイルとライブラリをinstallするときの設定 も見ておくとよいです。

まとめ

CMakeで成果物の場所を揃えたい場合は、出力先プロパティを使います。

  • 実行ファイルは RUNTIME_OUTPUT_DIRECTORY
  • 共有ライブラリは LIBRARY_OUTPUT_DIRECTORY
  • 静的ライブラリは ARCHIVE_OUTPUT_DIRECTORY
  • 全体の初期値は CMAKE_*_OUTPUT_DIRECTORY
  • install() とは役割が違う

ビルド中の見通しをよくしたいなら出力先設定、配布先を決めたいならinstall設定、と分けて考えると整理しやすいです。

関連記事

参考