CMakeでライブラリ出力ディレクトリをコンフィギュレーションごとに制御する:LIBRARY_OUTPUT_DIRECTORY_CONFIG徹底解説
CMake の "Properties: Targets" に関連する "LIBRARY_OUTPUT_DIRECTORY_CONFIG" プロパティは、特定のライブラリターゲットに対して、コンフィギュレーションごとに異なる出力ディレクトリを設定するために使用されます。これは、デバッグビルドとリリースビルドで異なる出力ディレクトリが必要な場合などに役立ちます。
構文
set_target_properties(target_name LIBRARY_OUTPUT_DIRECTORY_CONFIG "<CONFIG>" "<DIR>")
説明
<DIR>
: ライブラリファイルの出力ディレクトリ<CONFIG>
: 設定対象のコンフィギュレーションの名前 (例: "Debug", "Release")target_name
: 設定対象のライブラリターゲットの名前
例
set(MY_LIBRARY_NAME mylibrary)
add_library(${MY_LIBRARY_NAME} src/mylibrary.c)
set_target_properties(${MY_LIBRARY_NAME} LIBRARY_OUTPUT_DIRECTORY_CONFIG "Debug" "${CMAKE_CURRENT_BINARY_DIR}/debug")
set_target_properties(${MY_LIBRARY_NAME} LIBRARY_OUTPUT_DIRECTORY_CONFIG "Release" "${CMAKE_CURRENT_BINARY_DIR}/release")
この例では、mylibrary
という名前のライブラリターゲットが作成され、src/mylibrary.c
ファイルからビルドされます。さらに、Debug
コンフィギュレーションではライブラリファイルが debug
ディレクトリに、Release
コンフィギュレーションでは release
ディレクトリに出力されるように設定されています。
LIBRARY_OUTPUT_DIRECTORY
プロパティと併用することができます。LIBRARY_OUTPUT_DIRECTORY
プロパティはデフォルトの出力ディレクトリを指定し、LIBRARY_OUTPUT_DIRECTORY_CONFIG
プロパティはコンフィギュレーションごとに異なる出力ディレクトリを指定します。LIBRARY_OUTPUT_DIRECTORY_CONFIG
プロパティは、マルチコンフィギュレーションジェネレータ (Visual Studio、Xcode など) では、指定されたディレクトリにコンフィギュレーションごとのサブディレクトリを追加しません。
- 条件分岐を使用して、コンフィギュレーションに応じて異なる出力ディレクトリを設定することができます。
- 複数のライブラリターゲットに対して
LIBRARY_OUTPUT_DIRECTORY_CONFIG
プロパティを設定する場合は、ループを使用してコードを簡潔にすることができます。
cmake_minimum_required(VERSION 3.10)
project(myproject)
set(MY_SOURCES src/main.cpp src/mylibrary.c)
set(MY_INCLUDE_DIR include)
add_executable(myprogram ${MY_SOURCES})
target_link_directories(myprogram ${MY_INCLUDE_DIR})
set_target_properties(myprogram LIBRARY_OUTPUT_DIRECTORY_CONFIG "Debug" "${CMAKE_CURRENT_BINARY_DIR}/debug")
set_target_properties(myprogram LIBRARY_OUTPUT_DIRECTORY_CONFIG "Release" "${CMAKE_CURRENT_BINARY_DIR}/release")
add_library(mylibrary src/mylibrary.c)
target_include_directories(mylibrary ${MY_INCLUDE_DIR})
set_target_properties(mylibrary LIBRARY_OUTPUT_DIRECTORY_CONFIG "Debug" "${CMAKE_CURRENT_BINARY_DIR}/debug/lib")
set_target_properties(mylibrary LIBRARY_OUTPUT_DIRECTORY_CONFIG "Release" "${CMAKE_CURRENT_BINARY_DIR}/release/lib")
install(TARGETS myprogram mylibrary DESTINATION bin)
説明
このコードは以下のことを行います。
myproject
という名前のプロジェクトを作成します。- ソースファイル、インクルードディレクトリ、および実行可能ファイルとライブラリのターゲットを定義します。
Debug
コンフィギュレーションでは、実行可能ファイルmyprogram
はdebug
ディレクトリに、ライブラリmylibrary
はdebug/lib
ディレクトリに出力されるように設定します。Release
コンフィギュレーションでは、実行可能ファイルmyprogram
はrelease
ディレクトリに、ライブラリmylibrary
はrelease/lib
ディレクトリに出力されるように設定します。- 実行可能ファイルとライブラリを
bin
ディレクトリにインストールします。
- インストールコマンドを使用して、ビルドされたライブラリを適切な場所に配置する方法を示しています。
- コンフィギュレーションごとに異なるサブディレクトリ構造を作成する方法を示しています。
- 複数のターゲットに対して
LIBRARY_OUTPUT_DIRECTORY_CONFIG
プロパティを設定する方法を示しています。
install
コマンドは、CMake の基本的なインストール機能を示しています。より複雑なインストール要件については、CMake のドキュメントを参照してください。
代替方法
CMAKE_RUNTIME_OUTPUT_DIRECTORY
とCMAKE_ARCHIVE_OUTPUT_DIRECTORY
の使用:これらのプロパティは、それぞれ実行可能ファイルとライブラリのデフォルト出力ディレクトリを設定します。コンフィギュレーションごとに異なる出力ディレクトリが必要な場合は、
set_property
コマンドを使用してこれらのプロパティをターゲットごとに設定できます。set_property(TARGET ${TARGET_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/debug") set_property(TARGET ${TARGET_NAME} PROPERTY ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/release")
CMAKE_INSTALL_PRESERVE_DST
の使用:この変数は、インストール時に既存のファイルが上書きされないように制御します。デフォルトでは、
CMAKE_INSTALL_PRESERVE_DST
はFALSE
に設定されており、既存のファイルは上書きされます。これをTRUE
に設定すると、既存のファイルは保持され、新しいファイルは別名でインストールされます。set(CMAKE_INSTALL_PRESERVE_DST TRUE) install(TARGETS ${TARGET_NAME} DESTINATION bin)
カスタムロジックの実装:
より複雑な要件の場合は、カスタムロジックを実装して出力ディレクトリを決定することができます。これは、
CMAKE_POST_PROCESS_TARGET
コマンドを使用して、ターゲット処理後に実行されるカスタムスクリプトを定義することで行うことができます。
それぞれの方法の利点と欠点
方法 | 利点 | 欠点 |
---|---|---|
CMAKE_RUNTIME_OUTPUT_DIRECTORY & CMAKE_ARCHIVE_OUTPUT_DIRECTORY | シンプルで使いやすい | 複雑な要件には不向き |
CMAKE_INSTALL_PRESERVE_DST | 既存のファイルを保持できる | 意図しない動作を引き起こす可能性がある |
カスタムロジック | 柔軟性が高い | 複雑でメンテナンスが難しい |
最適な方法の選択
最適な方法は、プロジェクトの要件によって異なります。単純なケースでは、CMAKE_RUNTIME_OUTPUT_DIRECTORY
と CMAKE_ARCHIVE_OUTPUT_DIRECTORY
の使用が十分な場合があります。より複雑な要件の場合は、CMAKE_INSTALL_PRESERVE_DST
またはカスタムロジックを検討する必要があります。