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

# New features

Meson 1.11.0 was released on 13 April 2026
## BuildTarget(install_dir) length > 1 replaced with keywords

Build targets previously supported (with limited documentation) passing an array
of more than one element to `install_dir:` (except in some wrappers), and
would map these additional `install_dir`s to extra outputs. This was only used by
Vala, and separate explicit keyword arguments are now available that provide
the same functionality.

Code like this:
```meson
library(
  'foo',
  'foo.vala',
  install : true,
  install_dir : [true, get_option('includedir') / 'foo', true],
)
```

should now be written as the much clearer:

```meson
library(
  'foo',
  'foo.vala',
  install : true,
  install_vala_header : get_option('includedir') / 'foo',
  install_vala_vapi : true,
)
```

Note that the default is `false` for the Vala extra outputs.

## Cargo workspace object

Meson is now able to parse the toplevel `Cargo.toml` file of the
project when the `workspace()` method of the Rust module is called.
This guarantees that features are resolved according to what is
in the `Cargo.toml` file, and in fact enables configuration of
features for the build.

The returned object allows retrieving features and dependencies
for Cargo subprojects, and contains methods to build targets
declared in `Cargo.toml` files.

While Cargo subprojects remain experimental, the Meson project will
try to keep the workspace object reasonably backwards-compatible.

## Cython no longer requires explicitly enabling C or C++

This only provides these languages as an implementation detail of Cython, so
native C/C++ targets cannot be compiled.

## Deduplication of OpenMP linker arguments

Meson now deduplicates linker arguments `-fopenmp` and `-qopenmp`.

## `meson dist` now accepts `-j`/`--num-processes`

`meson dist` now supports a `-j`/`--num-processes` flag to control the number of
parallel processes used during the distribution check (compilation and testing of
the generated package).  The `MESON_NUM_PROCESSES` environment variable is also
honored, consistent with other Meson commands.

## Deprecate `should_fail` and rename it to `expected_fail`, also introduce `expected_exitcode`

In 1.11.0 `should_fail` has been renamed to `expected_fail`.

Before 1.11.0, there was no way to positively test a command/binary returning error/non-zero exit code when the used protocol was set to exitcode, so `expected_exitcode` has been introduced to achieve this. Do note that if the exitcode does not match the expected value, GNU skip and exit codes are still valid and the test result may be skip or error.

## The external_project module uses the cygpath command to convert paths

In previous versions, the external_project module on Windows used a Windows-style path (e.g., `C:/path/to/configure`) to execute the configure file, and a relative path from the drive root (e.g., `/path/to/prefix`) as the installation prefix.
However, since configure scripts are typically intended to be run in a POSIX-like environment (MSYS2, Cygwin, or GitBash), these paths were incompatible with some configure scripts.

The external_project module now uses the `cygpath` command to convert the configure command path and prefix to Unix-style paths (e.g., `/c/path/to/configure` for MSYS2 and `/cygdrive/c/path/to/configure` for Cygwin).
If the `cygpath` command is not found in the PATH, it will fall back to the previous behavior.

## install_man and install_headers: add support for install_tag kwarg

`install_man` and `install_headers` now support the `install_tag` keyword argument,
allowing selection of installed files via `meson install --tags`. Previously,
`install_man` always used the `man` tag and `install_headers` always used the
`devel` tag, with no way to override them.

## Added `link_early_args` to targets performing linking

Options passed to the linker using the `link_args` keyword argument
get placed on the command line after all objects and libraries. Some
linker options, like `-u` or `--defsym`, are only useful if placed
before objects and libraries as they control how the linker
manipulates those.

The new `link_early_args` keyword argument passes linker options which
are inserted into the command line before any objects and libraries,
allowing applications to use these kinds of linker options with Meson.

This is currently only supported when using the `ninja` backend.

## Machine files now expand `~` as the user's home directory

