xref: /aosp_15_r20/external/mesa3d/docs/meson.rst (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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