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

# New features

## Allow early return from a script

Added the function `subdir_done()`. Its invocation exits the current script at
the point of invocation. All previously invoked build targets and commands are
build/executed. All following ones are ignored. If the current script was
invoked via `subdir()` the parent script continues normally.

## Concatenate string literals returned from `get_define()`

After obtaining the value of a preprocessor symbol consecutive string literals
are merged into a single string literal.
For example a preprocessor symbol's value `"ab" "cd"` is returned as `"abcd"`.

## ARM compiler(version 6) for C and CPP

Cross-compilation is now supported for ARM targets using ARM compiler
version 6 - ARMCLANG.  The required ARMCLANG compiler options for
building a shareable library are not included in the current Meson
implementation for ARMCLANG support, so it can not build shareable
libraries.  This current Meson implementation for ARMCLANG support can
not build assembly files with arm syntax (we need to use armasm instead
of ARMCLANG for the `.s` files with this syntax) and only supports GNU
syntax.

The default extension of the executable output is `.axf`.
The environment path should be set properly for the ARM compiler executables.
The `--target`, `-mcpu` options with the appropriate values should be mentioned
in the cross file as shown in the snippet below.

```ini
[properties]
c_args      = ['--target=arm-arm-none-eabi', '-mcpu=cortex-m0plus']
cpp_args    = ['--target=arm-arm-none-eabi', '-mcpu=cortex-m0plus']
```

Note:
- The current changes are tested on Windows only.
- PIC support is not enabled by default for ARM,
  if users want to use it, they need to add the required arguments
  explicitly from cross-file(`c_args`/`cpp_args`) or some other way.

## New base build option for LLVM (Apple) bitcode support

