FindOpenGL¶
FindModule for OpenGL and OpenGL Utility Library (GLU).
Changed in version 3.2: X11 is no longer added as a dependency on Unix/Linux systems.
Added in version 3.10: GLVND support on Linux. See the Linux-specific section below.
Optional COMPONENTS¶
Added in version 3.10.
This module respects several optional COMPONENTS:
- EGL
- The EGL interface between OpenGL, OpenGL ES and the underlying windowing system. 
- GLX
- An extension to X that interfaces OpenGL, OpenGL ES with X window system. 
- OpenGL
- The cross platform API for 3D graphics. 
- GLES2
- Added in version 3.27. - A subset of OpenGL API for embedded systems with limited capabilities. 
- GLES3
- Added in version 3.27. - A subset of OpenGL API for embedded systems with more capabilities. 
IMPORTED Targets¶
Added in version 3.8.
This module defines the IMPORTED targets:
- OpenGL::GL
- Defined to the platform-specific OpenGL libraries if the system has OpenGL. 
- OpenGL::GLU
- Defined if the system has OpenGL Utility Library (GLU). 
Added in version 3.10: Additionally, the following GLVND-specific library targets are defined:
- OpenGL::OpenGL
- Defined to libOpenGL if the system is GLVND-based. 
- OpenGL::GLX
- Defined if the system has OpenGL Extension to the X Window System (GLX). 
- OpenGL::EGL
- Defined if the system has EGL. 
- OpenGL::GLES2
- Added in version 3.27. - Defined if the system has GLES2. 
- OpenGL::GLES3
- Added in version 3.27. - Defined if the system has GLES3. 
Result Variables¶
This module sets the following variables:
- OPENGL_FOUND
- True, if the system has OpenGL and all components are found. 
- OPENGL_XMESA_FOUND
- True, if the system has XMESA. 
- OPENGL_GLU_FOUND
- True, if the system has GLU. 
- OpenGL_OpenGL_FOUND
- True, if the system has an OpenGL library. 
- OpenGL_GLX_FOUND
- True, if the system has GLX. 
- OpenGL_EGL_FOUND
- True, if the system has EGL. 
- OpenGL::GLES2
- Defined if the system has GLES2. 
- OpenGL::GLES3
- Defined if the system has GLES3. 
- OPENGL_INCLUDE_DIR
- Path to the OpenGL include directory. The - OPENGL_INCLUDE_DIRSvariable is preferred.
- OPENGL_EGL_INCLUDE_DIRS
- Path to the EGL include directory. 
- OPENGL_LIBRARIES
- Paths to the OpenGL library, windowing system libraries, and GLU libraries. On Linux, this assumes GLX and is never correct for EGL-based targets. Clients are encouraged to use the - OpenGL::*import targets instead.
- OPENGL_INCLUDE_DIRS
- Added in version 3.29. - Paths to the OpenGL include directories. 
Added in version 3.10: Variables for GLVND-specific libraries OpenGL, EGL and GLX.
Cache variables¶
The following cache variables may also be set:
- OPENGL_egl_LIBRARY
- Path to the EGL library. 
- OPENGL_glu_LIBRARY
- Path to the GLU library. 
- OPENGL_glx_LIBRARY
- Path to the GLVND 'GLX' library. 
- OPENGL_opengl_LIBRARY
- Path to the GLVND 'OpenGL' library 
- OPENGL_gl_LIBRARY
- Path to the OpenGL library. New code should prefer the - OpenGL::*import targets.
- OPENGL_gles2_LIBRARY
- Added in version 3.27. - Path to the OpenGL GLES2 library. 
- OPENGL_gles3_LIBRARY
- Added in version 3.27. - Path to the OpenGL GLES3 library. 
- OPENGL_GLU_INCLUDE_DIR
- Added in version 3.29. - Path to the OpenGL GLU include directory. 
Added in version 3.10: Variables for GLVND-specific libraries OpenGL, EGL and GLX.
Linux-specific¶
Some Linux systems utilize GLVND as a new ABI for OpenGL.  GLVND separates
context libraries from OpenGL itself; OpenGL lives in "libOpenGL", and
contexts are defined in "libGLX" or "libEGL".  GLVND is currently the only way
to get OpenGL 3+ functionality via EGL in a manner portable across vendors.
Projects may use GLVND explicitly with target OpenGL::OpenGL and either
OpenGL::GLX or OpenGL::EGL.
Projects may use the OpenGL::GL target (or OPENGL_LIBRARIES variable)
to use legacy GL interfaces.  These will use the legacy GL library located
by OPENGL_gl_LIBRARY, if available.  If OPENGL_gl_LIBRARY is empty or
not found and GLVND is available, the OpenGL::GL target will use GLVND
OpenGL::OpenGL and OpenGL::GLX (and the OPENGL_LIBRARIES
variable will use the corresponding libraries).  Thus, for non-EGL-based
Linux targets, the OpenGL::GL target is most portable.
A OpenGL_GL_PREFERENCE variable may be set to specify the preferred way
to provide legacy GL interfaces in case multiple choices are available.
The value may be one of:
- GLVND
- If the GLVND OpenGL and GLX libraries are available, prefer them. This forces - OPENGL_gl_LIBRARYto be empty.- Changed in version 3.11: This is the default, unless policy - CMP0072is set to- OLDand no components are requested (since components correspond to GLVND libraries).
- LEGACY
- Prefer to use the legacy libGL library, if available. 
For EGL targets the client must rely on GLVND support on the user's system.
Linking should use the OpenGL::OpenGL OpenGL::EGL targets.  Using GLES*
libraries is theoretically possible in place of OpenGL::OpenGL, but this
module does not currently support that; contributions welcome.
OPENGL_egl_LIBRARY and OPENGL_EGL_INCLUDE_DIRS are defined in the case of
GLVND.  For non-GLVND Linux and other systems these are left undefined.
macOS-Specific¶
On macOS this module defaults to using the macOS-native framework version of OpenGL. To use the X11 version of OpenGL on macOS, one can disable searching of frameworks. For example:
find_package(X11)
if(APPLE AND X11_FOUND)
  set(CMAKE_FIND_FRAMEWORK NEVER)
  find_package(OpenGL)
  unset(CMAKE_FIND_FRAMEWORK)
else()
  find_package(OpenGL)
endif()
An end user building this project may need to point CMake at their
X11 installation, e.g., with -DOpenGL_ROOT=/opt/X11.
