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 include() で効率的なビルドを実現

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



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

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


CMakeの"Commands"における"fltk_wrap_ui()"プログラミングを徹底解説!

この解説では、CMakeの"Commands"における"fltk_wrap_ui()"プログラミングについて、分かりやすく説明します。"fltk_wrap_ui()"は、CMakeでFLTK GUIアプリケーションをビルドするために使用されるマクロです。このマクロは、FLTK GUI定義ファイルをC++コードに変換し、プロジェクトに組み込みます。


CMake: find_library()とtarget_link_directories()の連携

target_link_directories()コマンドは、CMakeプロジェクト内のターゲットに対して、リンカがライブラリを検索するディレクトリを指定するために使用されます。これは、ターゲットがリンクするライブラリが標準の検索パスに存在しない場合に特に重要です。


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

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



CMake の if() コマンド: デバッグとトラブルシューティング

構文条件式if() コマンドの引数には、条件式を指定します。条件式は、以下のいずれかの形式で記述できます。変数の比較: <variable> <operator> <value>コマンドの存在チェック: COMMAND <command-name>


CMakeのCMAKE_XCODE_SCHEME_GUARD_MALLOC変数でXcodeのGuard Mallocを徹底解説

CMAKE_XCODE_SCHEME_GUARD_MALLOC は、CMake の "Variables" における変数で、Xcode プロジェクトで生成されるスキームの "Diagnostics" セクションにおける "Guard Malloc" オプションを制御します。


【CMake の Module】CheckOBJCXXSourceRuns の使い方を徹底解説! Objective-C++ プログラムのコンパイル、リンク、実行を検証しよう

CheckOBJCXXSourceRuns は、CMake の Modules における便利な機能で、Objective-C++ ソースコードがコンパイル、リンク、実行可能かどうかを検証します。この機能は、Objective-C++ プログラムの開発において、ソースコードの動作確認やデバッグに役立ちます。


CMakeで.NETプロジェクトをビルドする際のVS_DOTNET_REFERENCES_COPY_LOCALプロパティの役割

VS_DOTNET_REFERENCES_COPY_LOCAL は、CMake で .NET プロジェクトをビルドする際に、参照されているアセンブリを出力ディレクトリにコピーするかどうかを制御するプロパティです。デフォルトでは ON に設定されており、参照されているアセンブリは出力ディレクトリにコピーされます。


CMakeのCTEST_CUSTOM_WARNING_EXCEPTION変数を使って警告メッセージを無視する方法

変数の役割CTEST_CUSTOM_WARNING_EXCEPTIONは、正規表現のリストとして設定されます。テストの実行中に、CTestは各警告メッセージをこのリストと照合します。メッセージがリスト内のいずれかの正規表現に一致した場合、その警告は出力されません。