|
|
|
---
|
|
|
|
title: Release 0.60.0
|
|
|
|
short-description: Release notes for 0.60.0
|
|
|
|
...
|
|
|
|
|
|
|
|
# New features
|
|
|
|
|
|
|
|
## `run_target` can now be used as a dependency
|
|
|
|
|
|
|
|
A `run_target()` can now be saved in a variable and reused as a dependency in
|
|
|
|
an `alias_target()`. This can be used to create custom alias rules that ensure
|
|
|
|
multiple other targets are run, even if those targets don't produce output
|
|
|
|
files.
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
|
|
|
```
|
|
|
|
i18n = import('i18n')
|
|
|
|
|
|
|
|
all_pot_targets = []
|
|
|
|
|
|
|
|
foo_i18n = i18n.gettext('foo')
|
|
|
|
|
|
|
|
all_pot_targets += foo_i18n[1]
|
|
|
|
|
|
|
|
alias_target('all-pot', all_pot_targets)
|
|
|
|
```
|
|
|
|
|
|
|
|
## The Python Modules dependency method no longer accepts positional arguments
|
|
|
|
|
|
|
|
Previously these were ignored with a warning, now they're a hard error.
|
|
|
|
|
|
|
|
## `unset_variable()`
|
|
|
|
|
|
|
|
`unset_variable()` can be used to unset a variable. Reading a variable after
|
|
|
|
calling `unset_variable()` will raise an exception unless the variable is set
|
|
|
|
again.
|
|
|
|
|
|
|
|
```meson
|
|
|
|
# tests/meson.build
|
|
|
|
tests = ['test1', 'test2']
|
|
|
|
|
|
|
|
# ...
|
|
|
|
|
|
|
|
unset_variable('tests')
|
|
|
|
|
|
|
|
# tests is no longer usable until it is set again
|
|
|
|
```
|
|
|
|
|
|
|
|
## Override python installation paths
|
|
|
|
|
|
|
|
The `python` module now has options to control where modules are installed:
|
|
|
|
- python.platlibdir: Directory for site-specific, platform-specific files.
|
|
|
|
- python.purelibdir: Directory for site-specific, non-platform-specific files.
|
|
|
|
|
|
|
|
Those options are used by python module methods `python.install_sources()` and
|
|
|
|
`python.get_install_dir()`. By default Meson tries to detect the correct installation
|
|
|
|
path, but make them relative to the installation `prefix`, which will often result
|
|
|
|
in installed python modules to not be found by the interpreter unless `prefix`
|
|
|
|
is `/usr` on Linux, or for example `C:\Python39` on Windows. These new options
|
|
|
|
can be absolute paths outside of `prefix`.
|
|
|
|
|
|
|
|
## New `subprojects packagefiles` subcommand
|
|
|
|
|
|
|
|
It is now possible to re-apply `meson.build` overlays (`patch_filename` or
|
|
|
|
`patch_directory` in the wrap ini file) after a subproject was downloaded and
|
|
|
|
set up, via `meson subprojects packagefiles --apply <wrap-name>`.
|
|
|
|
|
|
|
|
It is also possible for `patch_directory` overlays in a `[wrap-file]`, to copy
|
|
|
|
the packagefiles out of the subproject and back into `packagefiles/<patch_directory>/`
|
|
|
|
via `meson subprojects packagefiles --save <wrap-name>`. This is useful for
|
|
|
|
testing an edit in the subproject and then saving it back to the overlay which
|
|
|
|
is checked into git.
|
|
|
|
|
|
|
|
## Deprecated project options
|
|
|
|
|
|
|
|
Project options declared in `meson_options.txt` can now be marked as deprecated
|
|
|
|
and Meson will warn when user sets a value to it. It is also possible to deprecate
|
|
|
|
only some of the choices, and map deprecated values to a new value.
|
|
|
|
|
|
|
|
```meson
|
|
|
|
# Option fully deprecated, it warns when any value is set.
|
|
|
|
option('o1', type: 'boolean', deprecated: true)
|
|
|
|
|
|
|
|
# One of the choices is deprecated, it warns only when 'a' is in the list of values.
|
|
|
|
option('o2', type: 'array', choices: ['a', 'b'], deprecated: ['a'])
|
|
|
|
|
|
|
|
# One of the choices is deprecated, it warns only when 'a' is in the list of values
|
|
|
|
# and replace it by 'c'.
|
|
|
|
option('o3', type: 'array', choices: ['a', 'b', 'c'], deprecated: {'a': 'c'})
|
|
|
|
|
|
|
|
# A boolean option has been replaced by a feature, old true/false values are remapped.
|
|
|
|
option('o4', type: 'feature', deprecated: {'true': 'enabled', 'false': 'disabled'})
|
|
|
|
|
|
|
|
# A feature option has been replaced by a boolean, enabled/disabled/auto values are remapped.
|
|
|
|
option('o5', type: 'boolean', deprecated: {'enabled': 'true', 'disabled': 'false', 'auto': 'false'})
|
|
|
|
```
|
|
|
|
|
|
|
|
## More efficient static linking of uninstalled libraries
|
|
|
|
|
|
|
|
**Note**: This change had to be reverted in 0.60.1 because it caused regressions.
|
|
|
|
New API will likely be introduced in 0.61.0 to have better control whether or
|
|
|
|
not to create thin archive.
|
|
|
|
|
|
|
|
A somewhat common use case of [[static_library]] is to create uninstalled
|
|
|
|
internal convenience libraries which are solely meant to be linked to other
|
|
|
|
targets. Some build systems call these "object libraries". Meson's
|
|
|
|
implementation does always create a static archive.
|
|
|
|
|
|
|
|
This will now check to see if the static linker supports "thin archives"
|
|
|
|
(archives which do not contain the actual object code, only references to their
|
|
|
|
location on disk) and if so, use them to minimize space usage and speed up
|
|
|
|
linking.
|
|
|
|
|
|
|
|
## gnome.yelp variadic argument deprecation
|
|
|
|
|
|
|
|
`gnome.yelp` previously allowed sources to be passed either as variadic
|
|
|
|
arguments or as a keyword argument. If the keyword argument was given the
|
|
|
|
variadic arguments would be silently ignored. This has changed in 0.60.0, the
|
|
|
|
variadic form has been deprecated, and a warning is printed if both are given.
|
|
|
|
|
|
|
|
## `static` keyword argument to `meson.override_dependency()`
|
|
|
|
|
|
|
|
It is now possible to override shared and/or static dependencies separately.
|
|
|
|
When the `static` keyword argument is not specified in `dependency()`, the first
|
|
|
|
override will be used (`static_dep` in the example below).
|
|
|
|
```meson
|
|
|
|
static_lib = static_library()
|
|
|
|
static_dep = declare_dependency(link_with: static_lib)
|
|
|
|
meson.override_dependency('foo', static_dep, static: true)
|
|
|
|
|
|
|
|
shared_lib = shared_library()
|
|
|
|
shared_dep = declare_dependency(link_with: shared_lib)
|
|
|
|
meson.override_dependency('foo', shared_dep, static: false)
|
|
|
|
|
|
|
|
# Returns static_dep
|
|
|
|
dependency('foo')
|
|
|
|
|
|
|
|
# Returns static_dep
|
|
|
|
dependency('foo', static: true)
|
|
|
|
|
|
|
|
# Returns shared_dep
|
|
|
|
dependency('foo', static: false)
|
|
|
|
```
|
|
|
|
|
|
|
|
When the `static` keyword argument is not specified in `meson.override_dependency()`,
|
|
|
|
the dependency is assumed to follow the value of `default_library` option.
|
|
|
|
```meson
|
|
|
|
dep = declare_dependency(...)
|
|
|
|
meson.override_dependency('foo', dep)
|
|
|
|
|
|
|
|
# Always works
|
|
|
|
dependency('foo')
|
|
|
|
|
|
|
|
# Works only if default_library is 'static' or 'both'
|
|
|
|
dependency('foo', static: true)
|
|
|
|
|
|
|
|
# Works only if default_library is 'shared' or 'both'
|
|
|
|
dependency('foo', static: false)
|
|
|
|
```
|
|
|
|
|
|
|
|
## `dependency()` sets `default_library` on fallback subproject
|
|
|
|
|
|
|
|
When the `static` keyword argument is set but `default_library` is missing in
|
|
|
|
`default_options`, `dependency()` will set it when configuring fallback
|
|
|
|
subproject. `dependency('foo', static: true)` is now equivalent to
|
|
|
|
`dependency('foo', static: true, default_options: ['default_library=static'])`.
|
|
|
|
|
|
|
|
## install_emptydir function
|
|
|
|
|
|
|
|
It is now possible to define a directory which will be created during
|
|
|
|
installation, without creating it as a side effect of installing files into it.
|
|
|
|
This replaces custom `meson.add_install_script()` routines. For example:
|
|
|
|
|
|
|
|
```meson
|
|
|
|
meson.add_install_script('sh', '-c', 'mkdir -p "$DESTDIR/@0@"'.format(path))
|
|
|
|
```
|
|
|
|
|
|
|
|
can be replaced by:
|
|
|
|
|
|
|
|
```meson
|
|
|
|
install_emptydir(path)
|
|
|
|
```
|
|
|
|
|
|
|
|
and as a bonus this works reliably on Windows, prints a sensible progress
|
|
|
|
message, will be uninstalled by `ninja uninstall`, etc.
|
|
|
|
|
|
|
|
## Cython can now transpile to C++ as an intermediate language
|
|
|
|
|
|
|
|
Built-in cython support currently only allows C as an intermediate language, now
|
|
|
|
C++ is also allowed. This can be set via the `cython_language` option, either on
|
|
|
|
the command line, or in the meson.build files.
|
|
|
|
|
|
|
|
```meson
|
|
|
|
project(
|
|
|
|
'myproject',
|
|
|
|
'cython',
|
|
|
|
default_options : ['cython_language=cpp'],
|
|
|
|
)
|
|
|
|
```
|
|
|
|
|
|
|
|
or on a per target basis with:
|
|
|
|
```meson
|
|
|
|
python.extension_module(
|
|
|
|
'mod',
|
|
|
|
'mod.pyx',
|
|
|
|
override_options : ['cython_language=cpp'],
|
|
|
|
)
|
|
|
|
```
|
|
|
|
|
|
|
|
## New custom dependency for iconv
|
|
|
|
|
|
|
|
```
|
|
|
|
dependency('iconv')
|
|
|
|
```
|
|
|
|
|
|
|
|
will now check for the functionality of libiconv.so, but first check if it is
|
|
|
|
provided in the libc (for example in glibc or musl libc on Linux).
|
|
|
|
|
|
|
|
## Unknown options are now always fatal
|
|
|
|
|
|
|
|
Passing unknown options to "meson setup" or "meson configure" is now
|
|
|
|
always fatal. That is, Meson will exit with an error code if this
|
|
|
|
happens. Previous Meson versions only showed a warning message.
|
|
|
|
|
|
|
|
## Install DESTDIR relative to build directory
|
|
|
|
|
|
|
|
When `DESTDIR` environment or `meson install --destdir` option is a relative path,
|
|
|
|
it is now assumed to be relative to the build directory. An absolute path will be
|
|
|
|
set into environment when executing scripts. It was undefined behavior in prior
|
|
|
|
Meson versions but was working as relative to build directory most of the time.
|
|
|
|
|
|
|
|
## Java Module
|
|
|
|
|
|
|
|
The Java module has been added to Meson. The Java module allows users to
|
|
|
|
generate native header files without needing to use a `custom_target()`.
|
|
|
|
|
|
|
|
```meson
|
|
|
|
jmod = import('java')
|
|
|
|
|
|
|
|
native_header = jmod.generate_native_header('File.java', package: 'com.mesonbuild')
|
|
|
|
native_header_includes = include_directories('.')
|
|
|
|
|
|
|
|
jdkjava = shared_module(
|
|
|
|
'jdkjava',
|
|
|
|
[native_header_includes, other_sources],
|
|
|
|
dependencies : [jdk],
|
|
|
|
include_directories : [native_header_includes]
|
|
|
|
)
|
|
|
|
```
|
|
|
|
|
|
|
|
## Link tests can use sources for a different compiler
|
|
|
|
|
|
|
|
Usually, the `links` method of the compiler object uses a single program
|
|
|
|
invocation to do both compilation and linking. Starting with this version,
|
|
|
|
whenever the argument to `links` is a file, Meson will check if the file
|
|
|
|
suffix matches the compiler object's language. If they do not match,
|
|
|
|
as in the following case:
|
|
|
|
|
|
|
|
```
|
|
|
|
cxx = meson.get_compiler('cpp')
|
|
|
|
cxx.links(files('test.c'))
|
|
|
|
```
|
|
|
|
|
|
|
|
then Meson will separate compilation and linking. In the above example
|
|
|
|
`test.c` will be compiled with a C compiler and the resulting object file
|
|
|
|
will be linked with a C++ compiler. This makes it possible to detect
|
|
|
|
misconfigurations of the compilation environment, for example when the
|
|
|
|
C++ runtime is not compatible with the one expected by the C compiler.
|
|
|
|
|
|
|
|
For this reason, passing file arguments with an unrecognized suffix to
|
|
|
|
`links` will cause a warning.
|
|
|
|
|
|
|
|
## Relax restrictions of `str.join()`
|
|
|
|
|
|
|
|
Since 0.60.0, the [[str.join]] method can take an arbitrary number of arguments
|
|
|
|
instead of just one list. Additionally, all lists past to [[str.join]] will now
|
|
|
|
be flattened.
|
|
|
|
|
|
|
|
## Improvements for the Rustc compiler
|
|
|
|
|
|
|
|
- Werror now works, this set's `-D warnings`, which will cause rustc to error
|
|
|
|
for every warning not explicitly disabled
|
|
|
|
- warning levels have been implemented
|
|
|
|
- support for meson's pic has been enabled
|
|
|
|
|
|
|
|
## The qt modules now accept generated outputs as inputs for qt.compile_*
|
|
|
|
|
|
|
|
This means you can uset `custom_target`, custom_target indices
|
|
|
|
(`custom_target[0]`, for example), or the output of `generator.process` as
|
|
|
|
inputs to the various `qt.compile_*` methods.
|
|
|
|
|
|
|
|
```meson
|
|
|
|
qt = import('qt5')
|
|
|
|
|
|
|
|
ct = custom_target(...)
|
|
|
|
|
|
|
|
out = qt.compile_ui(sources : ct)
|
|
|
|
```
|
|
|
|
|
|
|
|
## Waf support in external-project module
|
|
|
|
|
|
|
|
If the first argument is `'waf'`, special treatment is done for the
|
|
|
|
[waf](https://waf.io/) build system. The waf executable must be
|
|
|
|
found either in the current directory, or in system `PATH`.
|
|
|
|
|
|
|
|
## Comparing two objects with different types is now an error
|
|
|
|
|
|
|
|
Using the `==` and `!=` operators to compare objects of different (for instance
|
|
|
|
`[1] == 1`) types was deprecated and undefined behavior since 0.45.0 and is
|
|
|
|
now a hard error.
|
|
|
|
|
|
|
|
## Installation tags
|
|
|
|
|
|
|
|
It is now possible to install only a subset of the installable files using
|
|
|
|
`meson install --tags tag1,tag2` command line.
|
|
|
|
|
|
|
|
See [documentation](Installing.md#installation-tags) for more details.
|
|
|
|
|
|
|
|
## Compiler.unittest_args has been removed
|
|
|
|
|
|
|
|
It's never been documented, and it's been marked deprecated for a long time, so
|
|
|
|
let's remove it.
|
|
|
|
|
|
|
|
## Dependencies with multiple names
|
|
|
|
|
|
|
|
More than one name can now be passed to `dependency()`, they will be tried in order
|
|
|
|
and the first name to be found will be used. The fallback subproject will be
|
|
|
|
used only if none of the names are found on the system. Once one of the name has
|
|
|
|
been found, all other names are added into the cache so subsequent calls for any
|
|
|
|
of those name will return the same value. This is useful in case a dependency
|
|
|
|
could have different names, such as `png` and `libpng`.
|
|
|
|
|
|
|
|
## i18n module now returns gettext targets
|
|
|
|
|
|
|
|
`r = i18n.gettext('mydomain')` will now provide access to:
|
|
|
|
- a list of built .mo files
|
|
|
|
- the mydomain-pot maintainer target which updates .pot files
|
|
|
|
- the mydomain-update-po maintainer target which updates .po files
|
|
|
|
|
|
|
|
## Added support for CLA sources when cross-compiling with the C2000 toolchain
|
|
|
|
|
|
|
|
Support for CLA sources has been added for cross-compilation with the C2000 toolchain.
|
|
|
|
|
|
|
|
## Support for clippy-driver as a rustc wrapper
|
|
|
|
|
|
|
|
Clippy is a popular linting tool for Rust, and is invoked in place of rustc as a
|
|
|
|
wrapper. Unfortunately it doesn't proxy rustc's output, so we need to have a
|
|
|
|
small wrapper around it so that Meson can correctly detect the underlying rustc,
|
|
|
|
but still display clippy
|
|
|
|
|
|
|
|
## Force Visual Studio environment activation
|
|
|
|
|
|
|
|
Since `0.59.0`, meson automatically activates Visual Studio environment on Windows
|
|
|
|
for all its subcommands, but only if no other compilers (e.g. `gcc` or `clang`)
|
|
|
|
are found, and silently continue if Visual Studio activation fails.
|
|
|
|
|
|
|
|
`meson setup --vsenv` command line argument can now be used to force Visual Studio
|
|
|
|
activation even when other compilers are found. It also make Meson abort with an
|
|
|
|
error message when activation fails. This is especially useful for Github Action
|
|
|
|
because their Windows images have gcc in their PATH by default.
|
|
|
|
|
|
|
|
`--vsenv` is set by default when using `vs` backend.
|
|
|
|
|
|
|
|
Only `setup`, `compile`, `dist` and `devenv` subcommands now activate Visual Studio.
|
|
|
|
|
|
|
|
## MSVC compiler now assumes UTF-8 source code by default
|
|
|
|
|
|
|
|
Every project that uses UTF-8 source files had to add manually `/utf-8` C/C++
|
|
|
|
compiler argument for MSVC otherwise they wouldn't work on non-English locale.
|
|
|
|
Meson now switched the default to UTF-8 to be more consistent with all other
|
|
|
|
compilers.
|
|
|
|
|
|
|
|
This can be overridden but using `/source-charset`:
|
|
|
|
```meson
|
|
|
|
if cc.get_id() == 'msvc'
|
|
|
|
add_project_arguments('/source-charset:.XYZ', language: ['c', 'cpp'])
|
|
|
|
endif
|
|
|
|
```
|
|
|
|
|
|
|
|
See Microsoft documentation for details:
|
|
|
|
https://docs.microsoft.com/en-us/cpp/build/reference/source-charset-set-source-character-set.
|
|
|
|
|
|
|
|
## Add support for `find_library` in Emscripten
|
|
|
|
|
|
|
|
The `find_library` method can be used to find your own JavaScript
|
|
|
|
libraries. The limitation is that they must have the file extension
|
|
|
|
`.js`. Other library lookups will look up "native" libraries from the
|
|
|
|
system like currently. A typical usage would look like this:
|
|
|
|
|
|
|
|
```meson
|
|
|
|
glue_lib = cc.find_library('gluefuncs.js',
|
|
|
|
dirs: meson.current_source_dir())
|
|
|
|
executable('prog', 'prog.c',
|
|
|
|
dependencies: glue_lib)
|
|
|
|
```
|
|
|
|
|
|
|
|
## Optional `custom_target()` name
|
|
|
|
|
|
|
|
The name argument is now optional and defaults to the basename of the first
|
|
|
|
output.
|
|
|
|
|