The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
354 lines
14 KiB
354 lines
14 KiB
4 years ago
|
---
|
||
|
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 print messages.
|
||
|
|
||
|
## 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.
|
||
|
|