【保存版】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_DEBUG
と CMAKE_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 と一緒に使用できるビルドツールであり、カスタム出力場所設定をサポートしています。