# 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.

New in version 3.10: GLVND support on Linux. See the Linux-specific section below.

## Optional COMPONENTS

New 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`

  New in version 3.27.

  A subset of OpenGL API for embedded systems with limited capabilities.

`GLES3`

  New in version 3.27.

  A subset of OpenGL API for embedded systems with more capabilities.

## IMPORTED Targets

New 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).

New 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`

  New in version 3.27.

  Defined if the system has GLES2.

`OpenGL::GLES3`

  New 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_DIRS` variable 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`

  New in version 3.29.

  Paths to the OpenGL include directories.

New 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`

  New in version 3.27.

  Path to the OpenGL GLES2 library.

`OPENGL_gles3_LIBRARY`

  New in version 3.27.

  Path to the OpenGL GLES3 library.

`OPENGL_GLU_INCLUDE_DIR`

  New in version 3.29.

  Path to the OpenGL GLU include directory.

New 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_LIBRARY` to be empty.

  Changed in version 3.11: This is the default, unless policy `CMP0072` is set to `OLD` and 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`.