| --- |
| 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" |
| |
| ``` |
| |