A new constant `~` has been added which can be used in machine files (native
and cross files) to refer to the user's home directory. This is useful for
specifying paths to SDKs and toolchains that are commonly installed into `~`,
such as Qt, the Android SDK/NDK, or user-installed frameworks on macOS:

```ini
[constants]
toolchain = ~ / 'Android/sdk/ndk/27.1.12297006/toolchains/llvm/prebuilt/linux-x86_64'

[binaries]
c = toolchain / 'bin/clang'
cpp = toolchain / 'bin/clang++'
ar = toolchain / 'bin/llvm-ar'
```

Note that `~` can be used anywhere in the machine file. In the above example,
the purpose of defining a new constant called `toolchain` is to not have to
repeat yourself when using the path multiple times.

## `meson format` file sorting is now disabled by default and uses natural sorting

The `sort_files` option to `meson format`, which sorts the arguments of
`files()` invocations, is now disabled by default.

If the `sort_files` option is enabled, `meson format` now sorts `files()`
arguments [naturally](Style-guide.md#sorting-source-paths) rather than
alphabetically.

## `-Db_lto` and `-Db_pgo` now supported for MSVC

`-Db_lto` is now supported for MSVC's `/LTCG`, as is `-Db_lto_mode=thin`
for `/LTCG:INCREMENTAL`. `-Db_pgo` is also supported, and should be used
alongside `-Db_lto=true`.

## Last major version supporting Python 3.7, 3.8, and 3.9

Python older than 3.10 is now EOL, and Meson will drop support for these
versions in the next major release, and will freely use features from 3.8, 3.9
and 3.10. Support for these versions will remain for the 1.11.x series.

## Python extension modules default to C ABI for Rust

`py.extension_module()` now defaults `rust_abi` to `'c'`, so that Rust
extension modules produce a `cdylib` instead of a `dylib`.  This is the
correct crate type for Python extension modules written in Rust, and
previously had to be specified manually via `rust_crate_type: 'cdylib'`
or `rust_abi: 'c'`.

## Meson now defines `QT_DEBUG` or `QT_NO_DEBUG` depending on build type

When using the `qt` Meson modules, the `QT_DEBUG` or `QT_NO_DEBUG` preprocessor macro is now set depending on the value of the `debug` built-in Meson option.
This mimics the behavior of `qmake`, and is expected by the `<QtGlobal>` header.

## `compiler_target()` method in the Rust module

A `compiler_target()` method that returns the Rust target triple has been added to
the `rust` module. This method can be useful when converting build scripts
making use of Cargo's `TARGET` and `HOST` environment variables to
Meson.

## Change to handling of linker arguments for Rust

Since the Rust compiler integrates the compiler and linker phase, previous
Meson versions did not obey `link_args`, `add_project_link_arguments`
or `add_global_link_arguments`.

Starting in this version, `add_project_link_arguments()`,
`add_global_link_arguments()`, and the `link_args` keyword argument are
supported for Rust.  They wrap the arguments with `-Clink-arg=` when
invoking rustc, and are only included when creating binary or shared
library crates.

Likewise, methods such as `has_link_argument()` now wrap the arguments
being tested with `-Clink-arg=`.

## XC32 support now aware of v5.00 features

XC32 features introduced in v5.00 can now be used. This includes
support for LTO auto and the C2x and CPP23 standards.

## windows.compile_resources now detects header changes with rc.exe

The `rc.exe` resource compiler neither provides *depfile* support nor
allows showing includes, as is possible with C or C++ compilers.
Therefore, changes to files included by the `.rc` file did not trigger
recompilation of the resource file.

A workaround was added to Meson by calling the preprocessor on the
`.rc` file to display the included headers and allow ninja to record them
as dependencies.

## Added `implicit_include_directories` argument to `windows.compile_resources`

[Windows](Windows-module.md) module [compile_resources](Windows-module.md#compile_resources)
now has an `implicit_include_directories` keyword argument to automatically
add current build and source directories to the included paths when compiling
a resource.

