CMakeの「Properties: Targets」カテゴリを理解する:COMPILE_PDB_OUTPUT_DIRECTORY_CONFIG編
"COMPILE_PDB_OUTPUT_DIRECTORY_CONFIG" プロパティは、CMake の "Properties: Targets" カテゴリに属し、Visual Studio などのマルチコンフィギュレーションジェネレータでビルドされるプロジェクトにおいて、コンパイル時に生成される MS デバッグシンボルファイル (.pdb) の出力ディレクトリを個々のコンフィギュレーションごとに設定するために使用されます。
バージョン
このプロパティは CMake 3.1 以降で導入されました。
構文
COMPILE_PDB_OUTPUT_DIRECTORY_CONFIG <CONFIG> <DIRECTORY>
引数
<DIRECTORY>
: .pdb ファイルを出力するディレクトリパスを指定します。<CONFIG>
: 対象となるコンフィギュレーションの名前を指定します。
例
set(CMAKE_BUILD_TYPE Debug)
target_compile_features(mytarget PRIVATE debug)
target_compile_pdb_output_directory_config(mytarget Debug "${CMAKE_CURRENT_BINARY_DIR}/pdb")
この例では、"Debug" コンフィギュレーションでビルドされる "mytarget" ターゲットに対して、.pdb ファイルを出力するディレクトリを "${CMAKE_CURRENT_BINARY_DIR}/pdb" に設定しています。
- .pdb ファイルは、Visual Studio などのデバッガで使用されるデバッグ情報ファイルです。
- マルチコンフィギュレーションジェネレータを使用しない場合は、"COMPILE_PDB_OUTPUT_DIRECTORY" プロパティを使用する方が一般的です。
- "COMPILE_PDB_OUTPUT_DIRECTORY" プロパティと異なり、"COMPILE_PDB_OUTPUT_DIRECTORY_CONFIG" プロパティは個々のコンフィギュレーションごとに設定できます。
"COMPILE_PDB_OUTPUT_DIRECTORY_CONFIG" プロパティは、特定のコンフィギュレーションでのみ .pdb ファイルを出力したい場合や、出力ディレクトリをコンフィギュレーションごとに異なる場所に設定したい場合に役立ちます。
set(CMAKE_BUILD_TYPE Debug)
target_compile_features(mytarget PRIVATE debug)
target_compile_pdb_output_directory_config(mytarget Debug "${CMAKE_CURRENT_BINARY_DIR}/Debug/pdb")
target_compile_pdb_output_directory_config(mytarget Release "${CMAKE_CURRENT_BINARY_DIR}/Release/pdb")
例 2: サブディレクトリ構造を用いた出力ディレクトリの指定
この例では、プロジェクトのルートディレクトリの下に "pdb" サブディレクトリを作成し、その中にコンフィギュレーションごとの .pdb ファイルを出力するように設定します。
set(CMAKE_BUILD_TYPE Debug)
target_compile_features(mytarget PRIVATE debug)
target_compile_pdb_output_directory_config(mytarget ALL "${CMAKE_CURRENT_BINARY_DIR}/pdb")
例 3: 環境変数を使用した出力ディレクトリの指定
この例では、"PDB_OUTPUT_DIR" 環境変数の値を使用して .pdb ファイルの出力ディレクトリを設定します。
set(CMAKE_BUILD_TYPE Debug)
target_compile_features(mytarget PRIVATE debug)
if (DEFINED ENV{PDB_OUTPUT_DIR})
target_compile_pdb_output_directory_config(mytarget ALL "${ENV{PDB_OUTPUT_DIR}}")
else()
message(WARNING "PDB_OUTPUT_DIR environment variable is not defined. Defaulting to project root directory.")
target_compile_pdb_output_directory_config(mytarget ALL "${CMAKE_CURRENT_BINARY_DIR}")
endif()
しかし、状況によっては "COMPILE_PDB_OUTPUT_DIRECTORY_CONFIG" プロパティを使用するのが適切でない場合もあります。そのような場合、以下の代替方法を検討することができます。
"COMPILE_PDB_OUTPUT_DIRECTORY" プロパティを使用する
"COMPILE_PDB_OUTPUT_DIRECTORY" プロパティは、すべてのコンフィギュレーションに対して .pdb ファイルの出力ディレクトリをグローバルに設定するために使用されます。 "COMPILE_PDB_OUTPUT_DIRECTORY_CONFIG" プロパティよりもシンプルで汎用性が高いですが、個々のコンフィギュレーションごとの出力ディレクトリ設定には対応していません。
set(CMAKE_BUILD_TYPE Debug)
target_compile_features(mytarget PRIVATE debug)
set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pdb")
カスタムターゲットを使用する
カスタムターゲットを使用して、.pdb ファイルの生成と出力ディレクトリへの配置を個別に制御することができます。この方法は柔軟性が高く、複雑な出力ディレクトリ構造にも対応できますが、設定が複雑になるというデメリットがあります。
set(CMAKE_BUILD_TYPE Debug)
target_compile_features(mytarget PRIVATE debug)
add_custom_target(mytarget_pdb
COMMAND ${CMAKE_PDB_GENERATE} $<TARGET_SOURCES:mytarget>
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pdb"
DEPENDS mytarget
)
外部スクリプトを使用する
外部スクリプト (Bash や Python など) を使用して、.pdb ファイルの生成と出力ディレクトリへの配置を制御することができます。この方法は高度なカスタマイズが可能ですが、CMake のビルドシステムとの統合が難しくなるというデメリットがあります。
#!/bin/bash
set -e
for config in Debug Release; do
mkdir -p "build/$config/pdb"
cmake --build "build/$config" --target mytarget --config $config --pdb-gen
done
ビルドツールチェーンの機能を使用する
Visual Studio などのビルドツールチェーンによっては、.pdb ファイルの出力ディレクトリを個別に設定するための機能が提供されている場合があります。そのような機能を利用することで、CMake の設定を簡略化することができます。
最適な方法の選択
上記の代替方法のうち、最適な方法はプロジェクトの要件と開発環境によって異なります。
- ビルドツールチェーンの機能が利用可能な場合は、その機能を活用します。
- 高度なカスタマイズが必要な場合は、外部スクリプトを使用します。
- 個々のコンフィギュレーションごとの出力ディレクトリ設定が必要な場合は、"COMPILE_PDB_OUTPUT_DIRECTORY_CONFIG" プロパティまたはカスタムターゲットを使用します。
- シンプルで汎用性が高い方法が必要な場合は、"COMPILE_PDB_OUTPUT_DIRECTORY" プロパティを使用するのがおすすめです。
- それぞれの方法の長所と短所を理解した上で、プロジェクトに合った方法を選択することが重要です。
- 上記の代替方法はあくまでも一例であり、他にも様々な方法が存在する可能性があります。