summaryrefslogtreecommitdiff
path: root/docs/meson.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/meson.rst')
-rw-r--r--docs/meson.rst498
1 files changed, 498 insertions, 0 deletions
diff --git a/docs/meson.rst b/docs/meson.rst
new file mode 100644
index 00000000000..65d9b923965
--- /dev/null
+++ b/docs/meson.rst
@@ -0,0 +1,498 @@
+Compilation and Installation Using Meson
+========================================
+
+- `Introduction <#intro>`__
+- `Basic Usage <#basic>`__
+- `Advanced Usage <#advanced>`__
+- `Cross-compilation and 32-bit builds <#cross-compilation>`__
+
+.. _intro:
+
+1. Introduction
+---------------
+
+For general information about Meson see the `Meson
+website <https://mesonbuild.com/>`__.
+
+**Mesa's Meson build system is generally considered stable and ready for
+production.**
+
+**Mesa requires Meson >= 0.52.0 to build.**
+
+The Meson build of Mesa is tested on Linux, macOS, Windows, Cygwin,
+Haiku, FreeBSD, DragonflyBSD, NetBSD, and should work on OpenBSD.
+
+Unix-like OSes
+^^^^^^^^^^^^^^
+
+If Meson is not already installed on your system, you can typically
+install it with your package installer. For example:
+
+::
+
+ sudo apt-get install meson # Ubuntu
+
+or
+
+::
+
+ sudo dnf install meson # Fedora
+
+Some older versions of meson do not check that they are too old and will
+error out in odd ways.
+
+You'll also need `Ninja <https://ninja-build.org/>`__. If it's not
+already installed, use apt-get or dnf to install the *ninja-build*
+package.
+
+Windows
+^^^^^^^
+
+You will need to install python3 and meson as a module using pip. This
+is because we use python for generating code, and rely on external
+modules (mako). You also need pkg-config (a hard dependency of meson),
+flex, and bison. The easiest way to install everything you need is with
+`chocolatey <https://chocolatey.org/>`__.
+
+::
+
+ choco install python3 winflexbison pkgconfiglite
+
+You can even use chocolatey to install mingw and ninja (ninja can be
+used with MSVC as well)
+
+::
+
+ choco install ninja mingw
+
+Then install meson using pip
+
+::
+
+ py -3 -m pip install meson mako
+
+You may need to add the python3 scripts directory to your path for
+meson.
+
+.. _basic:
+
+2. Basic Usage
+--------------
+
+The meson program is used to configure the source directory and
+generates either a ninja build file or Visual Studio® build files. The
+latter must be enabled via the ``--backend`` switch, as ninja is the
+default backend on all operating systems.
+
+Meson only supports out-of-tree builds, and must be passed a directory
+to put built and generated sources into. We'll call that directory
+"build" here. It's recommended to create a `separate build
+directory <https://mesonbuild.com/Using-multiple-build-directories.html>`__
+for each configuration you might want to use.
+
+Basic configuration is done with:
+
+::
+
+ meson build/
+
+This will create the build directory. If any dependencies are missing,
+you can install them, or try to remove the dependency with a Meson
+configuration option (see below).
+
+To review the options which Meson chose, run:
+
+::
+
+ meson configure build/
+
+Meson does not currently support listing configuration options before
+running "meson build/" but this feature is being discussed upstream. For
+now, we have a ``bin/meson-options.py`` script that prints the options
+for you. If that script doesn't work for some reason, you can always
+look in the
+`meson_options.txt <https://gitlab.freedesktop.org/mesa/mesa/-/blob/master/meson_options.txt>`__
+file at the root of the project.
+
+With additional arguments ``meson configure`` can be used to change
+options for a previously configured build directory. All options passed
+to this command are in the form ``-D "option"="value"``. For example:
+
+::
+
+ meson configure build/ -Dprefix=/tmp/install -Dglx=true
+
+Note that options taking lists (such as ``platforms``) are `a bit more
+complicated <https://mesonbuild.com/Build-options.html#using-build-options>`__,
+but the simplest form compatible with Mesa options is to use a comma to
+separate values (``-D platforms=drm,wayland``) and brackets to represent
+an empty list (``-D platforms=[]``).
+
+Once you've run the initial ``meson`` command successfully you can use
+your configured backend to build the project in your build directory:
+
+::
+
+ ninja -C build/
+
+The next step is to install the Mesa libraries, drivers, etc. This also
+finishes up some final steps of the build process (such as creating
+symbolic links for drivers). To install:
+
+::
+
+ ninja -C build/ install
+
+Note: autotools automatically updated translation files (used by the DRI
+configuration tool) as part of the build process, Meson does not do
+this. Instead, you will need do this:
+
+::
+
+ ninja -C build/ xmlpool-pot xmlpool-update-po xmlpool-gmo
+
+Windows specific instructions
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+On windows you have a couple of choices for compilers. If you installed
+mingw with chocolatey and want to use ninja you should be able to open
+any shell and follow the instructions above. If you want to you MSVC,
+clang-cl, or ICL (the Intel Compiler), read on.
+
+Both ICL and MSVC come with shell environments, the easiest way to use
+meson with these it to open a shell. For clang-cl you will need to open
+an MSVC shell, and then override the compilers, either using a `native
+file <https://mesonbuild.com/Native-environments.html>`__, or with the
+CC and CXX environment variables.
+
+All of these compilers are tested and work with ninja, but if you want
+visual studio integration or you just like msbuild, passing
+``--backend=vs`` to meson will generate a visual studio solution. If you
+want to use ICL or clang-cl with the vsbackend you will need meson
+0.52.0 or greater. Older versions always use the microsoft compiler.
+
+.. _advanced:
+
+3. Advanced Usage
+-----------------
+
+Installation Location
+~~~~~~~~~~~~~~~~~~~~~
+
+Meson default to installing libGL.so in your system's main lib/
+directory and DRI drivers to a dri/ subdirectory.
+
+Developers will often want to install Mesa to a testing directory rather
+than the system library directory. This can be done with the --prefix
+option. For example:
+
+::
+
+ meson --prefix="${PWD}/build/install" build/
+
+will put the final libraries and drivers into the build/install/
+directory. Then you can set LD_LIBRARY_PATH and LIBGL_DRIVERS_PATH to
+that location to run/test the driver.
+
+Meson also honors ``DESTDIR`` for installs.
+
+Compiler Options
+~~~~~~~~~~~~~~~~
+
+Meson supports the common CFLAGS, CXXFLAGS, etc. environment variables
+but their use is discouraged because of the many caveats in using them.
+
+Instead, it is recomended to use ``-D${lang}_args`` and
+``-D${lang}_link_args``. Among the benefits of these options is that
+they are guaranteed to persist across rebuilds and reconfigurations.
+
+This example sets -fmax-errors for compiling C sources and -DMAGIC=123
+for C++ sources:
+
+::
+
+ meson builddir/ -Dc_args=-fmax-errors=10 -Dcpp_args=-DMAGIC=123
+
+Compiler Specification
+~~~~~~~~~~~~~~~~~~~~~~
+
+Meson supports the standard CC and CXX environment variables for
+changing the default compiler. Note that Meson does not allow changing
+the compilers in a configured builddir so you will need to create a new
+build dir for a different compiler.
+
+This is an example of specifying the clang compilers and cleaning the
+build directory before reconfiguring with an extra C option:
+
+::
+
+ CC=clang CXX=clang++ meson build-clang
+ ninja -C build-clang
+ ninja -C build-clang clean
+ meson configure build -Dc_args="-Wno-typedef-redefinition"
+ ninja -C build-clang
+
+The default compilers depends on your operating system. Meson supports
+most of the popular compilers, a complete list is available
+`here <https://mesonbuild.com/Reference-tables.html#compiler-ids>`__.
+
+LLVM
+~~~~
+
+Meson includes upstream logic to wrap llvm-config using its standard
+dependency interface.
+
+As of meson 0.51.0 meson can use cmake to find llvm (the cmake finder
+was added in meson 0.49.0, but LLVM cannot be found until 0.51) Due to
+the way LLVM implements its cmake finder it will only find static
+libraries, it will never find libllvm.so. There is also a
+``-Dcmake_module_path`` option in this meson version, which points to
+the root of an alternative installation (the prefix). For example:
+
+::
+
+ meson builddir -Dcmake_module_path=/home/user/mycmake/prefix
+
+As of meson 0.49.0 meson also has the concept of a `"native
+file" <https://mesonbuild.com/Native-environments.html>`__, these files
+provide information about the native build environment (as opposed to a
+cross build environment). They are ini formatted and can override where
+to find llvm-config:
+
+custom-llvm.ini
+
+::
+
+ [binaries]
+ llvm-config = '/usr/local/bin/llvm/llvm-config'
+
+Then configure meson:
+
+::
+
+ meson builddir/ --native-file custom-llvm.ini
+
+Meson < 0.49 doesn't support native files, so to specify a custom
+``llvm-config`` you need to modify your ``$PATH`` (or ``%PATH%`` on
+windows), which will be searched for ``llvm-config``,
+``llvm-config$version``, and ``llvm-config-$version``:
+
+::
+
+ PATH=/path/to/folder/with/llvm-config:$PATH meson build
+
+For selecting llvm-config for cross compiling a `"cross
+file" <https://mesonbuild.com/Cross-compilation.html#defining-the-environment>`__
+should be used. It uses the same format as the native file above:
+
+cross-llvm.ini
+
+::
+
+ [binaries]
+ ...
+ llvm-config = '/usr/lib/llvm-config-32'
+ cmake = '/usr/bin/cmake-for-my-arch'
+
+Obviously, only cmake or llvm-config is required.
+
+Then configure meson:
+
+::
+
+ meson builddir/ --cross-file cross-llvm.ini
+
+See the `Cross Compilation <#cross-compilation>`__ section for more
+information.
+
+On windows (and in other cases), using llvm-config or cmake may be
+either undesirable or impossible. Meson's solution for this is a
+`wrap <https://mesonbuild.com/Wrap-dependency-system-manual.html>`__, in
+this case a "binary wrap". Follow the steps below:
+
+- Install the binaries and headers into the
+ ``$mesa_src/subprojects/llvm``
+- Add a meson build.build file to that directory (more on that later)
+
+The wrap file must define the following:
+
+- ``dep_llvm``: a ``declare_dependency()`` object with
+ include_directories, dependencies, and version set)
+
+It may also define:
+
+- ``irbuilder_h``: a ``files()`` object pointing to llvm/IR/IRBuilder.h
+ (this is requred for SWR)
+- ``has_rtti``: a ``bool`` that declares whether LLVM was built with
+ RTTI. Defaults to true
+
+such a meson.build file might look like:
+
+::
+
+ project('llvm', ['cpp'])
+
+ cpp = meson.get_compiler('cpp')
+
+ _deps = []
+ _search = join_paths(meson.current_source_dir(), 'lib')
+ foreach d : ['libLLVMCodeGen', 'libLLVMScalarOpts', 'libLLVMAnalysis',
+ 'libLLVMTransformUtils', 'libLLVMCore', 'libLLVMX86CodeGen',
+ 'libLLVMSelectionDAG', 'libLLVMipo', 'libLLVMAsmPrinter',
+ 'libLLVMInstCombine', 'libLLVMInstrumentation', 'libLLVMMC',
+ 'libLLVMGlobalISel', 'libLLVMObjectYAML', 'libLLVMDebugInfoPDB',
+ 'libLLVMVectorize', 'libLLVMPasses', 'libLLVMSupport',
+ 'libLLVMLTO', 'libLLVMObject', 'libLLVMDebugInfoCodeView',
+ 'libLLVMDebugInfoDWARF', 'libLLVMOrcJIT', 'libLLVMProfileData',
+ 'libLLVMObjCARCOpts', 'libLLVMBitReader', 'libLLVMCoroutines',
+ 'libLLVMBitWriter', 'libLLVMRuntimeDyld', 'libLLVMMIRParser',
+ 'libLLVMX86Desc', 'libLLVMAsmParser', 'libLLVMTableGen',
+ 'libLLVMFuzzMutate', 'libLLVMLinker', 'libLLVMMCParser',
+ 'libLLVMExecutionEngine', 'libLLVMCoverage', 'libLLVMInterpreter',
+ 'libLLVMTarget', 'libLLVMX86AsmParser', 'libLLVMSymbolize',
+ 'libLLVMDebugInfoMSF', 'libLLVMMCJIT', 'libLLVMXRay',
+ 'libLLVMX86AsmPrinter', 'libLLVMX86Disassembler',
+ 'libLLVMMCDisassembler', 'libLLVMOption', 'libLLVMIRReader',
+ 'libLLVMLibDriver', 'libLLVMDlltoolDriver', 'libLLVMDemangle',
+ 'libLLVMBinaryFormat', 'libLLVMLineEditor',
+ 'libLLVMWindowsManifest', 'libLLVMX86Info', 'libLLVMX86Utils']
+ _deps += cpp.find_library(d, dirs : _search)
+ endforeach
+
+ dep_llvm = declare_dependency(
+ include_directories : include_directories('include'),
+ dependencies : _deps,
+ version : '6.0.0',
+ )
+
+ has_rtti = false
+ irbuilder_h = files('include/llvm/IR/IRBuilder.h')
+
+It is very important that version is defined and is accurate, if it is
+not, workarounds for the wrong version of LLVM might be used resulting
+in build failures.
+
+``PKG_CONFIG_PATH``
+~~~~~~~~~~~~~~~~~~~
+
+The ``pkg-config`` utility is a hard requirement for configuring and
+building Mesa on Unix-like systems. It is used to search for external
+libraries on the system. This environment variable is used to control
+the search path for ``pkg-config``. For instance, setting
+``PKG_CONFIG_PATH=/usr/X11R6/lib/pkgconfig`` will search for package
+metadata in ``/usr/X11R6`` before the standard directories.
+
+Options
+~~~~~~~
+
+One of the oddities of meson is that some options are different when
+passed to the ``meson`` than to ``meson configure``. These options are
+passed as --option=foo to ``meson``, but -Doption=foo to
+``meson configure``. Mesa defined options are always passed as
+-Doption=foo.
+
+For those coming from autotools be aware of the following:
+
+``--buildtype/-Dbuildtype``
+ This option will set the compiler debug/optimisation levels to aid
+ debugging the Mesa libraries.
+
+ Note that in meson this defaults to ``debugoptimized``, and not
+ setting it to ``release`` will yield non-optimal performance and
+ binary size. Not using ``debug`` may interfere with debugging as some
+ code and validation will be optimized away.
+
+ For those wishing to pass their own optimization flags, use the
+ ``plain`` buildtype, which causes meson to inject no additional
+ compiler arguments, only those in the C/CXXFLAGS and those that mesa
+ itself defines.
+
+``-Db_ndebug``
+ This option controls assertions in meson projects. When set to
+ ``false`` (the default) assertions are enabled, when set to true they
+ are disabled. This is unrelated to the ``buildtype``; setting the
+ latter to ``release`` will not turn off assertions.
+
+.. _cross-compilation:
+
+4. Cross-compilation and 32-bit builds
+--------------------------------------
+
+`Meson supports
+cross-compilation <https://mesonbuild.com/Cross-compilation.html>`__ by
+specifying a number of binary paths and settings in a file and passing
+this file to ``meson`` or ``meson configure`` with the ``--cross-file``
+parameter.
+
+This file can live at any location, but you can use the bare filename
+(without the folder path) if you put it in $XDG_DATA_HOME/meson/cross or
+~/.local/share/meson/cross
+
+Below are a few example of cross files, but keep in mind that you will
+likely have to alter them for your system.
+
+Those running on ArchLinux can use the AUR-maintained packages for some
+of those, as they'll have the right values for your system:
+
+- `meson-cross-x86-linux-gnu <https://aur.archlinux.org/packages/meson-cross-x86-linux-gnu>`__
+- `meson-cross-aarch64-linux-gnu <https://aur.archlinux.org/packages/meson-cross-aarch64-linux-gnu>`__
+
+32-bit build on x86 linux:
+
+::
+
+ [binaries]
+ c = '/usr/bin/gcc'
+ cpp = '/usr/bin/g++'
+ ar = '/usr/bin/gcc-ar'
+ strip = '/usr/bin/strip'
+ pkgconfig = '/usr/bin/pkg-config-32'
+ llvm-config = '/usr/bin/llvm-config32'
+
+ [properties]
+ c_args = ['-m32']
+ c_link_args = ['-m32']
+ cpp_args = ['-m32']
+ cpp_link_args = ['-m32']
+
+ [host_machine]
+ system = 'linux'
+ cpu_family = 'x86'
+ cpu = 'i686'
+ endian = 'little'
+
+64-bit build on ARM linux:
+
+::
+
+ [binaries]
+ c = '/usr/bin/aarch64-linux-gnu-gcc'
+ cpp = '/usr/bin/aarch64-linux-gnu-g++'
+ ar = '/usr/bin/aarch64-linux-gnu-gcc-ar'
+ strip = '/usr/bin/aarch64-linux-gnu-strip'
+ pkgconfig = '/usr/bin/aarch64-linux-gnu-pkg-config'
+ exe_wrapper = '/usr/bin/qemu-aarch64-static'
+
+ [host_machine]
+ system = 'linux'
+ cpu_family = 'aarch64'
+ cpu = 'aarch64'
+ endian = 'little'
+
+64-bit build on x86 windows:
+
+::
+
+ [binaries]
+ c = '/usr/bin/x86_64-w64-mingw32-gcc'
+ cpp = '/usr/bin/x86_64-w64-mingw32-g++'
+ ar = '/usr/bin/x86_64-w64-mingw32-ar'
+ strip = '/usr/bin/x86_64-w64-mingw32-strip'
+ pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
+ exe_wrapper = 'wine'
+
+ [host_machine]
+ system = 'windows'
+ cpu_family = 'x86_64'
+ cpu = 'i686'
+ endian = 'little'