| --- |
| short-description: Building a project with Meson |
| ... |
| |
| # Running Meson |
| |
| There are two different ways of invoking Meson. First, you can run it directly |
| from the source tree with the command `/path/to/source/meson.py`. Meson may |
| also be installed in which case the command is simply `meson`. In this manual |
| we only use the latter format for simplicity. |
| |
| At the time of writing only a command line version of Meson is available. This |
| means that Meson must be invoked using the terminal. If you wish to use the |
| MSVC compiler, you need to run Meson under "Visual Studio command prompt". |
| |
| All available meson commands are listed on the [commands reference page](Commands.md). |
| |
| ## Configuring the build directory |
| |
| Let us assume that we have a source tree that has a Meson build system. This |
| means that at the topmost directory has a file called `meson.build`. We run the |
| following commands to get the build started. |
| |
| ```sh |
| cd /path/to/source/root |
| meson setup builddir |
| ``` |
| |
| We invoke Meson with the `setup` command, giving it the location of the build |
| directory. Meson uses [out of source |
| builds](http://voices.canonical.com/jussi.pakkanen/2013/04/16/why-you-should-consider-using-separate-build-directories/). |
| |
| Hint: The syntax of meson is `meson [command] [arguments] [options]`. The |
| `setup` command takes a `builddir` and a `srcdir` argument. If no `srcdir` is |
| given Meson will deduce the `srcdir` based on `pwd` and the location of |
| `meson.build`. |
| |
| Meson then loads the build configuration file and writes the corresponding |
| build backend in the build directory. By default Meson generates a *debug |
| build*, which turns on basic warnings and debug information and disables |
| compiler optimizations. |
| |
| Additionally, the invocation can pass options to meson. The list of options is |
| documented [here](Builtin-options.md). |
| |
| You can specify a different type of build with the `--buildtype` command line |
| argument. It can have one of the following values. |
| |
| | value | meaning | |
| | ------ | -------- | |
| | `plain` | no extra build flags are used, even for compiler warnings, useful for distro packagers and other cases where you need to specify all arguments by yourself | |
| | `debug` | debug info is generated but the result is not optimized, this is the default | |
| | `debugoptimized` | debug info is generated and the code is optimized (on most compilers this means `-g -O2`) | |
| | `release` | full optimization, no debug info | |
| |
| The build directory is mandatory. The reason for this is that it simplifies the |
| build process immensely. Meson will not under any circumstances write files |
| inside the source directory (if it does, it is a bug and should be fixed). This |
| means that the user does not need to add a bunch of files to their revision |
| control's ignore list. It also means that you can create arbitrarily many build |
| directories for any given source tree. |
| |
| For example, if we wanted to test building the source code with the Clang |
| compiler instead of the system default, we could just type the following |
| commands: |
| |
| ```sh |
| cd /path/to/source/root |
| CC=clang CXX=clang++ meson setup buildclang |
| ``` |
| |
| This separation is even more powerful if your code has multiple configuration |
| options (such as multiple data backends). You can create a separate |
| subdirectory for each of them. You can also have build directories for |
| optimized builds, code coverage, static analysis and so on. They are all neatly |
| separated and use the same source tree. Changing between different |
| configurations is just a question of changing to the corresponding directory. |
| |
| Unless otherwise mentioned, all following command line invocations are meant to |
| be run in the source directory. |
| |
| By default Meson will use the Ninja backend to build your project. If you wish |
| to use any of the other backends, you need to pass the corresponding argument |
| during configuration time. As an example, here is how you would use Meson to |
| generate a Visual studio solution. |
| |
| ```sh |
| meson setup <build dir> --backend=vs |
| ``` |
| |
| You can then open the generated solution with Visual Studio and compile it in |
| the usual way. A list of backends can be obtained with `meson setup --help`. |
| |
| ## Environment variables |
| |
| Sometimes you want to add extra compiler flags, this can be done by passing |
| them in environment variables when calling meson. See [the reference |
| tables](Reference-tables.md#compiler-and-linker-flag-envrionment-variables) for |
| a list of all the environment variables. Be aware however these environment |
| variables are only used for the native compiler and will not affect the |
| compiler used for cross-compiling, where the flags specified in the cross file |
| will be used. |
| |
| Furthermore it is possible to stop meson from adding flags itself by using the |
| `--buildtype=plain` option, in this case you must provide the full compiler and |
| linker arguments needed. |
| |
| ## Building from the source |
| |
| To start the build, simply type the following command. |
| |
| ```sh |
| meson compile -C builddir |
| ``` |
| |
| See [`meson compile` description](Commands.md#compile) for more info. |
| |
| ### Building directly with ninja |
| |
| By default Meson uses the [Ninja build system](https://ninja-build.org/) to |
| actually build the code. To start the build, simply type the following command. |
| |
| ```sh |
| ninja -C builddir |
| ``` |
| |
| The main usability difference between Ninja and Make is that Ninja will |
| automatically detect the number of CPUs in your computer and parallelize itself |
| accordingly. You can override the amount of parallel processes used with the |
| command line argument `-j <num processes>`. |
| |
| It should be noted that after the initial configure step `ninja` is the only |
| command you ever need to type to compile. No matter how you alter your source |
| tree (short of moving it to a completely new location), Meson will detect the |
| changes and regenerate itself accordingly. This is especially handy if you have |
| multiple build directories. Often one of them is used for development (the |
| "debug" build) and others only every now and then (such as a "static analysis" |
| build). Any configuration can be built just by `cd`'ing to the corresponding |
| directory and running Ninja. |
| |
| ## Running tests |
| |
| Meson provides native support for running tests. The command to do that is |
| simple. |
| |
| ```sh |
| meson test -C builddir |
| ``` |
| |
| See [`meson test` description](Commands.md#test) for more info. |
| |
| Meson does not force the use of any particular testing framework. You are free |
| to use GTest, Boost Test, Check or even custom executables. |
| |
| Note: it can be also invoked directly with ninja with the following command: |
| ```sh |
| ninja -C builddir test |
| ``` |
| |
| ## Installing |
| |
| Installing the built software is just as simple. |
| |
| ```sh |
| meson install -C builddir |
| ``` |
| |
| See [`meson install` description](Commands.md#install) for more info. |
| |
| Note that Meson will only install build targets explicitly tagged as |
| installable, as detailed in the [installing targets |
| documentation](Installing.md). |
| |
| By default Meson installs to `/usr/local`. This can be changed by passing the |
| command line argument `--prefix /your/prefix` to Meson during configure time. |
| Meson also supports the `DESTDIR` variable used in e.g. building packages. It |
| is used like this: |
| |
| ```sh |
| DESTDIR=/path/to/staging meson install -C builddir |
| ``` |
| |
| Note: it can be also invoked directly with ninja with the following command: |
| ```sh |
| ninja -C builddir install |
| ``` |
| |
| ## Command line help |
| |
| Meson has a standard command line help feature. It can be accessed with the |
| following command. |
| |
| meson --help |
| |
| ## Exit status |
| |
| Meson exits with status 0 if successful, 1 for problems with the command line |
| or meson.build file, and 2 for internal errors. |