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

# New features

## Distribution tarballs from Mercurial repositories

Creating distribution tarballs can now be made out of projects based
on Mercurial. As before, this remains possible only with the Ninja
backend.

## Keyword argument verification

Meson will now check the keyword arguments used when calling any
function and print a warning if any of the keyword arguments is not
known. In the future this will become a hard error.

## Add support for Genie to Vala compiler

The Vala compiler has an alternative syntax, Genie, that uses the
`.gs` file extension. Meson now recognises and uses Genie files.

## Pkgconfig support for additional cflags

The Pkgconfig module object can add arbitrary extra cflags to the Cflags
value in the .pc file, using the "extra_cflags" keyword:
```meson
pkg.generate(libraries : libs,
             subdirs : h,
             version : '1.0',
             name : 'libsimple',
             filebase : 'simple',
             description : 'A simple demo library.',
             extra_cflags : '-Dfoo' )
```

## Base options accessible via get_option()

Base options are now accessible via the get_option() function.
```meson
uses_lto = get_option('b_lto')
```

## Allow crate type configuration for Rust compiler

Rust targets now take an optional `rust_crate_type` keyword, allowing
you to set the crate type of the resulting artifact. Valid crate types
are `dylib` or `cdylib` for shared libraries, and `rlib` or
`staticlib` for static libraries. For more, see Rust's [linkage
reference][rust-linkage].

[rust-linkage]: https://doc.rust-lang.org/reference/linkage.html

## Simultaneous use of Address- and Undefined Behavior Sanitizers

Both the address- and undefined behavior sanitizers can now be used
simultaneously by passing `-Db_sanitize=address,undefined` to Meson.

## Unstable SIMD module

A new experimental module to compile code with many different SIMD
instruction sets and selecting the best one at runtime. This module
is unstable, meaning its API is subject to change in later releases.
It might also be removed altogether.


## Import libraries for executables on Windows

The new keyword `implib` to `executable()` allows generation of an import
library for the executable.

## Added build_rpath keyword argument

You can specify `build_rpath : '/foo/bar'` in build targets and the
given path will get added to the target's rpath in the build tree. It
is removed during the install step.

Meson will print a warning when the user tries to add an rpath linker
flag manually, e.g. via `link_args` to a target. This is not
recommended because having multiple rpath causes them to stomp on each
other. This warning will become a hard error in some future release.

## Vulkan dependency module

Vulkan can now be used as native dependency. The dependency module
will detect the VULKAN_SDK environment variable or otherwise try to
receive the vulkan library and header via pkgconfig or from the
system.

## Limiting the maximum number of linker processes

With the Ninja backend it is now possible to limit the maximum number of
concurrent linker processes. This is usually only needed for projects
that have many large link steps that cause the system to run out of
memory if they are run in parallel. This limit can be set with the
new `backend_max_links` option.

## Disable implicit include directories

By default Meson adds the current source and build directories to the
header search path. On some rare occasions this is not desired. Setting
the `implicit_include_directories` keyword argument to `false` these
directories are not used.

## Support for MPI dependency

MPI is now supported as a dependency. Because dependencies are
language-specific, you must specify the requested language with the
`language` keyword, i.e., `dependency('mpi', language='c')` will
request the C MPI headers and libraries. See [the MPI
dependency](Dependencies.md#mpi) for more information.

## Allow excluding files or directories from `install_subdir`

The [`install_subdir`](Reference-manual.md#install_subdir) command
accepts the new `exclude_files` and `exclude_directories` keyword
arguments that allow specified files or directories to be excluded
from the installed subdirectory.

## Make all Meson functionality invokable via the main executable

Previously Meson had multiple executables such as `mesonintrospect`
and `mesontest`. They are now invokable via the main Meson executable
like this:

    meson configure <arguments> # equivalent to mesonconf <options>
    meson test <arguments> # equivalent to mesontest <arguments>

The old commands are still available but they are deprecated
and will be removed in some future release.

## Pcap dependency detector

Meson will automatically obtain dependency information for pcap
using the `pcap-config` tool. It is used like any other dependency:

```meson
pcap_dep = dependency('pcap', version : '>=1.0')
```

## GNOME module mkenums_simple() addition

Most libraries and applications use the same standard templates for
glib-mkenums. There is now a new `mkenums_simple()` convenience method
that passes those default templates to glib-mkenums and allows some tweaks
such as optional function decorators or leading underscores.
