CMakeでOpenGLアプリケーション開発を行う際の注意点

2024-04-02

CMake ポリシー CMP0072 は、FindOpenGL モジュールが OpenGL ライブラリを選択する際の動作を制御します。このポリシーは CMake 3.11 で導入されました。

背景

従来の OpenGL は、libGL.so などの単一のライブラリで提供されていました。しかし、近年では GLVND (GL Vendor Neutral Dispatch)と呼ばれる新しい仕組みが導入されています。GLVND は、複数の OpenGL ベンダーのライブラリを抽象化し、統一されたインターフェースを提供します。

FindOpenGL モジュールは、以下の条件を満たす場合、GLVND ライブラリを優先的に選択します。

  • CMake バージョンが 3.11 以上である
  • GLVND ライブラリが利用可能である
  • OpenGL_GL_PREFERENCE 変数が設定されていない

CMP0072 ポリシーは、FindOpenGL モジュールの動作を以下の3つのオプションから選択するために使用されます。

  • NEW (デフォルト): GLVND ライブラリを優先的に選択する
  • OLD: 従来の OpenGL ライブラリを優先的に選択する
  • COMPATIBILITY: CMake 3.10 以前の動作に準拠する

設定方法

CMP0072 ポリシーは以下の方法で設定できます。

  • cmake_policy() コマンドを使用する
  • cmake_minimum_required() コマンドを使用する

# CMake 3.11 以降の場合

cmake_policy(CMP0072 NEW)

# 従来の OpenGL ライブラリを使用したい場合

cmake_policy(CMP0072 OLD)

注意事項

  • CMP0072 ポリシーは、CMake 3.11 以降でのみ使用できます。
  • ポリシーを設定していない場合、FindOpenGL モジュールは NEW オプションとして動作し、GLVND ライブラリを優先的に選択します。
  • GLVND ライブラリが利用できない場合、FindOpenGL モジュールは従来の OpenGL ライブラリを選択します。

補足

  • GLVND は、OpenGL のバージョン 3.2 以降でサポートされています。
  • GLVND ライブラリは、多くの Linux ディストリビューションでデフォルトでインストールされています。


CMake ポリシー CMP0072 を使用したサンプルコード

CMake 3.11 以降で GLVND ライブラリを優先的に選択する

cmake_minimum_required(VERSION 3.11)

# デフォルトでは NEW オプションなので、あえて設定する必要はありません
# cmake_policy(CMP0072 NEW)

find_package(OpenGL REQUIRED)

# OpenGL ライブラリの使用例
message(STATUS "OpenGL version: ${OPENGL_VERSION}")

従来の OpenGL ライブラリを使用する

cmake_minimum_required(VERSION 3.11)

cmake_policy(CMP0072 OLD)

find_package(OpenGL REQUIRED)

# OpenGL ライブラリの使用例
message(STATUS "OpenGL version: ${OPENGL_VERSION}")

CMake 3.10 以前の動作に準拠する

cmake_minimum_required(VERSION 3.10)

# CMake 3.10 以前では CMP0072 ポリシーは存在しない

find_package(OpenGL REQUIRED)

# OpenGL ライブラリの使用例
message(STATUS "OpenGL version: ${OPENGL_VERSION}")

GLVND ライブラリの利用可否を確認する

cmake_minimum_required(VERSION 3.11)

if(POLICY CMP0072)
  # CMake 3.11 以降の場合
  if(CMAKE_POLICY_CMP0072_NEW)
    message(STATUS "GLVND ライブラリは利用可能です")
  else()
    message(STATUS "GLVND ライブラリは利用できません")
  endif()
else()
  # CMake 3.10 以前の場合
  message(STATUS "GLVND ライブラリの利用可否は不明です")
endif()

GLVND ライブラリのバージョンを取得する

cmake_minimum_required(VERSION 3.11)

find_package(OpenGL REQUIRED)

if(OPENGL_FOUND)
  if(GLVND_FOUND)
    message(STATUS "GLVND version: ${GLVND_VERSION}")
  else()
    message(STATUS "GLVND ライブラリは利用できません")
  endif()
else()
  message(STATUS "OpenGL ライブラリが見つかりません")
endif()

補足

  • 上記のサンプルコードは、あくまでも参考です。実際のプロジェクトでは、必要に応じて修正してください。


CMake で OpenGL ライブラリを選択する他の方法

OpenGL_LIBRARY 変数を設定する

FindOpenGL モジュールは、OpenGL_LIBRARY 変数が設定されている場合は、そのライブラリを優先的に選択します。

set(OpenGL_LIBRARY /path/to/opengl.so)

find_package(OpenGL REQUIRED)

