【保存版】CMakeのRUNTIME_OUTPUT_DIRECTORY_CONFIG:コンフィギュレーションごとの出力場所を極める


RUNTIME_OUTPUT_DIRECTORY_CONFIG は、CMakeのターゲットプロパティの一つであり、特定のコンフィギュレーション(例:Debug、Release)における実行可能ファイル出力ディレクトリを指定するために使用されます。これは、実行可能ファイルの出力場所をコンフィギュレーションごとに個別に制御したい場合に役立ちます。

仕組み

RUNTIME_OUTPUT_DIRECTORY_CONFIG は、ターゲットに追加されるプロパティであり、コンフィギュレーションごとに異なる値を設定できます。これは、set_target_properties() 関数を使用して行われます。

set_target_properties(my_target RUNTIME_OUTPUT_DIRECTORY_CONFIG Debug "${PROJECT_BINARY_DIR}/debug")
set_target_properties(my_target RUNTIME_OUTPUT_DIRECTORY_CONFIG Release "${PROJECT_BINARY_DIR}/release")

上記の例では、my_target ターゲットの RUNTIME_OUTPUT_DIRECTORY_CONFIG プロパティが、Debug コンフィギュレーションでは "${PROJECT_BINARY_DIR}/debug"Release コンフィギュレーションでは "${PROJECT_BINARY_DIR}/release" に設定されています。

動作

CMakeは、ビルドプロセスにおいて、ターゲットの RUNTIME_OUTPUT_DIRECTORY_CONFIG プロパティをコンフィギュレーションごとに確認します。そして、生成された実行可能ファイルを、そのコンフィギュレーションに設定されたディレクトリに出力します。

利点

RUNTIME_OUTPUT_DIRECTORY_CONFIG を使用することで、以下の利点が得られます。

  • ビルドシステムをより整理整頓することができます。
  • デバッグビルドとリリースビルドで異なる出力ディレクトリを使用することができます。
  • コンフィギュレーションごとに実行可能ファイルの出力場所を個別に制御できます。

注意点

  • RUNTIME_OUTPUT_DIRECTORY_CONFIG プロパティは、ターゲットが作成されたときに CMAKE_RUNTIME_OUTPUT_DIRECTORY_<CONFIG> 変数の値で初期化されます。
  • RUNTIME_OUTPUT_DIRECTORY_CONFIG は、マルチコンフィギュレーションジェネレータ(Visual Studio、Xcodeなど)では、指定されたディレクトリにコンフィギュレーションごとのサブディレクトリを追加しません。

以下の例は、RUNTIME_OUTPUT_DIRECTORY_CONFIG プロパティを使用して、my_target ターゲットの実行可能ファイルを Debug コンフィギュレーションでは debug ディレクトリ、Release コンフィギュレーションでは release ディレクトリに出力する方法を示しています。

cmake_minimum_required(VERSION 3.1)

project(my_project)

add_executable(my_target my_target.cpp)

set_target_properties(my_target RUNTIME_OUTPUT_DIRECTORY_CONFIG Debug "${PROJECT_BINARY_DIR}/debug")
set_target_properties(my_target RUNTIME_OUTPUT_DIRECTORY_CONFIG Release "${PROJECT_BINARY_DIR}/release")

この例では、my_target ターゲットが Debug モードでビルドされると、実行可能ファイルは debug ディレクトリに、Release モードでビルドされると release ディレクトリに出力されます。

この解説が、RUNTIME_OUTPUT_DIRECTORY_CONFIG プロパティを理解し、効果的に使用するのに役立てば幸いです。



例1:コンフィギュレーションごとに異なる出力ディレクトリを設定

cmake_minimum_required(VERSION 3.1)

project(my_project)

add_executable(my_target my_target.cpp)

set_target_properties(my_target RUNTIME_OUTPUT_DIRECTORY_CONFIG Debug "${PROJECT_BINARY_DIR}/debug")
set_target_properties(my_target RUNTIME_OUTPUT_DIRECTORY_CONFIG Release "${PROJECT_BINARY_DIR}/release")

例2:環境変数を使用して出力ディレクトリを指定

cmake_minimum_required(VERSION 3.1)

project(my_project)

add_executable(my_target my_target.cpp)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_CONFIG_DEBUG "${CMAKE_BINARY_DIR}/debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_CONFIG_RELEASE "${CMAKE_BINARY_DIR}/release")

