The Meson Build System http://mesonbuild.com/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
4.0 KiB

# 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 VCS "ignore" 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. (Note that since Meson 0.57.0, build directories
are automatically ignored for git and mercurial by generating an ignore
file inside the build directory.)
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 setup 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 setup 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 setup 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.