|
|
|
---
|
|
|
|
title: Release 0.50.0
|
|
|
|
short-description: Release notes for 0.50.0
|
|
|
|
...
|
|
|
|
|
|
|
|
# New features
|
|
|
|
|
|
|
|
## Added `cmake_module_path` and `cmake_args` to dependency
|
|
|
|
|
|
|
|
The CMake dependency backend can now make use of existing `Find<name>.cmake`
|
|
|
|
files by setting the `CMAKE_MODULE_PATH` with the new `dependency()` property
|
|
|
|
`cmake_module_path`. The paths given to `cmake_module_path` should be relative
|
|
|
|
to the project source directory.
|
|
|
|
|
|
|
|
Furthermore the property `cmake_args` was added to give CMake additional
|
|
|
|
parameters.
|
|
|
|
|
|
|
|
## Added PGI compiler support
|
|
|
|
|
|
|
|
Nvidia / PGI C, C++ and Fortran
|
|
|
|
[no-cost](https://www.pgroup.com/products/community.htm) compilers are
|
|
|
|
now supported. They have been tested on Linux so far.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Fortran Coarray
|
|
|
|
|
|
|
|
Fortran 2008 / 2018 coarray support was added via `dependency('coarray')`
|
|
|
|
|
|
|
|
## Libdir defaults to `lib` when cross compiling
|
|
|
|
|
|
|
|
Previously `libdir` defaulted to the value of the build machine such
|
|
|
|
as `lib/x86_64-linux-gnu`, which is almost always incorrect when cross
|
|
|
|
compiling. It now defaults to plain `lib` when cross compiling. Native
|
|
|
|
builds remain unchanged and will point to the current system's library
|
|
|
|
dir.
|
|
|
|
|
|
|
|
## Native and Cross File Paths and Directories
|
|
|
|
|
|
|
|
A new `[paths]` section has been added to native and cross files. This
|
|
|
|
can be used to set paths such a prefix and libdir in a persistent way.
|
|
|
|
|
|
|
|
## Add warning_level 0 option
|
|
|
|
|
|
|
|
Adds support for a warning level 0 which does not enable any static
|
|
|
|
analysis checks from the compiler
|
|
|
|
|
|
|
|
## A builtin target to run clang-format
|
|
|
|
|
|
|
|
If you have `clang-format` installed and there is a `.clang-format`
|
|
|
|
file in the root of your master project, Meson will generate a run
|
|
|
|
target called `clang-format` so you can reformat all files with one
|
|
|
|
command:
|
|
|
|
|
|
|
|
```meson
|
|
|
|
ninja clang-format
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Added `.path()` method to object returned by `python.find_installation()`
|
|
|
|
|
|
|
|
`ExternalProgram` objects as well as the object returned by the
|
|
|
|
`python3` module provide this method, but the new `python` module did
|
|
|
|
not.
|
|
|
|
|
|
|
|
## Fix ninja console log from generators with multiple output nodes
|
|
|
|
|
|
|
|
This resolves [issue #4760](https://github.com/mesonbuild/meson/issues/4760)
|
|
|
|
where a generator with multiple output nodes printed an empty string to the console
|
|
|
|
|
|
|
|
## `introspect --buildoptions` can now be used without configured build directory
|
|
|
|
|
|
|
|
It is now possible to run `meson introspect --buildoptions /path/to/meson.build`
|
|
|
|
without a configured build directory.
|
|
|
|
|
|
|
|
Running `--buildoptions` without a build directory produces the same
|
|
|
|
output as running it with a freshly configured build directory.
|
|
|
|
|
|
|
|
However, this behavior is not guaranteed if subprojects are
|
|
|
|
present. Due to internal limitations all subprojects are processed
|
|
|
|
even if they are never used in a real meson run. Because of this
|
|
|
|
options for the subprojects can differ.
|
|
|
|
|
|
|
|
## `include_directories` accepts a string
|
|
|
|
|
|
|
|
The `include_directories` keyword argument now accepts plain strings
|
|
|
|
rather than an include directory object. Meson will transparently
|
|
|
|
expand it so that a declaration like this:
|
|
|
|
|
|
|
|
```meson
|
|
|
|
executable(..., include_directories: 'foo')
|
|
|
|
```
|
|
|
|
|
|
|
|
Is equivalent to this:
|
|
|
|
|
|
|
|
```meson
|
|
|
|
foo_inc = include_directories('foo')
|
|
|
|
executable(..., include_directories: foo_inc)
|
|
|
|
```
|
|
|
|
|
|
|
|
## Fortran submodule support
|
|
|
|
|
|
|
|
Initial support for Fortran `submodule` was added, where the submodule is in
|
|
|
|
the same or different file than the parent `module`.
|
|
|
|
The submodule hierarchy specified in the source Fortran code `submodule`
|
|
|
|
statements are used by Meson to resolve source file dependencies.
|
|
|
|
For example:
|
|
|
|
|
|
|
|
```fortran
|
|
|
|
submodule (ancestor:parent) child
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Add `subproject_dir` to `--projectinfo` introspection output
|
|
|
|
|
|
|
|
This allows applications interfacing with Meson (such as IDEs) to know about
|
|
|
|
an overridden subproject directory.
|
|
|
|
|
|
|
|
## Find library with its headers
|
|
|
|
|
|
|
|
The `find_library()` method can now also verify if the library's headers are
|
|
|
|
found in a single call, using the `has_header()` method internally.
|
|
|
|
|
|
|
|
```meson
|
|
|
|
# Aborts if the 'z' library is found but not its header file
|
|
|
|
zlib = find_library('z', has_headers : 'zlib.h')
|
|
|
|
# Returns not-found if the 'z' library is found but not its header file
|
|
|
|
zlib = find_library('z', has_headers : 'zlib.h', required : false)
|
|
|
|
```
|
|
|
|
|
|
|
|
Any keyword argument with the `header_` prefix passed to `find_library()` will
|
|
|
|
be passed to the `has_header()` method with the prefix removed.
|
|
|
|
|
|
|
|
```meson
|
|
|
|
libfoo = find_library('foo',
|
|
|
|
has_headers : ['foo.h', 'bar.h'],
|
|
|
|
header_prefix : '#include <baz.h>',
|
|
|
|
header_include_directories : include_directories('.'))
|
|
|
|
```
|
|
|
|
|
|
|
|
## NetCDF
|
|
|
|
|
|
|
|
NetCDF support for C, C++ and Fortran is added via pkg-config.
|
|
|
|
|
|
|
|
## Added the Flang compiler
|
|
|
|
|
|
|
|
[Flang](https://github.com/flang-compiler/flang/releases) Fortran
|
|
|
|
compiler support was added. As with other Fortran compilers, flang is
|
|
|
|
specified using `FC=flang meson ..` or similar.
|
|
|
|
|
|
|
|
## New `not_found_message` for `dependency()`
|
|
|
|
|
|
|
|
You can now specify a `not_found_message` that will be printed if the
|
|
|
|
specified dependency was not found. The point is to convert constructs
|
|
|
|
that look like this:
|
|
|
|
|
|
|
|
```meson
|
|
|
|
d = dependency('something', required: false)
|
|
|
|
if not d.found()
|
|
|
|
message('Will not be able to do something.')
|
|
|
|
endif
|
|
|
|
```
|
|
|
|
|
|
|
|
Into this:
|
|
|
|
|
|
|
|
```meson
|
|
|
|
d = dependency('something',
|
|
|
|
required: false,
|
|
|
|
not_found_message: 'Will not be able to do something.')
|
|
|
|
```
|
|
|
|
|
|
|
|
Or constructs like this:
|
|
|
|
|
|
|
|
```meson
|
|
|
|
d = dependency('something', required: false)
|
|
|
|
if not d.found()
|
|
|
|
error('Install something by doing XYZ.')
|
|
|
|
endif
|
|
|
|
```
|
|
|
|
|
|
|
|
into this:
|
|
|
|
|
|
|
|
```meson
|
|
|
|
d = dependency('something',
|
|
|
|
not_found_message: 'Install something by doing XYZ.')
|
|
|
|
```
|
|
|
|
|
|
|
|
Which works, because the default value of `required` is `true`.
|
|
|
|
|
|
|
|
## Cuda support
|
|
|
|
|
|
|
|
Compiling Cuda source code is now supported, though only with the
|
|
|
|
Ninja backend. This has been tested only on Linux for now.
|
|
|
|
|
|
|
|
Because NVidia's Cuda compiler does not produce `.d` dependency files,
|
|
|
|
dependency tracking does not work.
|
|
|
|
|
|
|
|
## `run_command()` accepts `env` kwarg
|
|
|
|
|
|
|
|
You can pass [`environment`](Reference-manual.md#environment-object)
|
|
|
|
object to [`run_command`](Reference-manual.md#run-command), just
|
|
|
|
like to `test`:
|
|
|
|
|
|
|
|
```meson
|
|
|
|
env = environment()
|
|
|
|
env.set('FOO', 'bar')
|
|
|
|
run_command('command', 'arg1', 'arg2', env: env)
|
|
|
|
```
|
|
|
|
|
|
|
|
## `extract_objects:` accepts `File` arguments
|
|
|
|
|
|
|
|
The `extract_objects` function now supports File objects to tell it
|
|
|
|
what to extract. Previously, file paths could only be passed as strings.
|
|
|
|
|
|
|
|
## Changed the JSON format of the introspection
|
|
|
|
|
|
|
|
All paths used in the meson introspection JSON format are now absolute. This
|
|
|
|
affects the `filename` key in the targets introspection and the output of
|
|
|
|
`--buildsystem-files`.
|
|
|
|
|
|
|
|
Furthermore, the `filename` and `install_filename` keys in the targets
|
|
|
|
introspection are now lists of strings with identical length.
|
|
|
|
|
|
|
|
The `--target-files` option is now deprecated, since the same information
|
|
|
|
can be acquired from the `--tragets` introspection API.
|
|
|
|
|
|
|
|
## Meson file rewriter
|
|
|
|
|
|
|
|
This release adds the functionality to perform some basic modification
|
|
|
|
on the `meson.build` files from the command line. The currently
|
|
|
|
supported operations are:
|
|
|
|
|
|
|
|
- For build targets:
|
|
|
|
- Add/Remove source files
|
|
|
|
- Add/Remove targets
|
|
|
|
- Modify a select set of kwargs
|
|
|
|
- Print some JSON information
|
|
|
|
- For dependencies:
|
|
|
|
- Modify a select set of kwargs
|
|
|
|
- For the project function:
|
|
|
|
- Modify a select set of kwargs
|
|
|
|
- Modify the default options list
|
|
|
|
|
|
|
|
For more information see the rewriter documentation.
|
|
|
|
|
|
|
|
## `introspect --scan-dependencies` can now be used to scan for dependencies used in a project
|
|
|
|
|
|
|
|
It is now possible to run `meson introspect --scan-dependencies
|
|
|
|
/path/to/meson.build` without a configured build directory to scan for
|
|
|
|
dependencies.
|
|
|
|
|
|
|
|
The output format is as follows:
|
|
|
|
|
|
|
|
```json
|
|
|
|
[
|
|
|
|
{
|
|
|
|
"name": "The name of the dependency",
|
|
|
|
"required": true,
|
|
|
|
"conditional": false,
|
|
|
|
"has_fallback": false
|
|
|
|
}
|
|
|
|
]
|
|
|
|
```
|
|
|
|
|
|
|
|
The `required` keyword specifies whether the dependency is marked as required
|
|
|
|
in the `meson.build` (all dependencies are required by default). The
|
|
|
|
`conditional` key indicates whether the `dependency()` function was called
|
|
|
|
inside a conditional block. In a real meson run these dependencies might not be
|
|
|
|
used, thus they _may_ not be required, even if the `required` key is set. The
|
|
|
|
`has_fallback` key just indicates whether a fallback was directly set in the
|
|
|
|
`dependency()` function.
|
|
|
|
|
|
|
|
## `introspect --targets` can now be used without configured build directory
|
|
|
|
|
|
|
|
It is now possible to run `meson introspect --targets /path/to/meson.build`
|
|
|
|
without a configured build directory.
|
|
|
|
|
|
|
|
The generated output is similar to running the introspection with a build
|
|
|
|
directory. However, there are some key differences:
|
|
|
|
|
|
|
|
- The paths in `filename` now are _relative_ to the future build directory
|
|
|
|
- The `install_filename` key is completely missing
|
|
|
|
- There is only one entry in `target_sources`:
|
|
|
|
- With the language set to `unknown`
|
|
|
|
- Empty lists for `compiler` and `parameters` and `generated_sources`
|
|
|
|
- The `sources` list _should_ contain all sources of the target
|
|
|
|
|
|
|
|
There is no guarantee that the sources list in `target_sources` is correct.
|
|
|
|
There might be differences, due to internal limitations. It is also not
|
|
|
|
guaranteed that all targets will be listed in the output. It might even be
|
|
|
|
possible that targets are listed, which won't exist when meson is run normally.
|
|
|
|
This can happen if a target is defined inside an if statement.
|
|
|
|
Use this feature with care.
|
|
|
|
|
|
|
|
## Added option to introspect multiple parameters at once
|
|
|
|
|
|
|
|
Meson introspect can now print the results of multiple introspection
|
|
|
|
commands in a single call. The results are then printed as a single JSON
|
|
|
|
object.
|
|
|
|
|
|
|
|
The format for a single command was not changed to keep backward
|
|
|
|
compatibility.
|
|
|
|
|
|
|
|
Furthermore the option `-a,--all`, `-i,--indent` and `-f,--force-object-output`
|
|
|
|
were added to print all introspection information in one go, format the
|
|
|
|
JSON output (the default is still compact JSON) and force use the new
|
|
|
|
output format, even if only one introspection command was given.
|
|
|
|
|
|
|
|
A complete introspection dump is also stored in the `meson-info`
|
|
|
|
directory. This dump will be (re)generated each time meson updates the
|
|
|
|
configuration of the build directory.
|
|
|
|
|
|
|
|
Additionlly the format of `meson introspect target` was changed:
|
|
|
|
|
|
|
|
- New: the `sources` key. It stores the source files of a target and their compiler parameters.
|
|
|
|
- New: the `defined_in` key. It stores the meson file where a target is defined
|
|
|
|
- New: the `subproject` key. It stores the name of the subproject where a target is defined.
|
|
|
|
- Added new target types (`jar`, `shared module`).
|
|
|
|
|
|
|
|
## `meson configure` can now print the default options of an unconfigured project
|
|
|
|
|
|
|
|
With this release, it is also possible to get a list of all build options
|
|
|
|
by invoking `meson configure` with the project source directory or
|
|
|
|
the path to the root `meson.build`. In this case, meson will print the
|
|
|
|
default values of all options.
|
|
|
|
|
|
|
|
## HDF5
|
|
|
|
|
|
|
|
HDF5 support is added via pkg-config.
|
|
|
|
|
|
|
|
## Added the `meson-info.json` introspection file
|
|
|
|
|
|
|
|
Meson now generates a `meson-info.json` file in the `meson-info` directory
|
|
|
|
to provide introspection information about the latest meson run. This file
|
|
|
|
is updated when the build configuration is changed and the build files are
|
|
|
|
(re)generated.
|
|
|
|
|
|
|
|
## New kwarg `install:` for `configure_file()`
|
|
|
|
|
|
|
|
Previously when using `configure_file()`, you could install the outputted file
|
|
|
|
by setting the `install_dir:` keyword argument. Now, there is an explicit kwarg
|
|
|
|
`install:` to enable/disable it. Omitting it will maintain the old behaviour.
|