set_target_properties(my_target RUNTIME_OUTPUT_DIRECTORY_CONFIG Debug "${CMAKE_RUNTIME_OUTPUT_DIRECTORY_CONFIG_DEBUG}")
set_target_properties(my_target RUNTIME_OUTPUT_DIRECTORY_CONFIG Release "${CMAKE_RUNTIME_OUTPUT_DIRECTORY_CONFIG_RELEASE}")

この例では、CMAKE_RUNTIME_OUTPUT_DIRECTORY_CONFIG_DEBUGCMAKE_RUNTIME_OUTPUT_DIRECTORY_CONFIG_RELEASE 環境変数を使用して、Debug モードと Release モードにおける出力ディレクトリを指定しています。

例3:サブディレクトリを使用した出力

cmake_minimum_required(VERSION 3.1)

project(my_project)

add_executable(my_target my_target.cpp)

set_target_properties(my_target RUNTIME_OUTPUT_DIRECTORY_CONFIG Debug "${PROJECT_BINARY_DIR}/debug/${CMAKE_BUILD_TYPE}")
set_target_properties(my_target RUNTIME_OUTPUT_DIRECTORY_CONFIG Release "${PROJECT_BINARY_DIR}/release/${CMAKE_BUILD_TYPE}")

この例では、CMAKE_BUILD_TYPE 変数を使用して、Debug モードと Release モードにおける出力ディレクトリにサブディレクトリを追加しています。

  • 詳細については、CMake ドキュメントを参照してください。
  • CMAKE_RUNTIME_OUTPUT_DIRECTORY プロパティを使用して、すべてのコンフィギュレーションにおける実行可能ファイル出力ディレクトリを指定することもできます。
  • これらの例は、単なる例であり、実際のプロジェクトでは必要に応じて変更する必要があります。


RUNTIME_OUTPUT_DIRECTORY_CONFIG プロパティは、CMakeのターゲットプロパティの一つであり、特定のコンフィギュレーションにおける実行可能ファイル出力ディレクトリを指定するために使用されます。しかし、状況によっては、別の方法で実行可能ファイルの出力場所を制御したい場合があります。

代替方法

以下に、RUNTIME_OUTPUT_DIRECTORY_CONFIG プロパティの代替となる方法をいくつか紹介します。

CMAKE_RUNTIME_OUTPUT_DIRECTORY プロパティ

CMAKE_RUNTIME_OUTPUT_DIRECTORY プロパティは、すべてのコンフィギュレーションにおける実行可能ファイル出力ディレクトリを指定するために使用されます。これは、すべてのコンフィギュレーションで同じ出力場所を使用したい場合に役立ちます。

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")

この例では、すべてのコンフィギュレーションにおける実行可能ファイル出力ディレクトリは bin ディレクトリになります。

インストールディレクトリ

CMAKE_INSTALL_PRESERVE_DST_DIR オプションを TRUE に設定すると、インストール時に実行可能ファイルが元の出力ディレクトリにコピーされます。これは、インストール後に実行可能ファイルの場所を制御したい場合に役立ちます。

cmake_minimum_required(VERSION 3.1)

project(my_project)

add_executable(my_target my_target.cpp)

set(CMAKE_INSTALL_PRESERVE_DST_DIR TRUE)

この例では、my_target ターゲットがビルドされると、debug ディレクトリ(Debug モードの場合)または release ディレクトリ(Release モードの場合)に実行可能ファイルが出力されます。その後、make install を実行すると、これらの実行可能ファイルは元の出力ディレクトリ(debug または release)にインストールされます。

カスタムターゲット

カスタムターゲットを使用して、実行可能ファイルを任意の場所にコピーすることができます。これは、複雑な出力場所設定が必要な場合に役立ちます。

cmake_minimum_required(VERSION 3.1)

project(my_project)

add_executable(my_target my_target.cpp)

add_custom_target(copy_binaries ALL
    COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" "/usr/local/bin"
)

この例では、my_target ターゲットがビルドされると、実行可能ファイルは debug ディレクトリ(Debug モードの場合)または release ディレクトリ(Release モードの場合)に出力されます。その後、make copy_binaries を実行すると、これらの実行可能ファイルは /usr/local/bin ディレクトリにコピーされます。

サードパーティのツール

CMake以外にも、実行可能ファイルの出力場所を制御するために使用できるサードパーティのツールがあります。例えば、 は、CMake と一緒に使用できるビルドツールであり、カスタム出力場所設定をサポートしています。