---
title: Release 0.40
short-description: Release notes for 0.40
...

# New features

## Outputs of generators can be used in custom targets in the VS backend

This has been possible with the Ninja backend for a long time but now
the Visual Studio backend works too.

## `compute_int` method in the compiler objects

This method can be used to evaluate the value of an expression. As an
example:

```meson
cc = meson.get_compiler('c')
two = cc.compute_int('1 + 1') # A very slow way of adding two numbers.
```

## Visual Studio 2017 support

There is now a VS2017 backend (`--backend=vs2017`) as well as a
generic VS backend (`--backend=vs`) that autodetects the currently
active VS version.

## Automatic initialization of subprojects that are git submodules

If you have a directory inside your subprojects directory (usually
`subprojects/`) that is a git submodule, Meson will automatically
initialize it if your build files refer to it. This will be done
without needing a wrap file since git contains all the information
needed.

## No download mode for wraps

Added a new option `wrap-mode` that can be toggled to prevent Meson
from downloading dependency projects. Attempting to do so will cause
an error. This is useful for distro packagers and other cases where
you must explicitly enforce that nothing is downloaded from the net
during configuration or build.

## Overriding options per target

Build targets got a new keyword argument `override_options` that can
be used to override system options. As an example if you have a target
that you know can't be built with `-Werror` enabled you can override
the value of the option like this:

```meson
executable('foo', 'foo.c', override_options : ['werror=false'])
```

Note that this does not affect project options, only those options
that come from Meson (language standards, unity builds etc).

## Compiler object get define

Compiler objects got a new method `get_define()` that returns the
given preprocessor symbol as a string.

```meson
cc = meson.get_compiler('c')
one = cc.get_define('__linux__') # returns '1' on Linux hosts
```

## Cygwin support

Meson now works under Cygwin and we have added it to our CI test
matrix.

## Multiple install directories

Custom targets can produce many output files. Previously it was only
possible to install all of them in the same directory, but now you can
install each output in its own directory like this:

```meson
custom_target('two_out',
  output : ['diff.h', 'diff.sh'],
  command : [creator, '@OUTDIR@'],
  install : true,
  install_dir : ['dir1', 'dir2'])
```

For backwards compatibility and for conciseness, if you only specify
one directory all outputs will be installed into it.

The same feature is also available for Vala build targets. For
instance, to install a shared library built by valac, the generated
header, and the generated VAPI (respectively) into the default
locations, you can do:

```meson
shared_library('valalib', 'mylib.vala',
  install : true,
  install_dir : [true, true, true])
```

To install any of the three in a custom directory, just pass it as a
string instead of `true`. To not install it, pass `false`. You can
also pass a single string (as before) and it will cause only the
library to be installed, so this is a backwards-compatible change.

## Can specify method of obtaining dependencies

Some dependencies have many ways of being provided. As an example Qt
can either be detected via `pkg-config` or `qmake`. Until now Meson
has had a heuristic for selecting which method to choose but sometimes
it does the wrong thing. This can now be overridden with the `method`
keyword like this:

```meson
qt5_dep = dependency('qt5', modules : 'core', method : 'qmake')
```

## Link whole contents of static libraries

The default behavior of static libraries is to discard all symbols
that are not not directly referenced. This may lead to exported
symbols being lost. Most compilers support "whole archive" linking
that includes all symbols and code of a given static library. This is
exposed with the `link_whole` keyword.

```meson
shared_library('foo', 'foo.c', link_whole : some_static_library)
```

Note that Visual Studio compilers only support this functionality on
VS 2015 and newer.

## Unity builds only for subprojects

Up until now unity builds were either done for every target or none of
them. Now unity builds can be specified to be enabled only for
subprojects, which change seldom, and not for the master project,
which changes a lot. This is enabled by setting the `unity` option to
`subprojects`.

## Running `mesonintrospect` from scripts

Meson now sets the `MESONINTROSPECT` environment variable in addition
to `MESON_SOURCE_ROOT` and other variables when running scripts. It is
guaranteed to point to the correct `mesonintrospect` script, which is
important when running Meson uninstalled from git or when your `PATH`s
may not be set up correctly.

Specifically, the following Meson functions will set it:
`meson.add_install_script()`, `meson.add_postconf_script()`,
`run_command()`, `run_target()`.
