新しいCMakeポリシー CMP0141:MSVCデバッグ情報フォーマットの互換性を向上

2024-04-02

CMakeポリシー CMP0141は、CMake 3.25で導入された新しいポリシーで、MSVCデバッグ情報フォーマットの扱いに関する互換性を提供します。

背景

CMake 3.24 以前では、デバッグ情報フォーマットフラグは自動的にデフォルトの CMAKE_<LANG>_FLAGS_<CONFIG> キャッシュエントリに追加されていました。しかし、CMake 3.25 以降では、これらのフラグはデフォルト値から除外され、代わりに抽象化された方法で提供されるようになりました。

CMP0141 の役割

CMP0141ポリシーは、以下の2つの動作を切り替えます。

OLD 動作 (CMake 3.24 以前と同じ)

  • MSVCデバッグ情報フォーマットフラグがデフォルトの CMAKE_<LANG>_FLAGS_<CONFIG> キャッシュエントリに追加されます。
  • CMAKE_MSVC_DEBUG_INFORMATION_FORMAT 変数は無視されます。

NEW 動作 (CMake 3.25 以降のデフォルト)

  • CMAKE_MSVC_DEBUG_INFORMATION_FORMAT 変数を使用して、デバッグ情報フォーマットを選択できます。

設定方法

CMP0141ポリシーは、cmake_policy() コマンドを使用して設定できます。

cmake_policy(CMP0141 NEW)

影響を受けるプロジェクト

以下のプロジェクトは、CMP0141ポリシーの影響を受けます。

  • CMake 3.24 以前で作成されたプロジェクト
  • CMAKE_MSVC_DEBUG_INFORMATION_FORMAT 変数を使用するプロジェクト
  • MSVCデバッグ情報フォーマットフラグを明示的に設定するプロジェクト

互換性の維持

CMP0141ポリシーは、CMake 3.24 以前で作成されたプロジェクトとの互換性を維持するために提供されています。プロジェクトを CMake 3.25 以降に移行する場合は、このポリシーを設定する必要があります。

CMP0141ポリシーの詳細については、以下のリソースを参照してください。

補足

  • CMP0141ポリシーは、MSVCコンパイラのみを対象としています。
  • デバッグ情報フォーマットの詳細については、MSVCドキュメントを参照してください。


CMakeポリシー CMP0141 のサンプルコード

CMake 3.24 以前のプロジェクト

# デバッグ情報フォーマットを "CodeView" に設定
set(CMAKE_C_FLAGS_DEBUG "/Zi")
set(CMAKE_CXX_FLAGS_DEBUG "/Zi")

# プロジェクトのビルド
add_executable(my_project main.c)

CMake 3.25 以降のプロジェクト

# CMake 3.25 以降のデフォルト動作を使用
cmake_policy(CMP0141 NEW)

# デバッグ情報フォーマットを "CodeView" に設定
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "CodeView")

# プロジェクトのビルド
add_executable(my_project main.c)

CMP0141ポリシーの有効化/無効化

# CMP0141ポリシーを有効にする
cmake_policy(CMP0141 OLD)

# デバッグ情報フォーマットを "CodeView" に設定
set(CMAKE_C_FLAGS_DEBUG "/Zi")
set(CMAKE_CXX_FLAGS_DEBUG "/Zi")

# プロジェクトのビルド
add_executable(my_project main.c)


# CMP0141ポリシーを無効にする
cmake_policy(CMP0141 NEW)

# デバッグ情報フォーマットを "CodeView" に設定
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "CodeView")

# プロジェクトのビルド
add_executable(my_project main.c)


CMakeポリシー CMP0141 を設定するその他の方法

CMake GUI

  1. File メニューから Preferences を選択します。
  2. CMake タブを選択します。
  3. Policies セクションで CMP0141 を検索します。
  4. Value ドロップダウンリストから OLD または NEW を選択します。
  5. OK ボタンをクリックして変更を保存します。

CMAKE_MODULE_PATH 変数を使用して、カスタムの CMake モジュールを指定できます。このモジュールは、cmake_policy() コマンドを使用して CMP0141 ポリシーを設定できます。

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "/path/to/custom/modules")

