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

# New features

Meson 1.5.0 was released on 10 July 2024
## Support for `bztar` in `meson dist`

The `bztar` format is now supported in `meson dist`. This format is also known
as `bzip2`.

## Cargo dependencies names now include the API version

Cargo dependencies names are now in the format `<package_name>-<version>-rs`:
- `package_name` is defined in `[package] name = ...` section of the `Cargo.toml`.
- `version` is the API version deduced from `[package] version = ...` as follow:
  * `x.y.z` -> 'x'
  * `0.x.y` -> '0.x'
  * `0.0.x` -> '0'
  It allows to make different dependencies for incompatible versions of the same
  crate.
- `-rs` suffix is added to distinguish from regular system dependencies, for
  example `gstreamer-1.0` is a system pkg-config dependency and `gstreamer-0.22-rs`
  is a Cargo dependency.

That means the `.wrap` file should have `dependency_names = foo-1-rs` in their
`[provide]` section when `Cargo.toml` has package name `foo` and version `1.2`.

This is a breaking change (Cargo subprojects are still experimental), previous
versions were using `<package_name>-rs` format.

## Added support `Cargo.lock` file

When a (sub)project has a `Cargo.lock` file at its root, it is loaded to provide
an automatic fallback for dependencies it defines, fetching code from
https://crates.io or git. This is identical as providing `subprojects/*.wrap`,
see [cargo wraps](Wrap-dependency-system-manual.md#cargo-wraps) dependency naming convention.

## Meson now propagates its build type to CMake

When the CMake build type variable, `CMAKE_BUILD_TYPE`, is not set via the
`add_cmake_defines` method of the [`cmake options` object](CMake-module.md#cmake-options-object),
it is inferred from the [Meson build type](Builtin-options.md#details-for-buildtype).
Build types of the two build systems do not match perfectly. The mapping from
Meson build type to CMake build type is as follows:

- `debug` -> `Debug`
- `debugoptimized` -> `RelWithDebInfo`
- `release` -> `Release`
- `minsize` -> `MinSizeRel`

No CMake build type is set for the `plain` Meson build type. The inferred CMake
build type overrides any `CMAKE_BUILD_TYPE` environment variable.

## compiler.run() method is now available for all languages

It used to be only implemented for C-like and D languages, but it is now available
for all languages.

## dependencies created by compiler.find_library implement the `name()` method

Previously, for a [[@dep]] that might be returned by either [[dependency]] or
[[compiler.find_library]], the method might or might not exist with no way
of telling.

## New version_argument kwarg for find_program

When finding an external program with `find_program`, the `version_argument`
can be used to override the default `--version` argument when trying to parse
the version of the program.

For example, if the following is used:
```meson
foo = find_program('foo', version_argument: '-version')
```

meson will internally run `foo -version` when trying to find the version of `foo`.

## Meson configure handles changes to options in more cases

Meson configure now correctly handles updates to the options file without a full
reconfigure. This allows making a change to the `meson.options` or
`meson_options.txt` file without a reconfigure.

For example, this now works:
```sh
meson setup builddir
git pull
meson configure builddir -Doption-added-by-pull=value
```

## New meson format command

This command is similar to `muon fmt` and allows to format a `meson.build`
document.

## Added support for GCC's `null_terminated_string_arg` function attribute

You can now check if a compiler support the `null_terminated_string_arg`
function attribute via the `has_function_attribute()` method on the
[[@compiler]] object.

```meson
cc = meson.get_compiler('c')

if cc.has_function_attribute('null_terminated_string_arg')
  # We have it...
endif
```

## A new dependency for ObjFW is now supported

For example, you can create a simple application written using ObjFW like this:

```meson
project('SimpleApp', 'objc')

objfw_dep = dependency('objfw', version: '>= 1.0')

executable('SimpleApp', 'SimpleApp.m',
  dependencies: [objfw_dep])
```

Modules are also supported. A test case using ObjFWTest can be created like
this:

```meson
project('Tests', 'objc')

objfwtest_dep = dependency('objfw', version: '>= 1.1', modules: ['ObjFWTest'])

executable('Tests', ['FooTest.m', 'BarTest.m'],
  dependencies: [objfwtest_dep])
```

## Support of indexed `@PLAINNAME@` and `@BASENAME@`

In `custom_target()` and `configure_file()` with multiple inputs,
it is now possible to specify index for `@PLAINNAME@` and `@BASENAME@`
macros in `output`:
```
custom_target('target_name',
  output: '@PLAINNAME0@.dl',
  input: [dep1, dep2],
  command: cmd)
```

## Required kwarg on more `compiler` methods

The following `compiler` methods now support the `required` keyword argument:

- `compiler.compiles()`
- `compiler.links()`
- `compiler.runs()`

```meson
cc.compiles(valid, name: 'valid', required : true)
cc.links(valid, name: 'valid', required : true)
cc.run(valid, name: 'valid', required : true)

assert(not cc.compiles(valid, name: 'valid', required : opt))
assert(not cc.links(valid, name: 'valid', required : opt))
res = cc.run(valid, name: 'valid', required : opt)
assert(res.compiled())
assert(res.returncode() == 0)
assert(res.stdout() == '')
assert(res.stderr() == '')
```

## The Meson test program supports a new "--interactive" argument

`meson test --interactive` invokes tests with stdout, stdin and stderr
connected directly to the calling terminal. This can be useful when running
integration tests that run in containers or virtual machines which can spawn a
debug shell if a test fails.

## meson test now sets the `MESON_TEST_ITERATION` environment variable

`meson test` will now set the `MESON_TEST_ITERATION` environment variable to the
current iteration of the test. This will always be `1` unless `--repeat` is used
to run the same test multiple times.

## The Meson test program supports a new "--max-lines" argument

By default `meson test` only shows the last 100 lines of test output from tests
that produce large amounts of output. This default can now be changed with the
new `--max-lines` option. For example, `--max-lines=1000` will increase the
maximum number of log output lines from 100 to 1000.

## Basic support for TI Arm Clang (tiarmclang)

Support for TI's newer [Clang-based ARM toolchain](https://www.ti.com/tool/ARM-CGT).

## Support for Texas Instruments C6000 C/C++ compiler

Meson now supports the TI C6000 C/C++ compiler use for the C6000 cpu family.
The example cross file is available in `cross/ti-c6000.txt`.

## Wayland stable protocols can be versioned

The wayland module now accepts a version number for stable protocols.

```meson
wl_mod = import('unstable-wayland')

wl_mod.find_protocol(
  'linux-dmabuf',
  state: 'stable'
  version: 1
)
```