# OpenGL ライブラリの使用例
message(STATUS "OpenGL version: ${OPENGL_VERSION}")

find_library() コマンドを使用して、OpenGL ライブラリを手動で検索することができます。

find_library(OpenGL NAMES GL GLU)

if(OpenGL_FOUND)
  # OpenGL ライブラリの使用例
  message(STATUS "OpenGL version: ${OPENGL_VERSION}")
else()
  message(STATUS "OpenGL ライブラリが見つかりません")
endif()

外部プロジェクトを使用する

CMake で OpenGL ライブラリを管理するよりも、外部プロジェクト (例: Cinder: https://libcinder.org/) を使用して OpenGL アプリケーション開発を行う方が便利な場合があります。

CMake で OpenGL ライブラリを選択する方法はいくつかあります。プロジェクトの規模や複雑さ、開発環境などを考慮して、最適な方法を選択してください。




CMake で変数を削除する3つの方法:unset() 以外にも使えるテクニック

<variable_name> は、削除したい変数の名前です。変数の名前は、文字、数字、下線(_)で構成され、先頭に数字以外のアクティブ文字が来る必要があります。変数の削除この例では、MY_VAR という変数を作成し、"Hello, world!" という値を設定します。その後、unset() コマンドを使用して MY_VAR を削除します。2番目の message() コマンドは、MY_VAR が削除されたことを確認するために使用されます。



CMakeコマンド mark_as_advanced() の詳細解説

mark_as_advanced() は、CMakeプロジェクトで特定のキャッシュ変数を "詳細設定" としてマークするために使用されるコマンドです。このコマンドによって、GUI ツールでこれらの変数はデフォルトでは表示されなくなり、ユーザーは "詳細設定" オプションを有効にするまで編集できなくなります。


CMake find_file() コマンドの代替方法:もっと柔軟なファイル検索

<variable>: 検索結果を格納する CMake 変数<file_names>: 検索するファイル名のリスト (スペース区切り)<path_list>: 検索するパス名のリスト (スペース区切り)<options>: 検索オプション (後述)


【初心者向け】CMakeでテストを実行する3つのステップ: ctest_test() コマンドから始める

引数:<test_name>: 実行するテストの名前。ワイルドカードを使用して、名前パターンに一致する複数のテストを選択できます。[OPTIONAL arguments]: テストの実行方法を制御するオプション引数。ctest_test()コマンドには、テストの実行方法を細かく制御するための様々なオプション引数が用意されています。以下に、よく使用されるオプション引数をいくつか紹介します。


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

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



回答:CMake は、ポリシー設定スタックを維持します。このスタックには、設定されたすべてのポリシー設定が含まれています。 cmake_policy コマンドを使用して設定されたポリシー設定は、スタックの最上位に追加されます。

CMake のポリシーは、プロジェクトのビルド方法を制御するためのメカニズムです。CMake の新しいバージョンがリリースされると、古いバージョンの CMake との互換性を維持するために、ビルド動作が変更される場合があります。ポリシーを使用すると、プロジェクトが特定のバージョンの CMake でビルドされる場合に、古い動作または新しい動作を選択することができます。


CMake の INTERFACE_SYSTEM_INCLUDE_DIRECTORIES とは?

INTERFACE_SYSTEM_INCLUDE_DIRECTORIES は、CMake のターゲットプロパティの一つであり、他のターゲットがこのターゲットを依存関係として使用する際に、コンパイル時に自動的に追加されるシステムヘッダーディレクトリを指定します。これは、ターゲットが提供するインターフェースの一部として公開されるヘッダーファイルへのパスを指定するために使用されます。


CMake で VS_GLOBAL_variable を使って Visual Studio プロパティを自在に操る

CMake は、マルチプラットフォームな C++ プロジェクトを構築するための強力なツールです。 Visual Studio と連携して使用する場合、"Properties: Targets" セクションで "VS_GLOBAL_variable" を使用することで、プロジェクト設定をさらに細かく制御できます。


CMAKE_XCODE_SCHEME_ZOMBIE_OBJECTSの詳細解説

CMAKE_XCODE_SCHEME_ZOMBIE_OBJECTS は、CMake 3.13 で導入された変数です。これは、Xcode プロジェクトで生成されるスキームの 診断 セクションにおける ゾンビオブジェクト の有効化を制御します。


CMakeでテスト実行中に特定の警告メッセージでテストを失敗させる方法

概要目的: 特定の警告メッセージが出力された場合に、テストを失敗させる使用場面: テスト実行中に特定の警告メッセージが出力されることが想定される場合設定方法: CMakeLists. txtファイルでset()コマンドを使用動作: テスト実行中に標準出力または標準エラー出力に指定された警告メッセージが出力された場合、テストが失敗する