# カスタムモジュールの `SetCMP0141Policy` 関数を呼び出す
include(SetCMP0141Policy)

# プロジェクトのビルド
add_executable(my_project main.c)

環境変数

CMAKE_POLICY_CMP0141 環境変数を使用して、CMP0141 ポリシーを設定できます。

set(CMAKE_POLICY_CMP0141 "OLD")

# プロジェクトのビルド
cmake .

注意: 上記の方法はいずれも、CMake 3.24 以降でのみ使用できます。




CMake find_libraryコマンドとfind_packageモジュールの比較

find_library() コマンドは、CMake で外部ライブラリを見つけるために使用されます。これは、プロジェクトに必要なライブラリを自動的に検出して、ビルドプロセスを簡略化するのに役立ちます。コマンドフォーマット<VAR>: 検索結果を格納する変数名



CMake try_compile() を使って特定のライブラリがインストールされているかどうかを確認する方法

try_compile() は、CMake の強力なコマンドの一つで、コードを実際にコンパイルすることなく、コンパイルが成功するかどうかを確認することができます。これは、特定のコンパイラやオプションがシステム上で使用可能かどうかをテストしたり、コードの移植性を検証したりする際に非常に便利です。


CMakeコマンド「ctest_submit()」でテスト結果をCDashサーバーに送信

ctest_submit()は、CMakeの「Commands」カテゴリに属するコマンドで、テスト結果をCDashなどのダッシュボードサーバーに送信するために使用されます。テスト実行後の結果を可視化、共有したい場合に役立ちます。基本構文オプション解説


CMake include() で効率的なビルドを実現

include() は CMake の重要なコマンドの一つで、他の CMake ファイルやモジュールを読み込むために使用されます。 これにより、コードを分割し、再利用性と保守性を向上させることができます。機能他の CMake ファイルを読み込んで、その中のコマンドを実行する


CMakeのCommandsにおけるuse_mangled_mesa()

use_mangled_mesa() は CMake の Commands における関数で、Mesa ライブラリの mangled シンボル名を解決するために使用されます。Mesa は OpenGL の実装であり、古いバージョンの Mesa ではシンボル名が mangled されるため、use_mangled_mesa() を使用してこれらのシンボル名を解決する必要があります。



Xalan-C++ を CMake プロジェクトで利用する

この解説では、FindXalanC の使い方と、関連するプログラミングについて詳しく説明します。FindXalanC は、以下の情報を提供します。Xalan-C++ のバージョン情報ヘッダーファイルの場所ライブラリの場所必要なコンパイルオプション


HEADER_SET_NAME プロパティ徹底解説:CMakeでヘッダーファイルを賢く管理

"HEADER_SET_NAME" は、CMakeプロジェクトにおけるターゲットプロパティの一つで、ヘッダーファイルのセットに名前を割り当てるために使用されます。これは、ヘッダーファイルのグループをまとめて扱いやすくするために役立ちます。設定方法:


CMakeの変数 CMAKE_COMPILER_IS_GNUCXX について

CMAKE_COMPILER_IS_GNUCXX は、CMake の変数の一つで、C++コンパイラがGNUコンパイラかどうかを判定します。この変数は非推奨であり、代わりに CMAKE_CXX_COMPILER_ID を使用することを推奨します。


CABLE ライブラリと CMake: FindCABLE モジュールでインストール状況を検知する方法

FindCABLE は以下の情報を設定します。CABLE: CABLE 実行ファイルのパスCABLE_TCL_LIBRARY: Tcl ラッパーライブラリのパスCABLE_INCLUDE_DIR: インクルードディレクトリのパスTcl ラッパーをビルドするには、共有ライブラリを追加し、${CABLE_TCL_LIBRARY} にリンクする必要があります。


C++ソースコードの動作検証:CheckCXXSourceRuns vs その他の方法

CheckCXXSourceRuns は、CMake のモジュールの一つで、C++ ソースコードが正しくコンパイルされ、実行できるかどうかを確認するために使用されます。これは、プロジェクトで必要な機能がサポートされているかどうか、または特定のコンパイラオプションが正しく動作するかどうかを検証するのに役立ちます。