| --- | |
| title: Quick guide | |
| short-description: Guide to get started using meson | |
| ... | |
| # Using Meson | |
| Meson has been designed to be as easy to use as possible. This page | |
| outlines the basic use cases. For more advanced cases refer to Meson's | |
| command line help which is accessible with the command `meson --help`. | |
| Requirements | |
| -- | |
| Meson has two main dependencies. | |
| * [Python 3](https://python.org) | |
| * [Ninja](https://github.com/ninja-build/ninja/) | |
| Ninja is only needed if you use the Ninja backend. Meson can also | |
| generate native VS and XCode project files. | |
| On Ubuntu these can be easily installed with the following command: | |
| ```console | |
| $ sudo apt-get install python3 ninja-build | |
| ``` | |
| The best way to get Meson is to `pip install` it for your user | |
| ```console | |
| $ pip3 install --user meson | |
| ``` | |
| You can also use Meson as packaged by your distro, but beware that due | |
| to our frequent release cycle and development speed this version might | |
| be out of date. | |
| Another option is to clone the git repository and run it directly from | |
| there. | |
| Compiling a Meson project | |
| -- | |
| The most common use case of Meson is compiling code on a code base you | |
| are working on. The steps to take are very simple. | |
| ```console | |
| $ cd /path/to/source/root | |
| $ meson builddir && cd builddir | |
| $ ninja | |
| $ ninja test | |
| ``` | |
| The only thing to note is that you need to create a separate build | |
| directory. Meson will not allow you to build source code inside your | |
| source tree. All build artifacts are stored in the build | |
| directory. This allows you to have multiple build trees with different | |
| configurations at the same time. This way generated files are not | |
| added into revision control by accident. | |
| To recompile after code changes, just type `ninja`. The build command | |
| is always the same. You can do arbitrary changes to source code and | |
| build system files and Meson will detect those and will do the right | |
| thing. If you want to build optimized binaries, just use the argument | |
| `--buildtype=debugoptimized` when running Meson. It is recommended | |
| that you keep one build directory for unoptimized builds and one for | |
| optimized ones. To compile any given configuration, just go into the | |
| corresponding build directory and run `ninja`. | |
| Meson will automatically add compiler flags to enable debug | |
| information and compiler warnings (i.e. `-g` and `-Wall`). This means | |
| the user does not have to deal with them and can instead focus on | |
| coding. | |
| Using Meson as a distro packager | |
| -- | |
| Distro packagers usually want total control on the build flags | |
| used. Meson supports this use case natively. The commands needed to | |
| build and install Meson projects are the following. | |
| ```console | |
| $ cd /path/to/source/root | |
| $ CFLAGS=... CXXFLAGS=... LDFLAGS=.. meson --prefix /usr --buildtype=plain builddir | |
| $ ninja -v -C builddir | |
| $ ninja -C builddir test | |
| $ DESTDIR=/path/to/staging/root ninja -C builddir install | |
| ``` | |
| The command line switch `--buildtype=plain` tells Meson not to add its | |
| own flags to the command line. This gives the packager total control | |
| on used flags. | |
| This is very similar to other build systems. The only difference is | |
| that the `DESTDIR` variable is passed as an environment variable | |
| rather than as an argument to `ninja install`. | |
| As distro builds happen always from scratch, we recommend you to | |
| enable [unity builds](Unity-builds.md) whenever possible on your | |
| packages because they are faster and produce better code. |