|
|
--- |
|
|
title: Release 0.63.0 |
|
|
short-description: Release notes for 0.63.0 |
|
|
... |
|
|
|
|
|
# New features |
|
|
|
|
|
## `add_project_dependencies()` function |
|
|
|
|
|
Dependencies can now be added to all build products using |
|
|
`add_project_dependencies()`. This can be useful in several |
|
|
cases: |
|
|
|
|
|
* with special dependencies such as `dependency('threads')` |
|
|
* with system libraries such as `find_library('m')` |
|
|
* with the `include_directories` keyword argument of |
|
|
`declare_dependency()`, to add both source and build |
|
|
directories to the include search path |
|
|
|
|
|
## Coverage targets now respect tool config files |
|
|
|
|
|
gcovr >= 4.2 supports `gcovr.cfg` in the project source root to configure how |
|
|
coverage is generated. If Meson detects that gcovr will load this file, it no |
|
|
longer excludes the `subprojects/` directory from coverage. It's a good default |
|
|
for Meson to guess that projects want to ignore it, but not all projects prefer |
|
|
that and it is assumed that if a gcovr.cfg exists then it will manually |
|
|
include/exclude desired paths. |
|
|
|
|
|
lcov supports `.lcovrc`, but only as a systemwide or user setting. This is |
|
|
non-ideal for projects, so Meson will now detect one in the project source root |
|
|
and, if present, manually tell lcov to use it. |
|
|
|
|
|
## D compiler checks |
|
|
|
|
|
Some compiler checks are implemented for D: |
|
|
- `run` |
|
|
- `sizeof` |
|
|
- `has_header` (to check if a module is present) |
|
|
- `alignment` |
|
|
|
|
|
Example: |
|
|
|
|
|
```meson |
|
|
ptr_size = meson.get_compiler('d').sizeof('void*') |
|
|
``` |
|
|
|
|
|
## Deprecate an option and replace it with a new one |
|
|
|
|
|
The `deprecated` keyword argument can now take the name of a new option |
|
|
that replace this option. In that case, setting a value on the deprecated option |
|
|
will set the value on both the old and new names, assuming they accept the same |
|
|
values. |
|
|
|
|
|
```meson |
|
|
# A boolean option has been replaced by a feature with another name, old true/false values |
|
|
# are accepted by the new option for backward compatibility. |
|
|
option('o1', type: 'boolean', value: 'true', deprecated: 'o2') |
|
|
option('o2', type: 'feature', value: 'enabled', deprecated: {'true': 'enabled', 'false': 'disabled'}) |
|
|
|
|
|
# A project option is replaced by a module option |
|
|
option('o3', type: 'string', value: '', deprecated: 'python.platlibdir') |
|
|
``` |
|
|
|
|
|
## Running Windows executables with Wine in `meson devenv` |
|
|
|
|
|
When cross compiling for Windows, `meson devenv` now sets `WINEPATH` pointing to |
|
|
all directories containing needed DLLs and executables. |
|
|
|
|
|
## Diff files for wraps |
|
|
|
|
|
Wrap files can now define `diff_files`, a list of local patch files in `diff` |
|
|
format. Meson will apply the diff files after extracting or cloning the project, |
|
|
and after applying the overlay archive (`patch_*`). For this feature, the |
|
|
`patch` or `git` command-line tool must be available. |
|
|
|
|
|
## Added preserve_path arg to install_headers |
|
|
|
|
|
The [[install_headers]] function now has an optional argument `preserve_path` |
|
|
that allows installing multi-directory headerfile structures that live |
|
|
alongside sourcecode with a single command. |
|
|
|
|
|
For example, the headerfile structure |
|
|
|
|
|
```meson |
|
|
headers = [ |
|
|
'one.h', |
|
|
'two.h', |
|
|
'alpha/one.h', |
|
|
'alpha/two.h', |
|
|
'alpha/three.h' |
|
|
'beta/one.h' |
|
|
] |
|
|
``` |
|
|
|
|
|
can now be passed to `install_headers(headers, subdir: 'mylib', preserve_path: true)` |
|
|
and the resulting directory tree will look like |
|
|
|
|
|
``` |
|
|
{prefix} |
|
|
└── include |
|
|
└── mylib |
|
|
├── alpha |
|
|
│ ├── one.h |
|
|
│ ├── two.h |
|
|
│ └── three.h |
|
|
├── beta |
|
|
│ └── one.h |
|
|
├── one.h |
|
|
└── two.h |
|
|
``` |
|
|
|
|
|
## JAR Resources |
|
|
|
|
|
The ability to add resources to a JAR has been added. Use the `java_resources` |
|
|
keyword argument. It takes a `structured_src` object. |
|
|
|
|
|
```meson |
|
|
jar( |
|
|
meson.project_name(), |
|
|
sources, |
|
|
main_class: 'com.mesonbuild.Resources', |
|
|
java_resources: structured_sources( |
|
|
files('resources/resource1.txt'), |
|
|
{ |
|
|
'subdir': files('resources/subdir/resource2.txt'), |
|
|
} |
|
|
) |
|
|
) |
|
|
``` |
|
|
|
|
|
To access these resources in your Java application: |
|
|
|
|
|
```java |
|
|
try (InputStreamReader reader = new InputStreamReader( |
|
|
Resources.class.getResourceAsStream("/resource1.txt"), |
|
|
StandardCharsets.UTF_8)) { |
|
|
// ... |
|
|
} |
|
|
|
|
|
try (InputStreamReader reader = new InputStreamReader( |
|
|
Resources.class.getResourceAsStream("/subdir/resource2.txt"), |
|
|
StandardCharsets.UTF_8)) { |
|
|
// ... |
|
|
} |
|
|
``` |
|
|
|
|
|
## Support for mold linker added |
|
|
|
|
|
The high performance linker mold can be selected via `CC_LD` or `CXX_LD` for |
|
|
Clang and GCC >= 12.0.1. |
|
|
|
|
|
## MSVC now sets the __cplusplus #define accurately |
|
|
|
|
|
MSVC will always return `199711L` for `__cplusplus`, even when a newer c++ |
|
|
standard is explicitly requested, unless you pass a specific option to the |
|
|
compiler for MSVC 2017 15.7 and newer. Older versions are unaffected by this. |
|
|
|
|
|
Microsoft's stated rationale is that "a lot of existing code appears to depend |
|
|
on the value of this macro matching 199711L", therefore for compatibility with |
|
|
such (MSVC-only) code they will require opting in to the standards-conformant |
|
|
value. |
|
|
|
|
|
Meson now always sets the option if it is available, as it is unlikely that |
|
|
users want the default behavior, and *impossible* to use the default behavior |
|
|
in cross-platform code (which frequently breaks as soon as the first person |
|
|
tries to compile using MSVC). |
|
|
|
|
|
## Added `debug` function |
|
|
|
|
|
In addition to the `message()`, `warning()` and `error()` functions there is now the |
|
|
`debug()` function to log messages that only end up in the `meson-log.txt` logfile |
|
|
and are not printed to stdout at configure time. |
|
|
|
|
|
## Compiler options can be set per subproject |
|
|
|
|
|
All compiler options can now be set per subproject. See |
|
|
[here](Build-options.md#specifying-options-per-subproject) for details on how |
|
|
the default value is inherited from main project. |
|
|
|
|
|
This is useful for example when the main project requires C++11 but a subproject |
|
|
requires C++14. The `cpp_std` value from subproject's `default_options` is now |
|
|
respected. |
|
|
|
|
|
## Per-subproject languages |
|
|
|
|
|
Subprojects does not inherit languages added by main project or other subprojects |
|
|
any more. This could break subprojects that wants to compile e.g. `.c` files but |
|
|
did not add `c` language, either in `project()` or `add_languages()`, and were |
|
|
relying on the main project to do it for them. |
|
|
|
|
|
## Installed pkgconfig files can now be relocatable |
|
|
|
|
|
The pkgconfig module now has a module option `pkgconfig.relocatable`. |
|
|
When set to `true`, the pkgconfig files generated will have their |
|
|
`prefix` variable set to be relative to their `install_dir`. |
|
|
|
|
|
For example to enable it from the command line run: |
|
|
|
|
|
```sh |
|
|
meson setup builddir -Dpkgconfig.relocatable=true … |
|
|
``` |
|
|
|
|
|
It will only work if the `install_dir` for the generated pkgconfig |
|
|
files are located inside the install prefix of the package. Not doing |
|
|
so will cause an error. |
|
|
|
|
|
This should be useful on Windows or any other platform where |
|
|
relocatable packages are desired. |
|
|
|
|
|
## New prefer_static built-in option |
|
|
|
|
|
Users can now set a boolean, `prefer_static`, that controls whether or not |
|
|
static linking should be tried before shared linking. This option acts as |
|
|
strictly a preference. If the preferred linking method is not successful, |
|
|
then Meson will fallback and try the other linking method. Specifically |
|
|
setting the `static` kwarg in the meson.build will take precedence over |
|
|
the value of `prefer_static` for that specific `dependency` or |
|
|
`find_library` call. |
|
|
|
|
|
## Python extension modules now depend on the python library by default |
|
|
|
|
|
Python extension modules are usually expected to link to the python library |
|
|
and/or its headers in order to build correctly (via the default `embed: false`, |
|
|
which may not actually link to the library itself). This means that every |
|
|
single use of `.extension_module()` needed to include the `dependencies: |
|
|
py_installation.dependency()` kwarg explicitly. |
|
|
|
|
|
In the interest of doing the right thing out of the box, this is now the |
|
|
default for extension modules that don't already include a dependency on |
|
|
python. This is not expected to break anything, because it should always be |
|
|
needed. Nevertheless, `py_installation.dependency().partial_dependency()` will |
|
|
be detected as already included while providing no compile/link args. |
|
|
|
|
|
## Python extension modules now build with hidden visibility |
|
|
|
|
|
Python extension modules are usually expected to only export a single symbol, |
|
|
decorated with the `PyMODINIT_FUNC` macro and providing the module entry point. |
|
|
On versions of python >= 3.9, the python headers contain GNU symbol visibility |
|
|
attributes to mark the init function with default visibility; it is then safe |
|
|
to set the [[shared_module]] inherited kwarg `gnu_symbol_visibility: 'hidden'`. |
|
|
|
|
|
In the interest of doing the right thing out of the box, this is now the |
|
|
default for extension modules for found installations that are new enough to |
|
|
have this set, which is not expected to break anything, but remains possible to |
|
|
set explicitly (in which case that will take precedence). |
|
|
|
|
|
## Added support for multiline fstrings |
|
|
|
|
|
Added support for multiline f-strings which use the same syntax as f-strings |
|
|
for string substitution. |
|
|
|
|
|
```meson |
|
|
x = 'hello' |
|
|
y = 'world' |
|
|
|
|
|
msg = f'''Sending a message... |
|
|
"@x@ @y@" |
|
|
''' |
|
|
``` |
|
|
|
|
|
which produces: |
|
|
|
|
|
``` |
|
|
Sending a message.... |
|
|
|
|
|
"hello world" |
|
|
|
|
|
``` |
|
|
|
|
|
|