---
title: Release 0.53.0
short-description: Release notes for 0.53.0
...

# New features

## A new module for filesystem operations

The new `fs` module can be used to examine the contents of the current
file system.

```meson
fs = import('fs')
assert(fs.exists('important_file'),
       'The important file is missing.')
```

## meson dist --include-subprojects

`meson dist` command line now gained `--include-subprojects` command
line option. When enabled, the source tree of all subprojects used by
the current build will also be included in the final tarball. This is
useful to distribute self contained tarball that can be built offline
(i.e. `--wrap-mode=nodownload`).

## Added new Meson templates for `Dlang`, `Rust`, `Objective-C`

Meson now ships with predefined project templates for `Dlang`,
`Fortran`, `Rust`, `Objective-C`, and by passing the associated flags `d`,
`fortran`, `rust`, `objc` to `meson init --language`.

## Add a new summary() function

A new function [`summary()`](Reference-manual.md#summary) has been
added to summarize build configuration at the end of the build
process.

Example:
```meson
project('My Project', version : '1.0')
summary({'bindir': get_option('bindir'),
         'libdir': get_option('libdir'),
         'datadir': get_option('datadir'),
        }, section: 'Directories')
summary({'Some boolean': false,
         'Another boolean': true,
         'Some string': 'Hello World',
         'A list': ['string', 1, true],
        }, section: 'Configuration')
```

Output:
```
My Project 1.0

  Directories
             prefix: /opt/gnome
             bindir: bin
             libdir: lib/x86_64-linux-gnu
            datadir: share

  Configuration
       Some boolean: False
    Another boolean: True
        Some string: Hello World
             A list: string
                     1
                     True
```

## Generic Overrider for Dynamic Linker selection

Previous to Meson 0.52.0 you set the dynamic linker using compiler
specific flags passed via language flags and hoped things worked out.
In version 0.52.0 Meson started detecting the linker and making
intelligent decisions about using it. Unfortunately this broke
choosing a non-default linker.

Now there is a generic mechanism for doing this. In 0.53.0, you can
use the `LD` environment variable. **In 0.53.1** this was changed to
`<compiler_variable>_LD`, such as `CC_LD`, `CXX_LD`, `D_LD`, etc due
to regressions. The usual Meson [environment variable
rules](https://mesonbuild.com/Running-Meson.html#environment-variables)
apply. Alternatively, you can add the following to a cross or native
file:

In 0.53.0:

```ini
[binaries]
ld = 'gold'
```

**In 0.53.1 or newer**:

```ini
[binaries]
c = 'gcc'
c_ld = 'gold'
```

```ini
[binaries]
c = 'clang'
c_ld = 'lld'
```

And Meson will select the linker if possible.

## `fortran_std` option

**new in 0.53.0** Akin to the `c_std` and `cpp_std` options, the
`fortran_std` option sets Fortran compilers to warn or error on
non-Fortran standard code. Only the Gfortran and Intel Fortran
compilers have support for this option. Other Fortran compilers ignore
the `fortran_std` option.

Supported values for `fortran_std` include:

* `legacy` for non-conforming code--this is especially important for Gfortran, which by default errors on old non-compliant Fortran code
* `f95` for Fortran 95 compliant code.
* `f2003` for Fortran 2003 compliant code.
* `f2008` for Fortran 2008 compliant code.
* `f2018` for Fortran 2018 compliant code.

## python.dependency() embed kwarg

Added the `embed` kwarg to the python module dependency function to
select the python library that can be used to embed python into an
application.

## Scalapack

added in **0.53.0**:

```meson
scalapack = dependency('scalapack')
```

Historically and through today, typical Scalapack setups have broken
and incomplete pkg-config or FindScalapack.cmake. Meson handles
finding Scalapack on setups including:

* Linux: Intel MKL or OpenMPI + Netlib
* MacOS: Intel MKL or OpenMPI + Netlib
* Windows: Intel MKL (OpenMPI not available on Windows)

## Search directories for `find_program()`

It is now possible to give a list of absolute paths where `find_program()` should
also search, using the `dirs` keyword argument.

For example on Linux `/sbin` and `/usr/sbin` are not always in the `$PATH`:
```meson
prog = find_program('mytool', dirs : ['/usr/sbin', '/sbin'])
```

## Source tags targets

When the respective tools are available, 'ctags', 'TAGS' and 'cscope'
targets will be generated by Meson, unless you have defined your own.

## Dictionary entry using string variable as key

Keys can now be any expression evaluating to a string value, not limited
to string literals any more.
```meson
d = {'a' + 'b' : 42}
k = 'cd'
d += {k : 43}
```

## Improved CMake subprojects support

With this release even more CMake projects are supported via [CMake
subprojects](CMake-module.md#cmake-subprojects) due to these internal
improvements:

- Use the CMake file API for CMake >=3.14
- Handle the explicit dependencies via `add_dependency`
- Basic support for `add_custom_target`
- Improved `add_custom_command` support
- Object library support on Windows

## compiler.get_linker_id()

since 0.53.0, `compiler.get_linker_id()` allows retrieving a lowercase
name for the linker. Since each compiler family can typically use a
variety of linkers depending on operating system, this helps users
define logic for corner cases not otherwise easily handled.

## CUDA dependency

Native support for compiling and linking against the CUDA Toolkit
using the `dependency` function:

```meson
project('CUDA test', 'cpp', meson_version: '>= 0.53.0')
exe = executable('prog', 'prog.cc', dependencies: dependency('cuda'))
```

See [the CUDA dependency](Dependencies.md#cuda) for more information.

## Added global option to disable C++ RTTI

The new boolean option is called `cpp_rtti`.

## Introspection API changes

dependencies (--dependencies, intro-dependencies.json):
- added the `version` key

scanning dependencies (--scan-dependencies):
- added the `version` key containing the required dependency version

tests and benchmarks (--tests, --benchmarks, intro-tests.json,
intro-benchmarks.json):
- added the `protocol` key
