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)

説明

このコードは以下のことを行います。

  1. myproject という名前のプロジェクトを作成します。
  2. ソースファイル、インクルードディレクトリ、および実行可能ファイルとライブラリのターゲットを定義します。
  3. Debug コンフィギュレーションでは、実行可能ファイル myprogramdebug ディレクトリに、ライブラリ mylibrarydebug/lib ディレクトリに出力されるように設定します。
  4. Release コンフィギュレーションでは、実行可能ファイル myprogramrelease ディレクトリに、ライブラリ mylibraryrelease/lib ディレクトリに出力されるように設定します。
  5. 実行可能ファイルとライブラリを bin ディレクトリにインストールします。
  • インストールコマンドを使用して、ビルドされたライブラリを適切な場所に配置する方法を示しています。
  • コンフィギュレーションごとに異なるサブディレクトリ構造を作成する方法を示しています。
  • 複数のターゲットに対して LIBRARY_OUTPUT_DIRECTORY_CONFIG プロパティを設定する方法を示しています。
  • install コマンドは、CMake の基本的なインストール機能を示しています。より複雑なインストール要件については、CMake のドキュメントを参照してください。


代替方法

  1. CMAKE_RUNTIME_OUTPUT_DIRECTORYCMAKE_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")
    
  2. CMAKE_INSTALL_PRESERVE_DST の使用:

    この変数は、インストール時に既存のファイルが上書きされないように制御します。デフォルトでは、CMAKE_INSTALL_PRESERVE_DSTFALSE に設定されており、既存のファイルは上書きされます。これを TRUE に設定すると、既存のファイルは保持され、新しいファイルは別名でインストールされます。

    set(CMAKE_INSTALL_PRESERVE_DST TRUE)
    install(TARGETS ${TARGET_NAME} DESTINATION bin)
    
  3. カスタムロジックの実装:

    より複雑な要件の場合は、カスタムロジックを実装して出力ディレクトリを決定することができます。これは、CMAKE_POST_PROCESS_TARGET コマンドを使用して、ターゲット処理後に実行されるカスタムスクリプトを定義することで行うことができます。

それぞれの方法の利点と欠点

方法利点欠点
CMAKE_RUNTIME_OUTPUT_DIRECTORY & CMAKE_ARCHIVE_OUTPUT_DIRECTORYシンプルで使いやすい複雑な要件には不向き
CMAKE_INSTALL_PRESERVE_DST既存のファイルを保持できる意図しない動作を引き起こす可能性がある
カスタムロジック柔軟性が高い複雑でメンテナンスが難しい

最適な方法の選択

最適な方法は、プロジェクトの要件によって異なります。単純なケースでは、CMAKE_RUNTIME_OUTPUT_DIRECTORYCMAKE_ARCHIVE_OUTPUT_DIRECTORY の使用が十分な場合があります。より複雑な要件の場合は、CMAKE_INSTALL_PRESERVE_DST またはカスタムロジックを検討する必要があります。