|
|
|
# Using multiple build directories
|
|
|
|
|
|
|
|
One of the main design goals of Meson has been to build all projects
|
|
|
|
out-of-source. This means that *all* files generated during the build
|
|
|
|
are placed in a separate subdirectory. This goes against common Unix
|
|
|
|
tradition where you build your projects in-source. Building out of
|
|
|
|
source gives two major advantages.
|
|
|
|
|
|
|
|
First of all this makes for very simple `.gitignore` files. In
|
|
|
|
classical build systems you may need to have tens of lines of
|
|
|
|
definitions, most of which contain wildcards. When doing out of source
|
|
|
|
builds all of this busywork goes away. A common ignore file for a
|
|
|
|
Meson project only contains a few lines that are the build directory
|
|
|
|
and IDE project files.
|
|
|
|
|
|
|
|
Secondly this makes it very easy to clean your projects: just delete
|
|
|
|
the build subdirectory and you are done. There is no need to guess
|
|
|
|
whether you need to run `make clean`, `make distclean`, `make
|
|
|
|
mrproper` or something else. When you delete a build subdirectory
|
|
|
|
there is no possible way to have any lingering state from your old
|
|
|
|
builds.
|
|
|
|
|
|
|
|
The true benefit comes from somewhere else, though.
|
|
|
|
|
|
|
|
## Multiple build directories for the same source tree
|
|
|
|
|
|
|
|
Since a build directory is fully self contained and treats the source
|
|
|
|
tree as a read-only piece of data, it follows that you can have
|
|
|
|
arbitrarily many build trees for any source tree at the same time.
|
|
|
|
Since all build trees can have different configuration, this is
|
|
|
|
extremely powerful. Now you might be wondering why one would want to
|
|
|
|
have multiple build setups at the same time. Let's examine this by
|
|
|
|
setting up a hypothetical project.
|
|
|
|
|
|
|
|
The first thing to do is to set up the default build, that is, the one
|
|
|
|
we are going to use over 90% of the time. In this we use the system
|
|
|
|
compiler and build with debug enabled and no optimizations so it
|
|
|
|
builds as fast as possible. This is the default project type for
|
|
|
|
Meson, so setting it up is simple.
|
|
|
|
|
|
|
|
mkdir builddir
|
|
|
|
meson builddir
|
|
|
|
|
|
|
|
Another common setup is to build with debug and optimizations to, for
|
|
|
|
example, run performance tests. Setting this up is just as simple.
|
|
|
|
|
|
|
|
mkdir buildopt
|
|
|
|
meson --buildtype=debugoptimized buildopt
|
|
|
|
|
|
|
|
For systems where the default compiler is GCC, we would like to
|
|
|
|
compile with Clang, too. So let's do that.
|
|
|
|
|
|
|
|
mkdir buildclang
|
|
|
|
CC=clang CXX=clang++ meson buildclang
|
|
|
|
|
|
|
|
You can add cross builds, too. As an example, let's set up a Linux ->
|
|
|
|
Windows cross compilation build using MinGW.
|
|
|
|
|
|
|
|
mkdir buildwine
|
|
|
|
meson --cross-file=mingw-cross.txt buildwine
|
|
|
|
|
|
|
|
The cross compilation file sets up Wine so that not only can you
|
|
|
|
compile your application, you can also run the unit test suite just by
|
|
|
|
issuing the command `meson test`.
|
|
|
|
|
|
|
|
To compile any of these build types, just cd into the corresponding
|
|
|
|
build directory and run `meson compile` or instruct your IDE to do the
|
|
|
|
same. Note that once you have set up your build directory once, you
|
|
|
|
can just run Ninja and Meson will ensure that the resulting build is
|
|
|
|
fully up to date according to the source. Even if you have not touched
|
|
|
|
one of the directories in weeks and have done major changes to your
|
|
|
|
build configuration, Meson will detect this and bring the build
|
|
|
|
directory up to date (or print an error if it can't do that). This
|
|
|
|
allows you to do most of your work in the default directory and use
|
|
|
|
the others every now and then without having to babysit your build
|
|
|
|
directories.
|
|
|
|
|
|
|
|
## Specialized uses
|
|
|
|
|
|
|
|
Separate build directories allows easy integration for various
|
|
|
|
different kinds of tools. As an example, Clang comes with a static
|
|
|
|
analyzer. It is meant to be run from scratch on a given source tree.
|
|
|
|
The steps to run it with Meson are very simple.
|
|
|
|
|
|
|
|
rm -rf buildscan
|
|
|
|
mkdir buildscan
|
|
|
|
scan-build meson buildscan
|
|
|
|
cd buildscan
|
|
|
|
scan-build ninja
|
|
|
|
|
|
|
|
These commands are the same for every single Meson project, so they
|
|
|
|
could even be put in a script turning static analysis into a single
|
|
|
|
command.
|