| --- |
| 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. |