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

## Uninstall target

Meson allows you to uninstall an install step by invoking the
uninstall target. This will remove all files installed as part of
install. Note that this does not restore the original files. This also
does not undo changes done by custom install scripts (because they can
do arbitrary install operations).

## Support for arbitrary test setups

Sometimes you need to run unit tests with special settings. For
example under Valgrind. Usually this requires extra command line
options for the tool. This is supported with the new *test setup*
feature. For example to set up a test run with Valgrind, you'd write
this in a `meson.build` file:

```meson
add_test_setup('valgrind',
  exe_wrapper : [vg, '--error-exitcode=1', '--leak-check=full'],
  timeout_multiplier : 100)
```

This tells Meson to run tests with Valgrind using the given options
and multiplying the test timeout values by 100. To run this test setup
simply issue the following command:

```console
$ mesontest --setup=valgrind
```

## Intel C/C++ compiler support

As usual, just set `CC=icc CXX=icpc` and Meson will use it as the
C/C++ compiler. Currently only Linux is supported.

## Get values from configuration data objects

Now it is possible to query values stored in configuration data
objects.

```meson
cdata.set('key', 'value')
cdata.get('key') # returns 'value'
cdata.get('nokey', 'default') # returns 'default'
cdata.get('nokey') # halts with an error
```

## Python 3 module support

Building Python 3 extension modules has always been possible, but it
is now even easier:

```meson
py3_mod = import('python3')
pylib = py3_mod.extension_module('modname',
  'modsource.c',
  dependencies : py3_dep)
```

## Default options to subprojects

Projects can specify overriding values for subprojects'
`default_options` when invoking a subproject:

```meson
subproject('foo', default_options : ['optname=overridevalue'])
dependency('some-dep', fallback : ['some_subproject', 'some_dep'], default_options : ['optname=overridevalue'])
```

The effect is the same as if the default options were written in the
subproject's `project` call.

## Set targets to be built (or not) by default

Build targets got a new keyword `build_by_default` which tells whether
the target should be built by default when running e.g. `ninja`.
Custom targets are not built by default but other targets are. Any
target that is tagged as installed or to be built always is also built
by default, regardless of the value of this keyword.

## Add option to mesonconf to wipe cached data.

Meson caches the results of dependency lookups. Sometimes these may
get out of sync with the system state. Mesonconf now has a
`--clearcache` option to clear these values so they will be
re-searched from the system upon next compile.

## Can specify file permissions and owner when installing data

The new `install_mode` keyword argument can be used to specify file
permissions and uid/gid of files when doing the install. This allows
you to, for example, install suid root scripts.

## `has_header()` checks are now faster

When using compilers that implement the [`__has_include()`
preprocessor
macro](https://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros),
the check is now ~40% faster.

## Array indexing now supports fallback values

The second argument to the array
[`.get()`](Reference-manual.md#array-object) function is now returned
if the specified index could not be found

```meson
array = [10, 11, 12, 13]
array.get(0) # this will return `10`
array.get(4) # this will give an error about invalid index
array.get(4, 0) # this will return `0`
```

## Silent mode for Mesontest

The Meson test executor got a new argument `-q` (and `--quiet`) that
suppresses all output of successful tests. This makes interactive
usage nicer because only errors are printed.
