1*61046927SAndroid Build Coastguard WorkerCompilation and Installation Using Meson 2*61046927SAndroid Build Coastguard Worker======================================== 3*61046927SAndroid Build Coastguard Worker 4*61046927SAndroid Build Coastguard Worker1. Introduction 5*61046927SAndroid Build Coastguard Worker--------------- 6*61046927SAndroid Build Coastguard Worker 7*61046927SAndroid Build Coastguard WorkerFor general information about Meson see the `Meson 8*61046927SAndroid Build Coastguard Workerwebsite <https://mesonbuild.com/>`__. 9*61046927SAndroid Build Coastguard Worker 10*61046927SAndroid Build Coastguard Worker.. note:: 11*61046927SAndroid Build Coastguard Worker 12*61046927SAndroid Build Coastguard Worker Mesa requires Meson >= 0.60.0 to build. 13*61046927SAndroid Build Coastguard Worker 14*61046927SAndroid Build Coastguard Worker If your distribution doesn't have something recent enough in its 15*61046927SAndroid Build Coastguard Worker repositories, you can `try the methods suggested here 16*61046927SAndroid Build Coastguard Worker <https://mesonbuild.com/Getting-meson.html>`__ to install the 17*61046927SAndroid Build Coastguard Worker current version of Meson. 18*61046927SAndroid Build Coastguard Worker 19*61046927SAndroid Build Coastguard WorkerThe Meson build of Mesa is tested on Linux, macOS, Windows, Cygwin, 20*61046927SAndroid Build Coastguard WorkerHaiku, FreeBSD, DragonflyBSD, NetBSD, and should work on OpenBSD. 21*61046927SAndroid Build Coastguard Worker 22*61046927SAndroid Build Coastguard WorkerUnix-like OSes 23*61046927SAndroid Build Coastguard Worker^^^^^^^^^^^^^^ 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard WorkerIf Meson is not already installed on your system, you can typically 26*61046927SAndroid Build Coastguard Workerinstall it with your package installer. For example: 27*61046927SAndroid Build Coastguard Worker 28*61046927SAndroid Build Coastguard Worker.. code-block:: sh 29*61046927SAndroid Build Coastguard Worker 30*61046927SAndroid Build Coastguard Worker sudo apt-get install meson # Ubuntu 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Workeror 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Worker.. code-block:: sh 35*61046927SAndroid Build Coastguard Worker 36*61046927SAndroid Build Coastguard Worker sudo dnf install meson # Fedora 37*61046927SAndroid Build Coastguard Worker 38*61046927SAndroid Build Coastguard WorkerSome older versions of Meson do not check that they are too old and will 39*61046927SAndroid Build Coastguard Workererror out in odd ways. 40*61046927SAndroid Build Coastguard Worker 41*61046927SAndroid Build Coastguard WorkerYou'll also need `Ninja <https://ninja-build.org/>`__. If it's not 42*61046927SAndroid Build Coastguard Workeralready installed, use apt-get or dnf to install the *ninja-build* 43*61046927SAndroid Build Coastguard Workerpackage. 44*61046927SAndroid Build Coastguard Worker 45*61046927SAndroid Build Coastguard WorkerDependencies 46*61046927SAndroid Build Coastguard Worker++++++++++++ 47*61046927SAndroid Build Coastguard Worker 48*61046927SAndroid Build Coastguard WorkerFollowing are the dependencies you would need to install on linux to build and install mesa main. You can install these packages using your linux distibutions' package manager. 49*61046927SAndroid Build Coastguard Worker 50*61046927SAndroid Build Coastguard Worker.. note:: 51*61046927SAndroid Build Coastguard Worker All these dependencies are for latest linux distros and is tested on ubuntu-24 only for now. 52*61046927SAndroid Build Coastguard Worker 53*61046927SAndroid Build Coastguard Worker Also note, some packages below might not be available in your OS with the exact name, in such case you can search for it and install the distribution specific one. 54*61046927SAndroid Build Coastguard Worker 55*61046927SAndroid Build Coastguard Worker For some packages (eg: libclc etc), you will need the full content of the packages, so make sure to also install ``-dev``/``-devel``/``-headers``/etc. packages (if available) on distributions that split the files into multiple packages. 56*61046927SAndroid Build Coastguard Worker 57*61046927SAndroid Build Coastguard Worker1. glslang-tools 58*61046927SAndroid Build Coastguard Worker2. python3-pyyaml 59*61046927SAndroid Build Coastguard Worker3. python3-mako 60*61046927SAndroid Build Coastguard Worker4. libdrm (This will get libdrm for intel, amd, qualcomm, nvidia, etc. If you are building a specific driver out of these, you can install only that specific libdrm) 61*61046927SAndroid Build Coastguard Worker5. libclc-<version> 62*61046927SAndroid Build Coastguard Worker6. llvm-<version> 63*61046927SAndroid Build Coastguard Worker7. libllvmspirvlib-<version> 64*61046927SAndroid Build Coastguard Worker8. libclang-<version> 65*61046927SAndroid Build Coastguard Worker9. byacc (or) bison 66*61046927SAndroid Build Coastguard Worker10. flex 67*61046927SAndroid Build Coastguard Worker 68*61046927SAndroid Build Coastguard Worker.. note:: 69*61046927SAndroid Build Coastguard Worker You should make sure that all the llvm related packages (libclc, libclc-dev, llvm, libllvmspirvlib, libclang) are of the same version. You can go with the latest version available on your OS if you are not aware of which version to select. 70*61046927SAndroid Build Coastguard Worker 71*61046927SAndroid Build Coastguard Workerwayland specific: 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker1. libwayland 74*61046927SAndroid Build Coastguard Worker2. libwayland-egl-backend 75*61046927SAndroid Build Coastguard Worker 76*61046927SAndroid Build Coastguard Workerx11 specific: 77*61046927SAndroid Build Coastguard Worker 78*61046927SAndroid Build Coastguard Worker1. libx11 79*61046927SAndroid Build Coastguard Worker2. libxext 80*61046927SAndroid Build Coastguard Worker3. libxfixes 81*61046927SAndroid Build Coastguard Worker4. libxcb-glx 82*61046927SAndroid Build Coastguard Worker5. libxcb-shm 83*61046927SAndroid Build Coastguard Worker6. libx11-xcb 84*61046927SAndroid Build Coastguard Worker7. libxcb-dri2 85*61046927SAndroid Build Coastguard Worker8. libxcb-dri3 86*61046927SAndroid Build Coastguard Worker9. libxcb-present 87*61046927SAndroid Build Coastguard Worker10. libxshmfence 88*61046927SAndroid Build Coastguard Worker11. libxxf86vm 89*61046927SAndroid Build Coastguard Worker12. libxrandr 90*61046927SAndroid Build Coastguard Worker 91*61046927SAndroid Build Coastguard Workerfor intel vulkan ray-tracing: 92*61046927SAndroid Build Coastguard Worker 93*61046927SAndroid Build Coastguard Worker1. python3-ply 94*61046927SAndroid Build Coastguard Worker 95*61046927SAndroid Build Coastguard Workerradeon specific: 96*61046927SAndroid Build Coastguard Worker 97*61046927SAndroid Build Coastguard Worker1. libelf 98*61046927SAndroid Build Coastguard Worker 99*61046927SAndroid Build Coastguard Workernouveau/rusticl specific: 100*61046927SAndroid Build Coastguard Worker 101*61046927SAndroid Build Coastguard Worker1. rustc 102*61046927SAndroid Build Coastguard Worker2. rustfmt 103*61046927SAndroid Build Coastguard Worker3. bindgen 104*61046927SAndroid Build Coastguard Worker4. cbindgen 105*61046927SAndroid Build Coastguard Worker 106*61046927SAndroid Build Coastguard WorkerWindows 107*61046927SAndroid Build Coastguard Worker^^^^^^^ 108*61046927SAndroid Build Coastguard Worker 109*61046927SAndroid Build Coastguard WorkerYou will need to install Python 3 and Meson as a module using pip. This 110*61046927SAndroid Build Coastguard Workeris because we use Python for generating code, and rely on external 111*61046927SAndroid Build Coastguard Workermodules (Mako). You also need pkg-config (a hard dependency of Meson), 112*61046927SAndroid Build Coastguard WorkerFlex, and Bison. The easiest way to install everything you need is with 113*61046927SAndroid Build Coastguard Worker`Chocolatey <https://chocolatey.org/>`__. 114*61046927SAndroid Build Coastguard Worker 115*61046927SAndroid Build Coastguard Worker.. code-block:: sh 116*61046927SAndroid Build Coastguard Worker 117*61046927SAndroid Build Coastguard Worker choco install python3 winflexbison pkgconfiglite 118*61046927SAndroid Build Coastguard Worker 119*61046927SAndroid Build Coastguard WorkerYou can even use Chocolatey to install MinGW and Ninja (Ninja can be 120*61046927SAndroid Build Coastguard Workerused with MSVC as well) 121*61046927SAndroid Build Coastguard Worker 122*61046927SAndroid Build Coastguard Worker.. code-block:: sh 123*61046927SAndroid Build Coastguard Worker 124*61046927SAndroid Build Coastguard Worker choco install ninja mingw 125*61046927SAndroid Build Coastguard Worker 126*61046927SAndroid Build Coastguard WorkerThen install Meson using pip 127*61046927SAndroid Build Coastguard Worker 128*61046927SAndroid Build Coastguard Worker.. code-block:: sh 129*61046927SAndroid Build Coastguard Worker 130*61046927SAndroid Build Coastguard Worker py -3 -m pip install meson packaging mako 131*61046927SAndroid Build Coastguard Worker 132*61046927SAndroid Build Coastguard WorkerYou may need to add the Python 3 scripts directory to your path for 133*61046927SAndroid Build Coastguard WorkerMeson. 134*61046927SAndroid Build Coastguard Worker 135*61046927SAndroid Build Coastguard Worker2. Basic Usage 136*61046927SAndroid Build Coastguard Worker-------------- 137*61046927SAndroid Build Coastguard Worker 138*61046927SAndroid Build Coastguard WorkerThe Meson program is used to configure the source directory and 139*61046927SAndroid Build Coastguard Workergenerates either a Ninja build file or Visual Studio® build files. The 140*61046927SAndroid Build Coastguard Workerlatter must be enabled via the ``--backend`` switch, as Ninja is the 141*61046927SAndroid Build Coastguard Workerdefault backend on all operating systems. 142*61046927SAndroid Build Coastguard Worker 143*61046927SAndroid Build Coastguard WorkerMeson only supports out-of-tree builds, and must be passed a directory 144*61046927SAndroid Build Coastguard Workerto put built and generated sources into. We'll call that directory 145*61046927SAndroid Build Coastguard Worker"build" here. It's recommended to create a `separate build 146*61046927SAndroid Build Coastguard Workerdirectory <https://mesonbuild.com/Using-multiple-build-directories.html>`__ 147*61046927SAndroid Build Coastguard Workerfor each configuration you might want to use. 148*61046927SAndroid Build Coastguard Worker 149*61046927SAndroid Build Coastguard WorkerBasic configuration is done with: 150*61046927SAndroid Build Coastguard Worker 151*61046927SAndroid Build Coastguard Worker.. code-block:: sh 152*61046927SAndroid Build Coastguard Worker 153*61046927SAndroid Build Coastguard Worker meson setup build/ 154*61046927SAndroid Build Coastguard Worker 155*61046927SAndroid Build Coastguard WorkerThis will create the build directory. If any dependencies are missing, 156*61046927SAndroid Build Coastguard Workeryou can install them, or try to remove the dependency with a Meson 157*61046927SAndroid Build Coastguard Workerconfiguration option (see below). Meson will print a summary of the 158*61046927SAndroid Build Coastguard Workerbuild options at the end. 159*61046927SAndroid Build Coastguard Worker 160*61046927SAndroid Build Coastguard WorkerTo review the options which Meson chose, run: 161*61046927SAndroid Build Coastguard Worker 162*61046927SAndroid Build Coastguard Worker.. code-block:: sh 163*61046927SAndroid Build Coastguard Worker 164*61046927SAndroid Build Coastguard Worker meson configure build/ 165*61046927SAndroid Build Coastguard Worker 166*61046927SAndroid Build Coastguard WorkerRecent version of Meson can print the available options and their 167*61046927SAndroid Build Coastguard Workerdefault values by running ``meson configure`` in the source directory. 168*61046927SAndroid Build Coastguard WorkerIf your Meson version is too old, you can always look in the 169*61046927SAndroid Build Coastguard Worker`meson_options.txt <https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/meson_options.txt>`__ 170*61046927SAndroid Build Coastguard Workerfile at the root of the project. 171*61046927SAndroid Build Coastguard Worker 172*61046927SAndroid Build Coastguard WorkerWith additional arguments ``meson configure`` can be used to change 173*61046927SAndroid Build Coastguard Workeroptions for a previously configured build directory. All options passed 174*61046927SAndroid Build Coastguard Workerto this command are in the form ``-D "option"="value"``. For example: 175*61046927SAndroid Build Coastguard Worker 176*61046927SAndroid Build Coastguard Worker.. code-block:: sh 177*61046927SAndroid Build Coastguard Worker 178*61046927SAndroid Build Coastguard Worker meson configure build/ -Dprefix=/tmp/install -Dglx=true 179*61046927SAndroid Build Coastguard Worker 180*61046927SAndroid Build Coastguard WorkerNote that options taking lists (such as ``platforms``) are `a bit more 181*61046927SAndroid Build Coastguard Workercomplicated <https://mesonbuild.com/Build-options.html#using-build-options>`__, 182*61046927SAndroid Build Coastguard Workerbut the simplest form compatible with Mesa options is to use a comma to 183*61046927SAndroid Build Coastguard Workerseparate values (``-D platforms=drm,wayland``) and brackets to represent 184*61046927SAndroid Build Coastguard Workeran empty list (``-D platforms=[]``). 185*61046927SAndroid Build Coastguard Worker 186*61046927SAndroid Build Coastguard WorkerOnce you've run the initial ``meson`` command successfully you can use 187*61046927SAndroid Build Coastguard Workeryour configured backend to build the project in your build directory: 188*61046927SAndroid Build Coastguard Worker 189*61046927SAndroid Build Coastguard Worker.. code-block:: sh 190*61046927SAndroid Build Coastguard Worker 191*61046927SAndroid Build Coastguard Worker ninja -C build/ 192*61046927SAndroid Build Coastguard Worker 193*61046927SAndroid Build Coastguard WorkerThe next step is to install the Mesa libraries, drivers, etc. This also 194*61046927SAndroid Build Coastguard Workerfinishes up some final steps of the build process (such as creating 195*61046927SAndroid Build Coastguard Workersymbolic links for drivers). To install: 196*61046927SAndroid Build Coastguard Worker 197*61046927SAndroid Build Coastguard Worker.. code-block:: sh 198*61046927SAndroid Build Coastguard Worker 199*61046927SAndroid Build Coastguard Worker ninja -C build/ install 200*61046927SAndroid Build Coastguard Worker 201*61046927SAndroid Build Coastguard WorkerAfter installation, you can check if the installation happened properly or not by running the command: 202*61046927SAndroid Build Coastguard Worker 203*61046927SAndroid Build Coastguard Worker.. code-block:: sh 204*61046927SAndroid Build Coastguard Worker 205*61046927SAndroid Build Coastguard Worker glxinfo | grep OpenGL 206*61046927SAndroid Build Coastguard Worker 207*61046927SAndroid Build Coastguard WorkerIf the installation succeeded, you should see the Mesa devel version and also the commit hash of the latest commit. 208*61046927SAndroid Build Coastguard Worker 209*61046927SAndroid Build Coastguard WorkerIn case you don't see the devel version, you can run 210*61046927SAndroid Build Coastguard Worker 211*61046927SAndroid Build Coastguard Worker.. code-block:: sh 212*61046927SAndroid Build Coastguard Worker 213*61046927SAndroid Build Coastguard Worker sudo ldconfig 214*61046927SAndroid Build Coastguard Worker 215*61046927SAndroid Build Coastguard WorkerWindows specific instructions 216*61046927SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 217*61046927SAndroid Build Coastguard Worker 218*61046927SAndroid Build Coastguard WorkerOn Windows you have a couple of choices for compilers. If you installed 219*61046927SAndroid Build Coastguard WorkerMinGW with Chocolatey and want to use Ninja you should be able to open 220*61046927SAndroid Build Coastguard Workerany shell and follow the instructions above. If you want to you MSVC, 221*61046927SAndroid Build Coastguard Workerclang-cl, or ICL (the Intel Compiler), read on. 222*61046927SAndroid Build Coastguard Worker 223*61046927SAndroid Build Coastguard WorkerBoth ICL and MSVC come with shell environments, the easiest way to use 224*61046927SAndroid Build Coastguard WorkerMeson with these it to open a shell. For clang-cl you will need to open 225*61046927SAndroid Build Coastguard Workeran MSVC shell, and then override the compilers, either using a `native 226*61046927SAndroid Build Coastguard Workerfile <https://mesonbuild.com/Native-environments.html>`__, or with the 227*61046927SAndroid Build Coastguard WorkerCC and CXX environment variables. 228*61046927SAndroid Build Coastguard Worker 229*61046927SAndroid Build Coastguard WorkerAll of these compilers are tested and work with Ninja, but if you want 230*61046927SAndroid Build Coastguard WorkerVisual Studio integration or you just like msbuild, passing 231*61046927SAndroid Build Coastguard Worker``--backend=vs`` to Meson will generate a Visual Studio solution. 232*61046927SAndroid Build Coastguard Worker 233*61046927SAndroid Build Coastguard Worker3. Advanced Usage 234*61046927SAndroid Build Coastguard Worker----------------- 235*61046927SAndroid Build Coastguard Worker 236*61046927SAndroid Build Coastguard WorkerInstallation Location 237*61046927SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^^^^ 238*61046927SAndroid Build Coastguard Worker 239*61046927SAndroid Build Coastguard WorkerMeson default to installing :file:`libGL.so` in your system's main 240*61046927SAndroid Build Coastguard Worker:file:`lib/` directory and DRI drivers to a :file:`dri/` subdirectory. 241*61046927SAndroid Build Coastguard Worker 242*61046927SAndroid Build Coastguard WorkerDevelopers will often want to install Mesa to a testing directory rather 243*61046927SAndroid Build Coastguard Workerthan the system library directory. This can be done with the --prefix 244*61046927SAndroid Build Coastguard Workeroption. For example: 245*61046927SAndroid Build Coastguard Worker 246*61046927SAndroid Build Coastguard Worker.. code-block:: sh 247*61046927SAndroid Build Coastguard Worker 248*61046927SAndroid Build Coastguard Worker meson --prefix="${PWD}/build/install" build/ 249*61046927SAndroid Build Coastguard Worker 250*61046927SAndroid Build Coastguard Workerwill put the final libraries and drivers into the build/install/ 251*61046927SAndroid Build Coastguard Workerdirectory. Then you can set LD_LIBRARY_PATH to that location to run/test 252*61046927SAndroid Build Coastguard Workerthe driver. 253*61046927SAndroid Build Coastguard Worker 254*61046927SAndroid Build Coastguard WorkerMeson also honors ``DESTDIR`` for installs. 255*61046927SAndroid Build Coastguard Worker 256*61046927SAndroid Build Coastguard WorkerCompiler Options 257*61046927SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^ 258*61046927SAndroid Build Coastguard Worker 259*61046927SAndroid Build Coastguard WorkerMeson supports the common CFLAGS, CXXFLAGS, etc. environment variables 260*61046927SAndroid Build Coastguard Workerbut their use is discouraged because of the many caveats in using them. 261*61046927SAndroid Build Coastguard Worker 262*61046927SAndroid Build Coastguard WorkerInstead, it is recommended to use ``-D${lang}_args`` and 263*61046927SAndroid Build Coastguard Worker``-D${lang}_link_args``. Among the benefits of these options is that 264*61046927SAndroid Build Coastguard Workerthey are guaranteed to persist across rebuilds and reconfigurations. 265*61046927SAndroid Build Coastguard Worker 266*61046927SAndroid Build Coastguard WorkerThis example sets -fmax-errors for compiling C sources and -DMAGIC=123 267*61046927SAndroid Build Coastguard Workerfor C++ sources: 268*61046927SAndroid Build Coastguard Worker 269*61046927SAndroid Build Coastguard Worker.. code-block:: sh 270*61046927SAndroid Build Coastguard Worker 271*61046927SAndroid Build Coastguard Worker meson setup builddir/ -Dc_args=-fmax-errors=10 -Dcpp_args=-DMAGIC=123 272*61046927SAndroid Build Coastguard Worker 273*61046927SAndroid Build Coastguard WorkerCompiler Specification 274*61046927SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^^^^^ 275*61046927SAndroid Build Coastguard Worker 276*61046927SAndroid Build Coastguard WorkerMeson supports the standard CC and CXX environment variables for 277*61046927SAndroid Build Coastguard Workerchanging the default compiler. Note that Meson does not allow changing 278*61046927SAndroid Build Coastguard Workerthe compilers in a configured build directory so you will need to create 279*61046927SAndroid Build Coastguard Workera new build dir for a different compiler. 280*61046927SAndroid Build Coastguard Worker 281*61046927SAndroid Build Coastguard WorkerThis is an example of specifying the Clang compilers and cleaning the 282*61046927SAndroid Build Coastguard Workerbuild directory before reconfiguring with an extra C option: 283*61046927SAndroid Build Coastguard Worker 284*61046927SAndroid Build Coastguard Worker.. code-block:: sh 285*61046927SAndroid Build Coastguard Worker 286*61046927SAndroid Build Coastguard Worker CC=clang CXX=clang++ meson setup build-clang 287*61046927SAndroid Build Coastguard Worker ninja -C build-clang 288*61046927SAndroid Build Coastguard Worker ninja -C build-clang clean 289*61046927SAndroid Build Coastguard Worker meson configure build -Dc_args="-Wno-typedef-redefinition" 290*61046927SAndroid Build Coastguard Worker ninja -C build-clang 291*61046927SAndroid Build Coastguard Worker 292*61046927SAndroid Build Coastguard WorkerThe default compilers depends on your operating system. Meson supports 293*61046927SAndroid Build Coastguard Workermost of the popular compilers, a complete list is available 294*61046927SAndroid Build Coastguard Worker`here <https://mesonbuild.com/Reference-tables.html#compiler-ids>`__. 295*61046927SAndroid Build Coastguard Worker 296*61046927SAndroid Build Coastguard WorkerLLVM 297*61046927SAndroid Build Coastguard Worker^^^^ 298*61046927SAndroid Build Coastguard Worker 299*61046927SAndroid Build Coastguard WorkerMeson includes upstream logic to wrap llvm-config using its standard 300*61046927SAndroid Build Coastguard Workerdependency interface. 301*61046927SAndroid Build Coastguard Worker 302*61046927SAndroid Build Coastguard WorkerMeson can use CMake to find LLVM. But due to the way LLVM implements its 303*61046927SAndroid Build Coastguard WorkerCMake finder it will only find static libraries, it will never find 304*61046927SAndroid Build Coastguard Worker:file:`libllvm.so`. There is also a ``-Dcmake_module_path`` option, 305*61046927SAndroid Build Coastguard Workerwhich points to the root of an alternative installation (the prefix). 306*61046927SAndroid Build Coastguard WorkerFor example: 307*61046927SAndroid Build Coastguard Worker 308*61046927SAndroid Build Coastguard Worker.. code-block:: sh 309*61046927SAndroid Build Coastguard Worker 310*61046927SAndroid Build Coastguard Worker meson setup builddir -Dcmake_module_path=/home/user/mycmake/prefix 311*61046927SAndroid Build Coastguard Worker 312*61046927SAndroid Build Coastguard WorkerAs of Meson 0.49.0 Meson also has the concept of a `"native 313*61046927SAndroid Build Coastguard Workerfile" <https://mesonbuild.com/Native-environments.html>`__, these files 314*61046927SAndroid Build Coastguard Workerprovide information about the native build environment (as opposed to a 315*61046927SAndroid Build Coastguard Workercross build environment). They are INI formatted and can override where 316*61046927SAndroid Build Coastguard Workerto find llvm-config: 317*61046927SAndroid Build Coastguard Worker 318*61046927SAndroid Build Coastguard Worker.. code-block:: ini 319*61046927SAndroid Build Coastguard Worker :caption: custom-llvm.ini 320*61046927SAndroid Build Coastguard Worker 321*61046927SAndroid Build Coastguard Worker [binaries] 322*61046927SAndroid Build Coastguard Worker llvm-config = '/usr/local/bin/llvm/llvm-config' 323*61046927SAndroid Build Coastguard Worker 324*61046927SAndroid Build Coastguard WorkerThen configure Meson: 325*61046927SAndroid Build Coastguard Worker 326*61046927SAndroid Build Coastguard Worker.. code-block:: sh 327*61046927SAndroid Build Coastguard Worker 328*61046927SAndroid Build Coastguard Worker meson setup builddir/ --native-file custom-llvm.ini 329*61046927SAndroid Build Coastguard Worker 330*61046927SAndroid Build Coastguard WorkerFor selecting llvm-config for cross compiling a `"cross 331*61046927SAndroid Build Coastguard Workerfile" <https://mesonbuild.com/Cross-compilation.html#defining-the-environment>`__ 332*61046927SAndroid Build Coastguard Workershould be used. It uses the same format as the native file above: 333*61046927SAndroid Build Coastguard Worker 334*61046927SAndroid Build Coastguard Worker.. code-block:: ini 335*61046927SAndroid Build Coastguard Worker :caption: cross-llvm.ini 336*61046927SAndroid Build Coastguard Worker 337*61046927SAndroid Build Coastguard Worker [binaries] 338*61046927SAndroid Build Coastguard Worker ... 339*61046927SAndroid Build Coastguard Worker llvm-config = '/usr/lib/llvm-config-32' 340*61046927SAndroid Build Coastguard Worker cmake = '/usr/bin/cmake-for-my-arch' 341*61046927SAndroid Build Coastguard Worker 342*61046927SAndroid Build Coastguard WorkerObviously, only CMake or llvm-config is required. 343*61046927SAndroid Build Coastguard Worker 344*61046927SAndroid Build Coastguard WorkerThen configure Meson: 345*61046927SAndroid Build Coastguard Worker 346*61046927SAndroid Build Coastguard Worker.. code-block:: sh 347*61046927SAndroid Build Coastguard Worker 348*61046927SAndroid Build Coastguard Worker meson setup builddir/ --cross-file cross-llvm.ini 349*61046927SAndroid Build Coastguard Worker 350*61046927SAndroid Build Coastguard WorkerSee the :ref:`Cross Compilation <cross-compilation>` section for more 351*61046927SAndroid Build Coastguard Workerinformation. 352*61046927SAndroid Build Coastguard Worker 353*61046927SAndroid Build Coastguard WorkerOn Windows (and in other cases), using llvm-config or CMake may be 354*61046927SAndroid Build Coastguard Workereither undesirable or impossible. Meson's solution for this is a 355*61046927SAndroid Build Coastguard Worker`wrap <https://mesonbuild.com/Wrap-dependency-system-manual.html>`__, in 356*61046927SAndroid Build Coastguard Workerthis case a "binary wrap". Follow the steps below: 357*61046927SAndroid Build Coastguard Worker 358*61046927SAndroid Build Coastguard Worker- Install the binaries and headers into the 359*61046927SAndroid Build Coastguard Worker ``$mesa_src/subprojects/llvm`` 360*61046927SAndroid Build Coastguard Worker- Add a :file:`meson.build` file to that directory (more on that later) 361*61046927SAndroid Build Coastguard Worker 362*61046927SAndroid Build Coastguard WorkerThe wrap file must define the following: 363*61046927SAndroid Build Coastguard Worker 364*61046927SAndroid Build Coastguard Worker- ``dep_llvm``: a ``declare_dependency()`` object with 365*61046927SAndroid Build Coastguard Worker include_directories, dependencies, and version set) 366*61046927SAndroid Build Coastguard Worker 367*61046927SAndroid Build Coastguard WorkerIt may also define: 368*61046927SAndroid Build Coastguard Worker 369*61046927SAndroid Build Coastguard Worker- ``irbuilder_h``: a ``files()`` object pointing to llvm/IR/IRBuilder.h 370*61046927SAndroid Build Coastguard Worker- ``has_rtti``: a ``bool`` that declares whether LLVM was built with 371*61046927SAndroid Build Coastguard Worker RTTI. Defaults to true 372*61046927SAndroid Build Coastguard Worker 373*61046927SAndroid Build Coastguard Workersuch a :file:`meson.build` file might look like: 374*61046927SAndroid Build Coastguard Worker 375*61046927SAndroid Build Coastguard Worker:: 376*61046927SAndroid Build Coastguard Worker 377*61046927SAndroid Build Coastguard Worker project('llvm', ['cpp']) 378*61046927SAndroid Build Coastguard Worker 379*61046927SAndroid Build Coastguard Worker cpp = meson.get_compiler('cpp') 380*61046927SAndroid Build Coastguard Worker 381*61046927SAndroid Build Coastguard Worker _deps = [] 382*61046927SAndroid Build Coastguard Worker _search = join_paths(meson.current_source_dir(), 'lib') 383*61046927SAndroid Build Coastguard Worker foreach d : ['libLLVMCodeGen', 'libLLVMScalarOpts', 'libLLVMAnalysis', 384*61046927SAndroid Build Coastguard Worker 'libLLVMTransformUtils', 'libLLVMCore', 'libLLVMX86CodeGen', 385*61046927SAndroid Build Coastguard Worker 'libLLVMSelectionDAG', 'libLLVMipo', 'libLLVMAsmPrinter', 386*61046927SAndroid Build Coastguard Worker 'libLLVMInstCombine', 'libLLVMInstrumentation', 'libLLVMMC', 387*61046927SAndroid Build Coastguard Worker 'libLLVMGlobalISel', 'libLLVMObjectYAML', 'libLLVMDebugInfoPDB', 388*61046927SAndroid Build Coastguard Worker 'libLLVMVectorize', 'libLLVMPasses', 'libLLVMSupport', 389*61046927SAndroid Build Coastguard Worker 'libLLVMLTO', 'libLLVMObject', 'libLLVMDebugInfoCodeView', 390*61046927SAndroid Build Coastguard Worker 'libLLVMDebugInfoDWARF', 'libLLVMOrcJIT', 'libLLVMProfileData', 391*61046927SAndroid Build Coastguard Worker 'libLLVMObjCARCOpts', 'libLLVMBitReader', 'libLLVMCoroutines', 392*61046927SAndroid Build Coastguard Worker 'libLLVMBitWriter', 'libLLVMRuntimeDyld', 'libLLVMMIRParser', 393*61046927SAndroid Build Coastguard Worker 'libLLVMX86Desc', 'libLLVMAsmParser', 'libLLVMTableGen', 394*61046927SAndroid Build Coastguard Worker 'libLLVMFuzzMutate', 'libLLVMLinker', 'libLLVMMCParser', 395*61046927SAndroid Build Coastguard Worker 'libLLVMExecutionEngine', 'libLLVMCoverage', 'libLLVMInterpreter', 396*61046927SAndroid Build Coastguard Worker 'libLLVMTarget', 'libLLVMX86AsmParser', 'libLLVMSymbolize', 397*61046927SAndroid Build Coastguard Worker 'libLLVMDebugInfoMSF', 'libLLVMMCJIT', 'libLLVMXRay', 398*61046927SAndroid Build Coastguard Worker 'libLLVMX86AsmPrinter', 'libLLVMX86Disassembler', 399*61046927SAndroid Build Coastguard Worker 'libLLVMMCDisassembler', 'libLLVMOption', 'libLLVMIRReader', 400*61046927SAndroid Build Coastguard Worker 'libLLVMLibDriver', 'libLLVMDlltoolDriver', 'libLLVMDemangle', 401*61046927SAndroid Build Coastguard Worker 'libLLVMBinaryFormat', 'libLLVMLineEditor', 402*61046927SAndroid Build Coastguard Worker 'libLLVMWindowsManifest', 'libLLVMX86Info', 'libLLVMX86Utils'] 403*61046927SAndroid Build Coastguard Worker _deps += cpp.find_library(d, dirs : _search) 404*61046927SAndroid Build Coastguard Worker endforeach 405*61046927SAndroid Build Coastguard Worker 406*61046927SAndroid Build Coastguard Worker dep_llvm = declare_dependency( 407*61046927SAndroid Build Coastguard Worker include_directories : include_directories('include'), 408*61046927SAndroid Build Coastguard Worker dependencies : _deps, 409*61046927SAndroid Build Coastguard Worker version : '6.0.0', 410*61046927SAndroid Build Coastguard Worker ) 411*61046927SAndroid Build Coastguard Worker 412*61046927SAndroid Build Coastguard Worker has_rtti = false 413*61046927SAndroid Build Coastguard Worker irbuilder_h = files('include/llvm/IR/IRBuilder.h') 414*61046927SAndroid Build Coastguard Worker 415*61046927SAndroid Build Coastguard WorkerIt is very important that version is defined and is accurate, if it is 416*61046927SAndroid Build Coastguard Workernot, workarounds for the wrong version of LLVM might be used resulting 417*61046927SAndroid Build Coastguard Workerin build failures. 418*61046927SAndroid Build Coastguard Worker 419*61046927SAndroid Build Coastguard Worker``PKG_CONFIG_PATH`` 420*61046927SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^^ 421*61046927SAndroid Build Coastguard Worker 422*61046927SAndroid Build Coastguard WorkerThe ``pkg-config`` utility is a hard requirement for configuring and 423*61046927SAndroid Build Coastguard Workerbuilding Mesa on Unix-like systems. It is used to search for external 424*61046927SAndroid Build Coastguard Workerlibraries on the system. This environment variable is used to control 425*61046927SAndroid Build Coastguard Workerthe search path for ``pkg-config``. For instance, setting 426*61046927SAndroid Build Coastguard Worker``PKG_CONFIG_PATH=/usr/X11R6/lib/pkgconfig`` will search for package 427*61046927SAndroid Build Coastguard Workermetadata in ``/usr/X11R6`` before the standard directories. 428*61046927SAndroid Build Coastguard Worker 429*61046927SAndroid Build Coastguard WorkerOptions 430*61046927SAndroid Build Coastguard Worker^^^^^^^ 431*61046927SAndroid Build Coastguard Worker 432*61046927SAndroid Build Coastguard WorkerOne of the oddities of Meson is that some options are different when 433*61046927SAndroid Build Coastguard Workerpassed to :program:`meson` than to ``meson configure``. These options are 434*61046927SAndroid Build Coastguard Workerpassed as --option=foo to :program:`meson`, but -Doption=foo to 435*61046927SAndroid Build Coastguard Worker``meson configure``. Mesa defined options are always passed as 436*61046927SAndroid Build Coastguard Worker-Doption=foo. 437*61046927SAndroid Build Coastguard Worker 438*61046927SAndroid Build Coastguard WorkerFor those coming from Autotools be aware of the following: 439*61046927SAndroid Build Coastguard Worker 440*61046927SAndroid Build Coastguard Worker``--buildtype/-Dbuildtype`` 441*61046927SAndroid Build Coastguard Worker This option will set the compiler debug/optimization levels to aid 442*61046927SAndroid Build Coastguard Worker debugging the Mesa libraries. 443*61046927SAndroid Build Coastguard Worker 444*61046927SAndroid Build Coastguard Worker Note that in Meson this defaults to ``debugoptimized``, and not 445*61046927SAndroid Build Coastguard Worker setting it to ``release`` will yield non-optimal performance and 446*61046927SAndroid Build Coastguard Worker binary size. Not using ``debug`` may interfere with debugging as some 447*61046927SAndroid Build Coastguard Worker code and validation will be optimized away. 448*61046927SAndroid Build Coastguard Worker 449*61046927SAndroid Build Coastguard Worker For those wishing to pass their own optimization flags, use the 450*61046927SAndroid Build Coastguard Worker ``plain`` buildtype, which causes Meson to inject no additional 451*61046927SAndroid Build Coastguard Worker compiler arguments, only those in the C/CXXFLAGS and those that mesa 452*61046927SAndroid Build Coastguard Worker itself defines. 453*61046927SAndroid Build Coastguard Worker 454*61046927SAndroid Build Coastguard Worker``-Db_ndebug`` 455*61046927SAndroid Build Coastguard Worker This option controls assertions in Meson projects. When set to 456*61046927SAndroid Build Coastguard Worker ``false`` (the default) assertions are enabled, when set to true they 457*61046927SAndroid Build Coastguard Worker are disabled. This is unrelated to the ``buildtype``; setting the 458*61046927SAndroid Build Coastguard Worker latter to ``release`` will not turn off assertions. 459*61046927SAndroid Build Coastguard Worker 460*61046927SAndroid Build Coastguard Worker.. _cross-compilation: 461*61046927SAndroid Build Coastguard Worker 462*61046927SAndroid Build Coastguard Worker4. Cross-compilation and 32-bit builds 463*61046927SAndroid Build Coastguard Worker-------------------------------------- 464*61046927SAndroid Build Coastguard Worker 465*61046927SAndroid Build Coastguard Worker`Meson supports 466*61046927SAndroid Build Coastguard Workercross-compilation <https://mesonbuild.com/Cross-compilation.html>`__ by 467*61046927SAndroid Build Coastguard Workerspecifying a number of binary paths and settings in a file and passing 468*61046927SAndroid Build Coastguard Workerthis file to ``meson`` or ``meson configure`` with the ``--cross-file`` 469*61046927SAndroid Build Coastguard Workerparameter. 470*61046927SAndroid Build Coastguard Worker 471*61046927SAndroid Build Coastguard WorkerThis file can live at any location, but you can use the bare filename 472*61046927SAndroid Build Coastguard Worker(without the folder path) if you put it in 473*61046927SAndroid Build Coastguard Worker:file:`$XDG_DATA_HOME/meson/cross` or :file:`~/.local/share/meson/cross` 474*61046927SAndroid Build Coastguard Worker 475*61046927SAndroid Build Coastguard WorkerBelow are a few example of cross files, but keep in mind that you will 476*61046927SAndroid Build Coastguard Workerlikely have to alter them for your system. 477*61046927SAndroid Build Coastguard Worker 478*61046927SAndroid Build Coastguard WorkerThose running on Arch Linux can use the AUR-maintained packages for some 479*61046927SAndroid Build Coastguard Workerof those, as they'll have the right values for your system: 480*61046927SAndroid Build Coastguard Worker 481*61046927SAndroid Build Coastguard Worker- `meson-cross-x86-linux-gnu <https://aur.archlinux.org/packages/meson-cross-x86-linux-gnu>`__ 482*61046927SAndroid Build Coastguard Worker- `meson-cross-aarch64-linux-gnu <https://github.com/dcbaker/archlinux-meson-cross-aarch64-linux-gnu>`__ 483*61046927SAndroid Build Coastguard Worker 484*61046927SAndroid Build Coastguard Worker32-bit build on x86 linux: 485*61046927SAndroid Build Coastguard Worker 486*61046927SAndroid Build Coastguard Worker.. code-block:: ini 487*61046927SAndroid Build Coastguard Worker 488*61046927SAndroid Build Coastguard Worker [binaries] 489*61046927SAndroid Build Coastguard Worker c = '/usr/bin/gcc' 490*61046927SAndroid Build Coastguard Worker cpp = '/usr/bin/g++' 491*61046927SAndroid Build Coastguard Worker ar = '/usr/bin/gcc-ar' 492*61046927SAndroid Build Coastguard Worker strip = '/usr/bin/strip' 493*61046927SAndroid Build Coastguard Worker pkg-config = '/usr/bin/pkg-config-32' 494*61046927SAndroid Build Coastguard Worker llvm-config = '/usr/bin/llvm-config32' 495*61046927SAndroid Build Coastguard Worker 496*61046927SAndroid Build Coastguard Worker [properties] 497*61046927SAndroid Build Coastguard Worker c_args = ['-m32'] 498*61046927SAndroid Build Coastguard Worker c_link_args = ['-m32'] 499*61046927SAndroid Build Coastguard Worker cpp_args = ['-m32'] 500*61046927SAndroid Build Coastguard Worker cpp_link_args = ['-m32'] 501*61046927SAndroid Build Coastguard Worker 502*61046927SAndroid Build Coastguard Worker [host_machine] 503*61046927SAndroid Build Coastguard Worker system = 'linux' 504*61046927SAndroid Build Coastguard Worker cpu_family = 'x86' 505*61046927SAndroid Build Coastguard Worker cpu = 'i686' 506*61046927SAndroid Build Coastguard Worker endian = 'little' 507*61046927SAndroid Build Coastguard Worker 508*61046927SAndroid Build Coastguard Worker64-bit build on ARM linux: 509*61046927SAndroid Build Coastguard Worker 510*61046927SAndroid Build Coastguard Worker.. code-block:: ini 511*61046927SAndroid Build Coastguard Worker 512*61046927SAndroid Build Coastguard Worker [binaries] 513*61046927SAndroid Build Coastguard Worker c = '/usr/bin/aarch64-linux-gnu-gcc' 514*61046927SAndroid Build Coastguard Worker cpp = '/usr/bin/aarch64-linux-gnu-g++' 515*61046927SAndroid Build Coastguard Worker ar = '/usr/bin/aarch64-linux-gnu-gcc-ar' 516*61046927SAndroid Build Coastguard Worker strip = '/usr/bin/aarch64-linux-gnu-strip' 517*61046927SAndroid Build Coastguard Worker pkg-config = '/usr/bin/aarch64-linux-gnu-pkg-config' 518*61046927SAndroid Build Coastguard Worker exe_wrapper = '/usr/bin/qemu-aarch64-static' 519*61046927SAndroid Build Coastguard Worker 520*61046927SAndroid Build Coastguard Worker [host_machine] 521*61046927SAndroid Build Coastguard Worker system = 'linux' 522*61046927SAndroid Build Coastguard Worker cpu_family = 'aarch64' 523*61046927SAndroid Build Coastguard Worker cpu = 'aarch64' 524*61046927SAndroid Build Coastguard Worker endian = 'little' 525*61046927SAndroid Build Coastguard Worker 526*61046927SAndroid Build Coastguard Worker64-bit build on x86 Windows: 527*61046927SAndroid Build Coastguard Worker 528*61046927SAndroid Build Coastguard Worker.. code-block:: ini 529*61046927SAndroid Build Coastguard Worker 530*61046927SAndroid Build Coastguard Worker [binaries] 531*61046927SAndroid Build Coastguard Worker c = '/usr/bin/x86_64-w64-mingw32-gcc' 532*61046927SAndroid Build Coastguard Worker cpp = '/usr/bin/x86_64-w64-mingw32-g++' 533*61046927SAndroid Build Coastguard Worker ar = '/usr/bin/x86_64-w64-mingw32-ar' 534*61046927SAndroid Build Coastguard Worker strip = '/usr/bin/x86_64-w64-mingw32-strip' 535*61046927SAndroid Build Coastguard Worker pkg-config = '/usr/bin/x86_64-w64-mingw32-pkg-config' 536*61046927SAndroid Build Coastguard Worker exe_wrapper = 'wine' 537*61046927SAndroid Build Coastguard Worker 538*61046927SAndroid Build Coastguard Worker [host_machine] 539*61046927SAndroid Build Coastguard Worker system = 'windows' 540*61046927SAndroid Build Coastguard Worker cpu_family = 'x86_64' 541*61046927SAndroid Build Coastguard Worker cpu = 'i686' 542*61046927SAndroid Build Coastguard Worker endian = 'little' 543