When building with clang on macOS, you can now build your static and shared
binaries with embedded bitcode by enabling the `b_bitcode` [base
option](Builtin-options.md#base-options) by passing `-Db_bitcode=true` to
Meson.

This is better than passing the options manually in the environment since Meson
will automatically disable conflicting options such as `b_asneeded`, and will
disable bitcode support on targets that don't support it such as
`shared_module()`.

Since this requires support in the linker, it is currently only enabled when
using Apple ld. In the future it can be extended to clang on other platforms
too.

## New compiler check: `check_header()`

The existing compiler check `has_header()` only checks if the header exists,
either with the `__has_include` C++11 builtin, or by running the pre-processor.

However, sometimes the header you are looking for is unusable on some platforms
or with some compilers in a way that is only detectable at compile-time. For
such cases, you should use `check_header()` which will include the header and
run a full compile.

Note that `has_header()` is much faster than `check_header()`, so it should be
used whenever possible.

## New action `copy:` for `configure_file()`

In addition to the existing actions `configuration:` and `command:`,
[`configure_file()`](Reference-manual.md#configure_file) now accepts a keyword
argument `copy:` which specifies a new action to copy the file specified with
the `input:` keyword argument to a file in the build directory with the name
specified with the `output:` keyword argument.

These three keyword arguments are, as before, mutually exclusive. You can only
do one action at a time.

## New keyword argument `encoding:` for `configure_file()`

Add a new keyword to [`configure_file()`](Reference-manual.md#configure_file)
that allows the developer to specify the input and output file encoding. The
default value is the same as before: UTF-8.

In the past, Meson would not handle non-UTF-8/ASCII files correctly, and in the
worst case would try to coerce it to UTF-8 and mangle the data. UTF-8 is the
standard encoding now, but sometimes it is necessary to process files that use
a different encoding.

For additional details see [#3135](https://github.com/mesonbuild/meson/pull/3135).

## New keyword argument `output_format:` for `configure_file()`

When called without an input file, `configure_file` generates a
C header file by default. A keyword argument was added to allow
specifying the output format, for example for use with nasm or yasm:

```meson
conf = configuration_data()
conf.set('FOO', 1)

configure_file('config.asm',
  configuration: conf,
  output_format: 'nasm')
```

## Substitutions in `custom_target(depfile:)`

The `depfile` keyword argument to `custom_target` now accepts the `@BASENAME@`
and `@PLAINNAME@` substitutions.

## Deprecated `build_always:` for custom targets

Setting `build_always` to `true` for a custom target not only marks the target
to be always considered out of date, but also adds it to the set of default
targets. This option is therefore deprecated and the new option
`build_always_stale` is introduced.

`build_always_stale` *only* marks the target to be always considered out of
date, but does not add it to the set of default targets. The old behaviour can
be achieved by combining `build_always_stale` with `build_by_default`.

The documentation has been updated accordingly.

## New built-in object type: dictionary

Meson dictionaries use a syntax similar to python's dictionaries,
but have a narrower scope: they are immutable, keys can only
be string literals, and initializing a dictionary with duplicate
keys causes a fatal error.

Example usage:

```meson
d = {'foo': 42, 'bar': 'baz'}

foo = d.get('foo')
foobar = d.get('foobar', 'fallback-value')

foreach key, value : d
  Do something with key and value
endforeach
```

## Array options treat `-Dopt=` and `-Dopt=[]` as equivalent

Prior to this change passing -Dopt= to an array opt would be interpreted as
`['']` (an array with an empty string), now `-Dopt=` is the same as `-Dopt=[]`, an
empty list.

## Feature detection based on `meson_version:` in `project()`

Meson will now print a `WARNING:` message during configuration if you use
a function or a keyword argument that was added in a meson version that's newer
than the version specified inside `project()`. For example:

```meson
project('featurenew', meson_version: '>=0.43')

cdata = configuration_data()
cdata.set('FOO', 'bar')
message(cdata.get_unquoted('FOO'))
```

This will output:

```
The Meson build system
Version: 0.47.0.dev1
Source dir: C:\path\to\srctree
Build dir: C:\path\to\buildtree
Build type: native build
Project name: featurenew
Project version: undefined
Build machine cpu family: x86_64
Build machine cpu: x86_64
WARNING: Project targetting '>=0.43' but tried to use feature introduced in '0.44.0': configuration_data.get_unquoted()
Message: bar
Build targets in project: 0
WARNING: Project specifies a minimum meson_version '>=0.43' which conflicts with:
 * 0.44.0: {'configuration_data.get_unquoted()'}
```

## New type of build option for features

A new type of [option called `feature`](Build-options.md#features) can be
defined in `meson_options.txt` for the traditional `enabled / disabled / auto`
tristate. The value of this option can be passed to the `required` keyword
argument of functions `dependency()`, `find_library()`, `find_program()` and
`add_languages()`.

A new global option `auto_features` has been added to override the value of all
`auto` features. It is intended to be used by packagers to have full control on
which feature must be enabled or disabled.

## New options to `gnome.gdbus_codegen()`

You can now pass additional arguments to gdbus-codegen using the `extra_args`
keyword. This is the same for the other gnome function calls.

Meson now automatically adds autocleanup support to the generated code. This
can be modified by setting the autocleanup keyword.

For example:

```meson
sources += gnome.gdbus_codegen('com.mesonbuild.Test',
  'com.mesonbuild.Test.xml',
  autocleanup : 'none',
  extra_args : ['--pragma-once'])
```

## Made 'install' a top level Meson command

You can now run `meson install` in your build directory and it will do
the install. It has several command line options you can toggle the
behaviour that is not in the default `ninja install` invocation. This
is similar to how `meson test` already works.

For example, to install only the files that have changed, you can do:

```console
$ meson install --only-changed
```

## `install_mode:` keyword argument extended to all installable targets

It is now possible to pass an `install_mode` argument to all installable targets,
such as `executable()`, libraries, headers, man pages and custom/generated
targets.

The `install_mode` argument can be used to specify the file mode in symbolic
format and optionally the owner/uid and group/gid for the installed files.

## New built-in option `install_umask` with a default value 022

This umask is used to define the default permissions of files and directories
created in the install tree. Files will preserve their executable mode, but the
exact permissions will obey the `install_umask`.

The `install_umask` can be overridden in the meson command-line:

```console
$ meson --install-umask=027 builddir/
```

A project can also override the default in the `project()` call:

```meson
project('myproject', 'c',
  default_options : ['install_umask=027'])
```

To disable the `install_umask`, set it to `preserve`, in which case permissions
are copied from the files in their origin.

## Octal and binary string literals

Octal and binary integer literals can now be used in build and option files.

```meson
int_493 = 0o755
int_1365 = 0b10101010101
```

## New keyword arguments: 'check' and 'capture' for `run_command()`

If `check:` is `true`, then the configuration will fail if the command returns a
non-zero exit status. The default value is `false` for compatibility reasons.

`run_command()` used to always capture the output and stored it for use in
build files. However, sometimes the stdout is in a binary format which is meant
to be discarded. For that case, you can now set the `capture:` keyword argument
to `false`.

## Windows resource files dependencies

The `compile_resources()` function of the `windows` module now takes
the `depend_files:` and `depends:` keywords.

When using binutils's `windres`, dependencies on files `#include`'d by the
preprocessor are now automatically tracked.

## Polkit support for privileged installation

When running `install`, if installation fails with a permission error and
`pkexec` is available, Meson will attempt to use it to spawn a permission
dialog for privileged installation and retry the installation.

If `pkexec` is not available, the old behaviour is retained and you will need
to explicitly run the install step with `sudo`.
