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

# New features

## Mesontest

Mesontest is a new testing tool that allows you to run your tests in
many different ways. As an example you can run tests multiple times:

    mesontest --repeat=1000 a_test

or with an arbitrary wrapper executable:

    mesontest --wrap='valgrind --tool=helgrind' a_test

or under `gdb`, 1000 times in a row. This is handy for tests that fail
spuriously, as when the crash happens you are given the full GDB
command line:

    mesontest --repeat=1000 --gdb a_test

## Mesonrewriter

Mesonrewriter is an experimental tool to manipulate your build
definitions programmatically. It is not installed by default yet but
those interested can run it from the source repository.

As an example, here is how you would add a source file to a build target:

    mesonrewriter add --target=program --filename=new_source.c

## Shared modules

The new `shared_module` function allows the creation of shared
modules, that is, extension modules such as plugins that are meant to
be used solely with `dlopen` rather than linking them to targets.

## Gnome module

- Detect required programs and print useful errors if missing

### gtkdoc

- Allow passing a list of directories to `src_dir` keyword argument
- Add `namespace` keyword argument
- Add `mode` keyword argument
- Fix `gtkdoc-scangobj` finding local libraries

### compile_resources

- Add `gresource_bundle` keyword argument to output `.gresource` files
- Add `export` and `install_header` keyword arguments
- Use depfile support available in GLib >= 2.52.0

## i18n module

- Add `merge_file()` function for creating translated files
- Add `preset` keyword argument to included common gettext flags
- Read languages from `LINGUAS` file

## LLVM IR compilation

Meson has long had support for compiling assembler (GAS) files. In
this release we add support for compiling LLVM IR files in a similar
way when building with the Clang compiler. Just add it to the list of
files when creating a `library` or `executable` target like any other
source file. No special handling is required:

```meson
executable('some-exe', 'main.c', 'asm-file.S', 'ir-file.ll')
```

As always, you can also mix LLVM IR files with C++, C, and Assembly
(GAS) sources.

## ViM indent and syntax files

We now include filetype, indent, and syntax files for ViM [with the
source
tree](https://github.com/mesonbuild/meson/tree/master/data/syntax-highlighting/vim).
Please file issues (or pull requests!) for enhancements or if you face
any problems using them.

## Push URLs in .wrap files

[.wrap files](Using-the-WrapDB.md) for subprojects can now include a
separate push URL to allow developers to push changes directly from a
subproject git checkout.

## pkg-config dependencies

Meson now supports multiple version restrictions while searching for pkg-config dependencies.

```meson
# Just want a lower limit
dependency('zlib', version : '>1.2.1')
# Want both a lower and an upper limit
dependency('opencv', version : ['>=2.3.0', '<=3.1.0'])
# Want to exclude one specific broken version
dependency('foolite', version : ['>=3.12.1', '!=3.13.99'])
```

## Overriding more binaries with environment variables

You can now specify the binary to be used for the following tools by
setting the corresponding environment variable

| Name | Environment variable |
| ---- | -------------------- |
| pkg-config | PKG_CONFIG     |
| readelf    | READELF        |
| nm         | NM             |

## Support for `localstatedir`

Similar to other options such as `bindir` and `datadir`, you can now
specify the `localstatedir` for a project by passing
`--localstatedir=dir` to `meson` or `-Dlocalstatedir=dir` to
`mesonconf` after configuration. You can also access it from inside
the `meson.build` file with `get_option('localstatedir')`.

## New compiler function `symbols_have_underscore_prefix`

Checks if the compiler prefixes an underscore to C global symbols with
the default calling convention. This is useful when linking to
compiled assembly code, or other code that does not have its C symbol
mangling handled transparently by the compiler.

```meson
cc = meson.get_compiler('c')
conf = configuration_data()
if cc.symbols_have_underscore_prefix()
    conf.set('SYMBOLS_HAVE_UNDERSCORE', true)
endif
```

C symbol mangling is platform and architecture dependent, and a helper
function is needed to detect it. For example, Windows 32-bit prefixes
underscore, but 64-bit does not. Linux does not prefix an underscore
but OS X does.

## Vala

GLib Resources compiled with
[`gnome.compile_resources`](Gnome-module.md#compile_resources) that
are added to the sources of a Vala build target will now cause the
appropriate `--gresources` flag to be passed to the Vala compiler so
you don't need to add that yourself to `vala_args:`.

## Improvements to install scripts

You can now pass arguments to install scripts added with
[`meson.add_install_script()`](Reference-manual.md#meson-object). All
arguments after the script name will be passed to the script.

The `MESON_INSTALL_DESTDIR_PREFIX` environment variable is now set
when install scripts are called. This contains the values of the
`DESTDIR` environment variable and the `prefix` option passed to Meson
joined together. This is useful because both those are usually
absolute paths, and joining absolute paths in a cross-platform way is
tricky. [`os.path.join` in
Python](https://docs.python.org/3/library/os.path.html#os.path.join)
will discard all previous path segments when it encounters an absolute
path, and simply concatenating them will not work on Windows where
absolute paths begin with the drive letter.

## More install directories

Added new options `sbindir` and `infodir` that can be used for
installation.
