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

# New features

## Project version can be specified with a file

Meson can be instructed to load a project's version string from an
external file like this:

```meson
project('foo', 'c', version: files('VERSION'))
```

The version file must contain exactly one line of text which will
be used as the project's version. If the line ends in a newline
character, it is removed.

## Support for reading files at configuration time with the `fs` module

Reading text files during configuration is now supported. This can be done at
any time after `project` has been called

```meson
project('myproject', 'c')
license_text = run_command(
    find_program('python3'), '-c', 'print(open("COPYING").read())'
).stdout().strip()
about_header = configuration_data()
about_header.add('COPYRIGHT', license_text)
about_header.add('ABOUT_STRING', meson.project_name())
...
```

There are several problems with the above approach:
1. It's ugly and confusing
2. If `COPYING` changes after configuration, Meson won't correctly rebuild when
   configuration data is based on the data in COPYING
3. It has extra overhead

`fs.read` replaces the above idiom thus:
```meson
project('myproject', 'c')
fs = import('fs')
license_text = fs.read('COPYING').strip()
about_header = configuration_data()
about_header.add('COPYRIGHT', license_text)
about_header.add('ABOUT_STRING', meson.project_name())
...
```

They are not equivalent, though. Files read with `fs.read` create a
configuration dependency on the file, and so if the `COPYING` file is modified,
Meson will automatically reconfigure, guaranteeing the build is consistent. It
can be used for any properly encoded text files. It supports specification of
non utf-8 encodings too, so if you're stuck with text files in a different
encoding, it can be passed as an argument. See the [`meson`
object](Reference-manual.md#meson-object) documentation for details.

## meson install --dry-run

New option to meson install command that does not actually install files, but
only prints messages.

## Experimental support for C++ modules in Visual Studio

Modules are a new C++ 20 feature for organising source code aiming to
increase compilation speed and reliability. This support is
experimental and may change in future releases. It only works with the
latest preview release of Visual Studio.

## Qt6 module

A module for Qt6 is now available with the same functionality as the Qt5
module.

Currently finding Qt6 is only available via `qmake` as pkg-config files aren't
generated (see [QTBUG-86080](https://bugreports.qt.io/browse/QTBUG-86080)) and
CMake support is not available for this module yet.

## Unstable Rust module

A new unstable module has been added to make using Rust with Meson easier.
Currently, it adds a single function to ease defining Rust tests, as well as a
wrapper around bindgen, making it easier to use.

## Meson test() now accepts `protocol : 'rust'`

This allows native Rust tests to be run and parsed by Meson; simply set the
protocol to `rust` and Meson takes care of the rest.

## MSVC/Clang-Cl Argument Changes/Cleanup

* "Disable Debug" (`/Od`) is no longer manually specified for optimization levels {`0`,`g`} (it is already the default for MSVC).
* "Run Time Checking" (`/RTC1`) removed from `debug` buildtype by default
* Clang-CL `debug` buildtype arguments now match MSVC arguments
* There is now no difference between `buildtype` flags and `debug` + `optimization` flags

The /Od flag has been removed, as it is already the default in the MSVC compilers, and conflicts with other user options.

/RTC1 conflicts with other RTC argument types as there are many different options, and has been removed by default.
Run Time Checking can be enabled by manually adding `/RTC1` or other RTC flags of your choice.

The `debug` buildtype for clang-cl added additional arguments compared to MSVC, which had more to do with optimization than debug. The arguments removed are `/Ob0`, `/Od`, `/RTC1`. (`/Zi` was also removed, but it is already added by default when debug is enabled.)

If these are important issues for you and would like builtin toggle options, 
please file an issue in the Meson bug tracker.

## Buildtype remains even if dependent options are changed

Setting the `buildtype` option to a value sets the `debug` and
`optimization` options to predefined values. Traditionally setting the
options to other values would then change the buildtype to `custom`.
This is confusing and means that you can't use, for example, debug
level `g` in `debug` buildtype even though it would make sense under
many circumstances.

Starting with this release, the buildtype is only changed when the user
explicitly sets it; setting the build type modifies the `debug` and
`optimization` options as before.

## Passing internal dependencies to the compiler object

Methods on the compiler object (such as `compiles`, `links`, `has_header`)
can be passed dependencies returned by `declare_dependency`, as long as they
only specify compiler/linker arguments or other dependencies that satisfy
the same requirements.

## `unstable_external_project` improvements

- Default arguments are added to `add_project()` in case some tags are not found
  in `configure_options`: `'--prefix=@PREFIX@'`, `'--libdir=@PREFIX@/@LIBDIR@'`,
  and `'--includedir=@PREFIX@/@INCLUDEDIR@'`. It was previously considered a fatal
  error to not specify them.

- When the `verbose` keyword argument is not specified, or is false, command outputs
  are written on file in `<builddir>/meson-logs/`.

- The `LD` environment variable is not passed any more when running the configure
  script. It caused issues because Meson sets `LD` to the `CC` linker wrapper but
  autotools expects it to be a real linker (e.g. `/usr/bin/ld`).

## `gnome.post_install()`

Post-install update of various system wide caches. Each script will be executed
only once even if `gnome.post_install()` is called multiple times from multiple
subprojects. If `DESTDIR` is specified during installation all scripts will be
skipped.

Currently supports `glib-compile-schemas`, `gio-querymodules`, and
`gtk-update-icon-cache`.

## "Edit and continue" (/ZI) is no longer used by default for Visual Studio

Meson was adding the `/ZI` compiler argument as an argument for Visual Studio 
in debug mode. This enables the `edit-and-continue` debugging in 
Visual Studio IDE's.

Unfortunately, it is also extremely expensive and breaks certain use cases such 
as link time code generation. Edit and continue can be enabled by manually by 
adding `/ZI` to compiler arguments.

The `/ZI` argument has now been replaced by the `/Zi` argument for debug builds.

If this is an important issue for you and would like a builtin toggle option, 
please file an issue in the Meson bug tracker.

## Minimum required Python version updated to 3.6

Meson now requires at least Python version 3.6 to run as Python 3.5
reaches EOL on September 2020. In practice this should only affect
people developing on Ubuntu Xenial, which will similarly reach EOL in
April 2021.

## Packaging a subproject

The `meson dist` command can now create a distribution tarball for a subproject
in the same git repository as the main project. This can be useful if parts of
the project (e.g. libraries) can be built and distributed separately. In that
case they can be moved into `subprojects/mysub` and running `meson dist` in that
directory will now create a tarball containing only the source code from that
subdir and not the rest of the main project or other subprojects.

For example:
```sh
git clone https://github.com/myproject
cd myproject/subprojects/mysubproject
meson builddir
meson dist -C builddir
```

## `custom_target()` and `run_target()` now accepts an `env` keyword argument

Environment variables can now be passed to the `custom_target()` command.

```meson
env = environment()
env.append('PATH', '/foo')
custom_target(..., env: env)
custom_target(..., env: {'MY_ENV': 'value'})
custom_target(..., env: ['MY_ENV=value'])
```

## `summary()` accepts external programs or dependencies

External program objects and dependency objects can be passed to
`summary()` as the value to be printed.

## CMake `find_package` version support

It is now possible to specify a requested package version for the CMake
dependency backend via the new `cmake_package_version` kwarg in the
`dependency` function.

## `meson test` only rebuilds test dependencies

Until now, `meson test` rebuilt the whole project independent of the
requested tests and their dependencies.  With this release, `meson test`
will only rebuild what is needed for the tests or suites that will be run.
This feature can be used, for example, to speed up bisecting regressions
using commands like the following:

    git bisect start <broken commit> <working commit>
    git bisect run meson test <failing test name>

This would find the broken commit automatically while at each step
rebuilding only those pieces of code needed to run the test.

However, this change could cause failures when upgrading to 0.57, if the
dependencies are not specified correctly in `meson.build`.

## The `add_*_script` methods now accept a File as the first argument

Meson now accepts `file` objects, including those produced by
`configure_file`, as the first parameter of the various
`add_*_script` methods

```meson
install_script = configure_file(
  configuration : conf,
  input : 'myscript.py.in',
  output : 'myscript.py',
)

meson.add_install_script(install_script, other, params)
```

## Unity build with Vala disabled

The approach that meson has used for Vala unity builds is incorrect, we
combine the generated C files like we would any other C file. This is very
fragile however, as the Vala compiler generates helper functions and macros
which work fine when each file is a separate translation unit, but fail when
they are combined.

## New logging format for `meson test`

The console output format for `meson test` has changed in several ways.
The major changes are:

* if stdout is a tty, `meson` includes a progress report.

* if `--print-errorlogs` is specified, the logs are printed as tests run
rather than afterwards.  All the error logs are printed rather than only
the first ten.

* if `--verbose` is specified and `--num-processes` specifies more than
one concurrent test, test output is buffered and printed after the
test finishes.

* the console logs include a reproducer command.  If `--verbose` is
specified, the command is printed for all tests at the time they start;
otherwise, it is printed for failing tests at the time the test finishes.

* for TAP and Rust tests, Meson is able to report individual subtests.  If
`--verbose` is specified, all tests are reported.  If `--print-errorlogs`
is specified, only failures are.

In addition, if `--verbose` was specified, Meson used not to generate
logs.  This limitation has now been removed.

These changes make the default `ninja test` output more readable, while
`--verbose` output provides detailed, human-readable logs that
are well suited to CI environments.

## Specify DESTDIR on command line

`meson install` command now has a `--destdir` argument that overrides `DESTDIR`
from environment.

## Skip install scripts if DESTDIR is set

`meson.add_install_script()` now has `skip_if_destdir` keyword argument. If set
to `true` the script won't be run if `DESTDIR` is set during installation. This is
useful in the case the script updates system wide caches, or performs other tasks
that are only needed when copying files into final destination.

## Add support for prelinked static libraries

The static library gains a new `prelink` keyword argument that can be
used to prelink object files in that target. This is currently only
supported for the GNU toolchain, patches to add it to other compilers
are most welcome.

## Rust now has an `std` option

Rust calls these `editions`, however, Meson generally refers to such language
versions as "standards", or `std` for short.  Therefore, Meson's Rust support
uses `std` for consistency with other languages.

## Ctrl-C behavior in `meson test`

Starting from this version, sending a `SIGINT` signal (or pressing `Ctrl-C`)
to `meson test` will interrupt the longest running test.  Pressing `Ctrl-C`
three times within a second will exit `meson test`.

## Support added for LLVM's thinLTO

A new `b_lto_mode` option has been added, which may be set to `default` or
`thin`. Thin only works for clang, and only with gnu gold, lld variants, or
ld64.

## `test()` timeout and timeout_multiplier value <= 0

`test(..., timeout: 0)`, or negative value, used to abort the test immediately
but now instead allow infinite duration. Note that omitting the `timeout`
keyword argument still defaults to 30s timeout.

Likewise, `add_test_setup(..., timeout_multiplier: 0)`, or
`meson test --timeout-multiplier 0`, or negative value, disable tests timeout.


## Knob to control LTO thread

Both the gnu linker and lld support using threads for speeding up LTO, meson
now provides a knob for this: `-Db_lto_threads`. Currently this is only
supported for clang and gcc. Any positive integer is supported, `0` means
`auto`. If the compiler or linker implements it's on `auto` we use that,
otherwise the number of threads on the machine is used.

## `summary()` now uses left alignment for both keys and values

Previously it aligned keys toward the center, but this was deemed harder
to read than having everything left aligned.

## `//` is now allowed as a function id for `meson rewrite`.

msys bash may expand `/` to a path, breaking
`meson rewrite kwargs set project / ...`. Passing `//` will be converted to
`/` by msys bash but in order to keep usage shell-agnostic, this release
also allows `//` as the id.  This way, `meson rewrite kwargs set project
// ...` will work in both msys bash and other shells.

## Get keys of configuration data object

All keys of the `configuration_data` object can be obtained with the `keys()`
method as an alphabetically sorted array.

