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.
95 lines
4.0 KiB
95 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.
|
|
|