|  | Compiling and Installing | 
|  | ======================== | 
|  |  | 
|  | .. toctree:: | 
|  | :maxdepth: 1 | 
|  | :hidden: | 
|  |  | 
|  | meson | 
|  |  | 
|  | 1. Prerequisites for building | 
|  | ----------------------------- | 
|  |  | 
|  | 1.1 General | 
|  | ~~~~~~~~~~~ | 
|  |  | 
|  | Build system | 
|  | ^^^^^^^^^^^^ | 
|  |  | 
|  | -  `Meson <https://mesonbuild.com>`__ is required when building on \*nix | 
|  | platforms and on Windows. | 
|  | -  Android Build system when building as native Android component. Meson | 
|  | is used when building ARC. | 
|  |  | 
|  | Compiler | 
|  | ^^^^^^^^ | 
|  |  | 
|  | The following compilers are known to work, if you know of others or | 
|  | you're willing to maintain support for other compiler get in touch. | 
|  |  | 
|  | -  GCC 8.0.0 or later (some parts of Mesa may require later versions) | 
|  | -  Clang 5.0 or later (some parts of Mesa may require later versions) | 
|  | -  Microsoft Visual Studio 2019 Version 16.11 or later and | 
|  | Windows SDK of at least 20348 is required, for building on Windows. | 
|  |  | 
|  | Third party/extra tools. | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | -  `Python <https://www.python.org/>`__ - Python 3.5 or newer is required. | 
|  | -  `Python Mako module <http://www.makotemplates.org/>`__ - Python Mako | 
|  | module is required. Version 0.8.0 or later should work. | 
|  | -  Lex / Yacc - for building the Mesa IR and GLSL compiler. | 
|  |  | 
|  | On Linux systems, Flex and Bison versions 2.5.35 and 2.4.1, | 
|  | respectively, (or later) should work. On Windows with MinGW, install | 
|  | Flex and Bison with: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | mingw-get install msys-flex msys-bison | 
|  |  | 
|  | For MSVC on Windows, install `Win | 
|  | flex-bison <http://winflexbison.sourceforge.net/>`__. | 
|  |  | 
|  | .. note:: | 
|  |  | 
|  | Some versions can be buggy (e.g. Flex 2.6.2) so do try others | 
|  | if things fail. | 
|  |  | 
|  | 1.2 Requirements | 
|  | ~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | The requirements depends on the features selected at configure stage. | 
|  | Check/install the respective development package as prompted by the | 
|  | configure error message. | 
|  |  | 
|  | Here are some common ways to retrieve most/all of the dependencies based | 
|  | on the packaging tool used by your distro. | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | zypper source-install --build-deps-only Mesa # openSUSE/SLED/SLES | 
|  | yum-builddep mesa # yum Fedora, OpenSuse(?) | 
|  | dnf builddep mesa # dnf Fedora | 
|  | apt-get build-dep mesa # Debian and derivatives | 
|  | ... # others | 
|  |  | 
|  | 2. Building with meson | 
|  | ---------------------- | 
|  |  | 
|  | **Meson >= 0.46.0 is required** | 
|  |  | 
|  | Meson is the latest build system in mesa, it is currently able to build | 
|  | for \*nix systems like Linux and BSD, macOS, Haiku, and Windows. | 
|  |  | 
|  | The general approach is: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | meson builddir/ | 
|  | ninja -C builddir/ | 
|  | sudo ninja -C builddir/ install | 
|  |  | 
|  | On Windows you can also use the Visual Studio backend | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | meson builddir --backend=vs | 
|  | cd builddir | 
|  | msbuild mesa.sln /m | 
|  |  | 
|  | Please read the :doc:`detailed meson instructions <meson>` for more | 
|  | information | 
|  |  | 
|  | 3. Running against a local build | 
|  | -------------------------------- | 
|  |  | 
|  | It's often necessary or useful when debugging driver issues or testing new | 
|  | branches to run against a local build of Mesa without doing a system-wide | 
|  | install.  To do this, choose a temporary location for the install.  A directory | 
|  | called ``installdir`` inside your mesa tree is as good as anything.  All of the | 
|  | commands below will assume ``$MESA_INSTALLDIR`` is an absolute path to this | 
|  | location. | 
|  |  | 
|  | First, configure Mesa and install in the temporary location: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | meson builddir/ -Dprefix="$MESA_INSTALLDIR" OTHER_OPTIONS | 
|  | ninja -C builddir/ install | 
|  |  | 
|  | where ``OTHER_OPTIONS`` is replaced by any meson configuration options you may | 
|  | want.  For instance, if you want to build the LLVMpipe drivers, it would look | 
|  | like this: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | meson builddir/ -Dprefix="$MESA_INSTALLDIR" \ | 
|  | -Dgallium-drivers=swrast -Dvulkan-drivers=swrast | 
|  | ninja -C builddir/ install | 
|  |  | 
|  | Once Mesa has built and installed to ``$MESA_INSTALLDIR``, you can run any app | 
|  | against your temporary install by setting the right environment variables. | 
|  | Which variable you have to set depends on the API. | 
|  |  | 
|  | OpenGL | 
|  | ~~~~~~ | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | LD_LIBRARY_PATH="$MESA_INSTALLDIR/lib64" glxinfo | 
|  |  | 
|  | You may need to use ``lib`` instead of ``lib64`` on some systems or a full | 
|  | library specifier on debian.  Look inside ``installdir`` for the directory that | 
|  | contains ``libGL.so`` and use that one. | 
|  |  | 
|  | Vulkan | 
|  | ~~~~~~ | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | VK_ICD_FILENAMES="$MESA_INSTALLDIR/share/vulkan/icd/my_icd.json" vulkaninfo | 
|  |  | 
|  | where ``my_icd.json`` is replaced with the actual ICD json file name.  This | 
|  | will depend on your driver.  For instance, the 64-bit Lavapipe driver ICD file | 
|  | is named ``lvp_icd.x86_64.json``. | 
|  |  | 
|  | OpenCL | 
|  | ~~~~~~ | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | OCL_ICD_VENDORS="$MESA_INSTALLDIR/etc/OpenCL/vendors" clinfo | 
|  |  | 
|  | Unlike Vulkan, OpenCL takes a path to the whole ``vendors`` folder and will | 
|  | enumerate any drivers found there. | 
|  |  | 
|  | Troubleshooting local builds | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | If you are trying to run an app against a local build and it's not working, | 
|  | here are a few things to check: | 
|  |  | 
|  | 1. Double-check your paths and try with the simplest app you can.  Before | 
|  | banging your head on a Steam game, make sure your path works with | 
|  | ``glxgears`` first. | 
|  |  | 
|  | 2. Watch out for wrapper scripts.  Some more complex apps such as games have | 
|  | big start-up scripts.  Sometimes those scripts scrub the environment or set | 
|  | ``LD_LIBRARY_PATH`` to something in the game's install directory. | 
|  |  | 
|  | 3. Is your Mesa build the same arch as your app?  Lots of games are still | 
|  | 32-bit and your Mesa build is probably 64-bit by default. | 
|  |  | 
|  | 4. 32 and 64-bit builds in the same local install directory doesn't typically | 
|  | work.  Distributions go to great lengths to make this work in your system | 
|  | install and it's hard to get it right for a local install.  If you've | 
|  | recently built 64-bit and are now building 32-bit, throw away the install | 
|  | directory first to prevent conflicts. | 
|  |  | 
|  | 4. Building with AOSP (Android) | 
|  | ------------------------------- | 
|  |  | 
|  | <TODO> | 
|  |  | 
|  | 5. Library Information | 
|  | ---------------------- | 
|  |  | 
|  | When compilation has finished, look in the top-level ``lib/`` (or | 
|  | ``lib64/``) directory. You'll see a set of library files similar to | 
|  | this: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | lrwxrwxrwx    1 brian    users          10 Mar 26 07:53 libGL.so -> libGL.so.1* | 
|  | lrwxrwxrwx    1 brian    users          19 Mar 26 07:53 libGL.so.1 -> libGL.so.1.5.060100* | 
|  | -rwxr-xr-x    1 brian    users     3375861 Mar 26 07:53 libGL.so.1.5.060100* | 
|  | lrwxrwxrwx    1 brian    users          14 Mar 26 07:53 libOSMesa.so -> libOSMesa.so.6* | 
|  | lrwxrwxrwx    1 brian    users          23 Mar 26 07:53 libOSMesa.so.6 -> libOSMesa.so.6.1.060100* | 
|  | -rwxr-xr-x    1 brian    users       23871 Mar 26 07:53 libOSMesa.so.6.1.060100* | 
|  |  | 
|  | **libGL** is the main OpenGL library (i.e. Mesa), while **libOSMesa** is | 
|  | the OSMesa (Off-Screen) interface library. | 
|  |  | 
|  | If you built the DRI hardware drivers, you'll also see the DRI drivers: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | -rwxr-xr-x   1 brian users 16895413 Jul 21 12:11 i915_dri.so | 
|  | -rwxr-xr-x   1 brian users 16895413 Jul 21 12:11 i965_dri.so | 
|  | -rwxr-xr-x   1 brian users 11849858 Jul 21 12:12 r200_dri.so | 
|  | -rwxr-xr-x   1 brian users 11757388 Jul 21 12:12 radeon_dri.so | 
|  |  | 
|  | If you built with Gallium support, look in lib/gallium/ for | 
|  | Gallium-based versions of libGL and device drivers. | 
|  |  | 
|  | 6. Building OpenGL programs with pkg-config | 
|  | ------------------------------------------- | 
|  |  | 
|  | Running ``ninja install`` will install package configuration files for | 
|  | the pkg-config utility. | 
|  |  | 
|  | When compiling your OpenGL application you can use pkg-config to | 
|  | determine the proper compiler and linker flags. | 
|  |  | 
|  | For example, compiling and linking a GLUT application can be done with: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | gcc `pkg-config --cflags --libs glut` mydemo.c -o mydemo |