【CMake超解説】BINARY_DIRの全てが分かる!用途、サンプルコード、代替方法まで


CMake の "Properties: Targets" における "BINARY_DIR" プロパティは、ターゲットが生成されるディレクトリのパスを格納します。これは、ターゲット生成後の実行ファイルやライブラリなどの配置場所を特定するために使用されます。

導入バージョン

"BINARY_DIR" プロパティは CMake 3.4 で導入されました。

構文

get_target_property(TARGET_NAME BINARY_DIR VARIABLE_NAME)

このコマンドは、指定されたターゲット TARGET_NAME の "BINARY_DIR" プロパティの値を取得し、変数 VARIABLE_NAME に格納します。

add_executable(my_app main.cpp)
get_target_property(my_app BINARY_DIR app_dir)
message(STATUS "The binary directory for 'my_app' is: ${app_dir}")

この例では、my_app という名前の実行ファイルターゲットが作成され、その "BINARY_DIR" プロパティの値が app_dir 変数に格納されます。その後、message() コマンドを使用して、ターゲットの実行ファイルが配置されるディレクトリパスが表示されます。

用途

"BINARY_DIR" プロパティは、以下の用途に使用できます。

  • カスタムコマンドでのターゲット生成ディレクトリへのアクセス
  • インストールコマンドでの出力ファイルの指定
  • 生成された実行ファイルやライブラリの場所を特定する

注意点

  • "BINARY_DIR" プロパティは、ターゲットが生成されるディレクトリのみを指します。実行ファイルやライブラリの実際のファイル名は、ターゲット名と拡張子によって決定されます。
  • マルチ構成ジェネレータを使用している場合、"BINARY_DIR" プロパティは構成ごとに異なる値を持つ場合があります。
  • "BINARY_DIR" プロパティは読み取り専用です。

"BINARY_DIR" プロパティに加えて、CMake にはターゲットの出力ファイルの場所を指定するための他のプロパティも用意されています。これらのプロパティには、RUNTIME_OUTPUT_DIRECTORYLIBRARY_OUTPUT_DIRECTORYARCHIVE_OUTPUT_DIRECTORY などがあります。



例 1: 生成された実行ファイルやライブラリの場所を特定する

add_executable(my_app main.cpp)
get_target_property(my_app BINARY_DIR app_dir)
message(STATUS "The binary directory for 'my_app' is: ${app_dir}")

add_library(my_lib my_lib.cpp)
get_target_property(my_lib BINARY_DIR lib_dir)
message(STATUS "The library directory for 'my_lib' is: ${lib_dir}")

この例では、my_app という名前の実行ファイルターゲットと my_lib という名前のライブラリターゲットが作成されます。それぞれのターゲットの "BINARY_DIR" プロパティの値が取得され、app_dir 変数と lib_dir 変数に格納されます。その後、message() コマンドを使用して、各ターゲットの出力ファイルが配置されるディレクトリパスが表示されます。

例 2: インストールコマンドでの出力ファイルの指定

install(TARGETS my_app DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
install(TARGETS my_lib DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)

この例では、my_app 実行ファイルと my_lib ライブラリがインストールされます。それぞれのターゲットの "BINARY_DIR" プロパティは、CMAKE_INSTALL_PREFIX 変数によって決まるインストール先ディレクトリ (/bin または /lib) に設定されます。

例 3: カスタムコマンドでのターゲット生成ディレクトリへのアクセス

add_custom_command(
    TARGET my_app
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${app_dir}/data ${CMAKE_INSTALL_PREFIX}/share/my_app
)

この例では、my_app ターゲットのビルド後に実行されるカスタムコマンドが定義されます。このコマンドは、app_dir 変数 (ターゲットの "BINARY_DIR" プロパティの値) に格納されている data ディレクトリを、CMAKE_INSTALL_PREFIX 変数によって決まるインストール先ディレクトリ (/share/my_app) にコピーします。



プロジェクトディレクトリを使用する

最も単純な代替方法は、プロジェクトディレクトリを直接使用することです。これは、すべてのターゲットが同じディレクトリに生成される場合に有効です。以下の例をご覧ください。

add_executable(my_app main.cpp)
set_target_properties(my_app RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")

この例では、my_app ターゲットの実行ファイルは、ソースコードと同じディレクトリ (CMAKE_CURRENT_SOURCE_DIR 変数で取得) に生成されます。

CMAKE_CURRENT_BINARY_DIRを使用する

CMAKE_CURRENT_BINARY_DIR 変数は、現在のCMakeディレクトリ (ビルドディレクトリ) のパスを格納します。これは、ターゲット生成ディレクトリを明示的に設定せずに、ターゲットをビルドディレクトリのサブディレクトリに配置する場合に役立ちます。以下の例をご覧ください。

add_executable(my_app main.cpp)
set_target_properties(my_app RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")

この例では、my_app ターゲットの実行ファイルは、ビルドディレクトリの bin サブディレクトリに生成されます。

カスタム変数を使用する

プロジェクト固有の要件に合わせて、カスタム変数を使用してターゲット生成ディレクトリを定義することもできます。以下の例をご覧ください。

set(MY_APP_BINARY_DIR "${CMAKE_BINARY_DIR}/my_app")
add_executable(my_app main.cpp)
set_target_properties(my_app RUNTIME_OUTPUT_DIRECTORY "${MY_APP_BINARY_DIR}")

この例では、MY_APP_BINARY_DIR というカスタム変数が定義され、my_app ターゲットの実行ファイルは、その変数で指定されたディレクトリに生成されます。

Out-of-sourceビルドを使用する

Out-of-sourceビルドでは、ソースコードディレクトリとは別の場所にビルドディレクトリを設定します。この場合、CMAKE_BINARY_DIR 変数はビルドディレクトリのパスを指します。以下の例をご覧ください。

# ソースコードディレクトリ
mkdir build
cd build

# ビルドディレクトリ
cmake ..
make

この例では、build ディレクトリがビルドディレクトリとして設定され、CMAKE_BINARY_DIR 変数は build ディレクトリのパスを指します。

最適な方法の選択

使用する代替方法は、プロジェクトのニーズと要件によって異なります。単純なプロジェクトの場合は、プロジェクトディレクトリを使用する方が簡単かもしれません。一方、より複雑なプロジェクトや、ターゲット生成ディレクトリをより細かく制御する必要がある場合は、カスタム変数やOut-of-sourceビルドなどの方法が適している可能性があります。

  • CMakeには、ターゲット生成ディレクトリを制御するための他にも様々なオプションがあります。詳細については、CMakeの公式ドキュメントを参照してください。
  • 上記の代替方法はすべて、RUNTIME_OUTPUT_DIRECTORY プロパティを使用して実行ファイルの出力ディレクトリを指定しています。ライブラリの場合には、LIBRARY_OUTPUT_DIRECTORY プロパティを使用する必要があります。