【保存版】CMakeポリシー「CMP0141」:MSVCデバッグ情報フォーマット設定の決定版


CMakeポリシー「CMP0141」は、Visual Studio Compiler (MSVC) におけるデバッグ情報フォーマットの選択方法を制御します。このポリシーは、CMake 3.25 で導入されました。

旧動作と新動作

CMake 3.24 以前では、CMake はデフォルトで CMAKE_<LANG>_FLAGS_<CONFIG> 缓存条目 に MSVC デバッグ情報フォーマットフラグを追加していました。しかし、CMake 3.25 以降では、この動作は変更され、これらのフラグは抽象化レイヤーを使用して選択されるようになりました。

この変更により、プロジェクト開発者は、CMakeLists.txt ファイルでデバッグ情報フォーマットをより細かく制御できるようになりました。

ポリシー設定

このポリシーは、cmake_policy() コマンドを使用して明示的に設定できます。

cmake_policy(CMP0141 OLD)

このコマンドを実行すると、CMake は古い動作に戻ります。

cmake_policy(CMP0141 NEW)

このコマンドを実行すると、CMake は新しい動作を使用します。

デフォルト設定

CMake_POLICY_DEFAULT_CMP0141 変数を使用して、このポリシーのデフォルト設定を指定することもできます。

set(CMake_POLICY_DEFAULT_CMP0141 NEW)

このコマンドを実行すると、CMake はすべてのプロジェクトで新しい動作を使用します。

互換性

CMake 3.25 以前のプロジェクトでは、このポリシーが設定されていなくても古い動作が使用されます。これは、古いプロジェクトが新しい動作にまだ対応していない可能性があるためです。

影響を受けるプロパティ

このポリシーは、次のプロパティに影響を与えます。

  • CMAKE_RC_FLAGS_<CONFIG>
  • CMAKE_CXX_FLAGS_<CONFIG>
  • CMAKE_C_FLAGS_<CONFIG>

このポリシーの詳細については、CMake のドキュメントを参照してください。

次の例では、CMP0141 ポリシーを NEW に設定し、すべてのプロジェクトで新しい動作を使用するようにします。

cmake_minimum_required(VERSION 3.25)

project(myproject)

cmake_policy(CMP0141 NEW)

add_executable(mytarget mycode.c)


cmake_minimum_required(VERSION 3.24)

project(myproject)

cmake_policy(CMP0141 OLD)

add_executable(mytarget mycode.c)

例2:新しい動作を使用する

この例では、CMP0141 ポリシーを NEW に設定し、新しい動作を使用するようにします。

cmake_minimum_required(VERSION 3.25)

project(myproject)

cmake_policy(CMP0141 NEW)

add_executable(mytarget mycode.c)

例3:デフォルト設定を変更する

この例では、CMake_POLICY_DEFAULT_CMP0141 変数を使用して、すべてのプロジェクトで新しい動作を使用するようにデフォルト設定を変更します。

cmake_minimum_required(VERSION 3.25)

project(myproject)

set(CMake_POLICY_DEFAULT_CMP0141 NEW)

add_executable(mytarget mycode.c)
  • 古い動作を使用する場合は、プロジェクトが新しい動作にまだ対応していない可能性があることに注意してください。
  • これらの例は、CMake 3.25 以降でのみ使用できます。


しかしながら、CMP0141ポリシーは、いくつかの制限があります。

  • デバッグ情報フォーマットを細かく制御できない
  • 古いプロジェクトとの互換性が制限される

これらの制限を克服するために、いくつかの代替方法が提案されています。

代替方法

  1. CMakeLists.txt ファイルで CMAKE_<LANG>_FLAGS_<CONFIG> 変数を直接設定する

この方法は、最も単純な方法ですが、プロジェクトごとに設定する必要があるため、煩雑になる可能性があります。

set(CMAKE_C_FLAGS_DEBUG "/DEBUG:pdb")
set(CMAKE_CXX_FLAGS_DEBUG "/DEBUG:pdb")
  1. ターゲットプロパティを使用してデバッグ情報フォーマットを設定する

この方法は、CMakeLists.txt ファイルで設定を集中管理できるため、より柔軟性があります。

target_properties(mytarget PROPERTIES COMPILE_PDB_FILE ON)
  1. カスタムターゲットを使用してデバッグ情報フォーマットを設定する

この方法は、最も複雑な方法ですが、最も柔軟性があります。

add_custom_command(TARGET mytarget
                   COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS_DEBUG} /Fo${OUTDIR}/mytarget.obj /c mycode.c)
add_custom_command(TARGET mytarget
                   COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_DEBUG} /Fo${OUTDIR}/mytarget.obj /c mycode.cpp)

推奨方法

プロジェクトの規模や複雑さに応じて、適切な代替方法を選択する必要があります。

  • 既存のプロジェクトを CMake に移行する場合は、方法1を使用する必要があります。
  • 中規模から大規模なプロジェクトの場合は、方法2または方法3がおすすめです。
  • 小規模なプロジェクトの場合は、方法1が最も簡単です。