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

# New features

## Gettext targets are ignored if `gettext` is not installed

Previously the `i18n` module has errored out when `gettext` tools are
not installed on the system. Starting with this version they will
become no-ops instead. This makes it easier to build projects on
minimal environments (such as when bootstrapping) that do not have
translation tools installed.

## Support taking environment values from a dictionary

`environment()` now accepts a dictionary as first argument.  If
provided, each key/value pair is added into the `environment_object`
as if `set()` method was called for each of them.

On the various functions that take an `env:` keyword argument, you may
now give a dictionary.

## alias_target

``` meson
runtarget alias_target(target_name, dep1, ...)
```

This function creates a new top-level target. Like all top-level targets, this
integrates with the selected backend. For instance, with Ninja you can
run it as `ninja target_name`. This is a dummy target that does not execute any
command, but ensures that all dependencies are built. Dependencies can be any
build target (e.g. return value of executable(), custom_target(), etc)


## Enhancements to the pkg_config_path argument

Setting sys_root in the [properties] section of your cross file will now set
PKG_CONFIG_SYSROOT_DIR automatically for host system dependencies when
cross compiling.

## The meson test program now accepts an additional "--gdb-path" argument to specify the GDB binary

`meson test --gdb testname` invokes GDB with the specific test case. However, sometimes GDB is not in the path or a GDB replacement is wanted.
Therefore, a `--gdb-path` argument was added to specify which binary is executed (per default `gdb`):

```console
$ meson test --gdb --gdb-path /my/special/location/for/gdb testname
$ meson test --gdb --gdb-path cgdb testname
```

## Better support for illumos and Solaris

illumos (and hopefully Solaris) support has been dramatically improved, and one
can reasonably expect projects to compile.

## Splitting of Compiler.get_function_attribute('visibility')

On macOS there is no `protected` visibility, which results in the visbility
check always failing. 0.52.0 introduces two changes to improve this situation:

1. the "visibility" check no longer includes "protected"
2. a new set of "split" checks are introduced which check for a single
   attribute instead of all attributes.

These new attributes are:
* visibility:default
* visibility:hidden
* visibility:internal
* visibility:protected

## Clang-tidy target

If `clang-tidy` is installed and the project's source root contains a
`.clang-tidy` (or `_clang-tidy`) file, Meson will automatically define
a `clang-tidy` target that runs Clang-Tidy on all source files.

If you have defined your own `clang-tidy` target, Meson will not
generate its own target.

## Add blocks dependency

Add `dependency('blocks')` to use the Clang blocks extension.

## Meson's builtin b_lundef is now supported on macOS

This has always been possible, but there are some addtional restrictions on
macOS (mainly do to Apple only features). With the linker internal
re-architecture this has become possible

## Compiler and dynamic linker representation split

0.52.0 inclues a massive refactor of the representaitons of compilers to
tease apart the representations of compilers and dynamic linkers (ld). This
fixes a number of compiler/linker combinations. In particular this fixes
use GCC and vanilla clang on macOS.

## Add `depth` option to `wrap-git`

To allow shallow cloning, an option `depth` has been added to `wrap-git`.
This applies recursively to submodules when `clone-recursive` is set to `true`.

Note that the git server may have to be configured to support shallow cloning
not only for branches but also for tags.

## Enhancements to the source_set module

`SourceSet` objects now provide the `all_dependencies()` method, that
complement the existing `all_sources()` method.

## added `--only test(s)` option to run_project_tests.py

Individual tests or a list of tests from run_project_tests.py can be selected like:
```
python run_project_tests.py --only fortran

python run_project_tests.py --only fortran python3
```

This assists Meson development by only running the tests for the portion of Meson being worked on during local development.

## Experimental Webassembly support via Emscripten

Meson now supports compiling code to Webassembly using the Emscripten
compiler. As with most things regarding Webassembly, this support is
subject to change.

## Version check in `find_program()`

A new `version` keyword argument has been added to `find_program` to specify
the required version. See [`dependency()`](#dependency) for argument format.
The version of the program is determined by running `program_name --version`
command. If stdout is empty it fallbacks to stderr. If the output contains more
text than simply a version number, only the first occurence of numbers separated
by dots is kept. If the output is more complicated than that, the version
checking will have to be done manually using [`run_command()`](#run_command).

## Added `vs_module_defs` to `shared_module()`

Like `shared_library()`, `shared_module()` now accepts
`vs_module_defs` argument for controlling symbol exports, etc.

## Improved support for static libraries

Static libraries had numerous shortcomings in the past, especially when using
uninstalled static libraries. This release brings many internal changes in the
way they are handled, including:

- `link_whole:` of static libraries. In the example below, lib2 used to miss
  symbols from lib1 and was unusable.
```meson
lib1 = static_library(sources)
lib2 = static_library(other_sources, link_whole : lib1, install : true)
```
- `link_with:` of a static library with an uninstalled static library. In the
example below, lib2 now implicitly promote `link_with:` to `link_whole:` because
the installed lib2 would oterhwise be unusable.
```meson
lib1 = static_library(sources, install : false)
lib2 = static_library(sources, link_with : lib1, install : true)
```
- pkg-config generator do not include uninstalled static libraries. In the example
  below, the generated `.pc` file used to be unusable because it contained
  `Libs.private: -llib1` and `lib1.a` is not installed. `lib1` is now ommitted
  from the `.pc` file because the `link_with:` has been promoted to
  `link_whole:` (see above) and thus lib1 is not needed to use lib2.
```meson
lib1 = static_library(sources, install : false)
lib2 = both_libraries(sources, link_with : lib1, install : true)
pkg.generate(lib2)
```

Many projects have been using `extract_all_objects()` to work around those issues,
and hopefully those hacks could now be removed. Since this is a pretty large
change, please double check if your static libraries behave correctly, and
report any regression.

## Enhancements to the kconfig module

`kconfig.load()` may now accept a `configure_file()` as input file.

## Added `include_type` kwarg to `dependency`

The `dependency()` function now has a `include_type` kwarg. It can take the
values `'preserve'`, `'system'` and `'non-system'`. If it is set to `'system'`,
all include directories of the dependency are marked as system dependencies.

The default value of `include_type` is `'preserve'`.

Additionally, it is also possible to check and change the `include_type`
state of an existing dependency object with the new `include_type()` and
`as_system()` methods.

## Enhancements to `configure_file()`

`input:` now accepts multiple input file names for `command:`-configured file.

`depfile:` keyword argument is now accepted. The dependency file can
list all the additional files the configure target depends on.

## Projects args can be set separately for build and host machines (potentially breaking change)

Simplify `native` flag behavior in `add_global_arguments`,
`add_global_link_arguments`, `add_project_arguments` and
`add_project_link_arguments`. The rules are now very simple:

 - `native: true` affects `native: true` targets

 - `native: false` affects `native: false` targets

 - No native flag is the same as `native: false`

This further simplifies behavior to match the "build vs host" decision done in
last release with `c_args` vs `build_c_args`. The underlying motivation in both
cases is to execute the same commands whether the overall build is native or
cross.

## Allow checking if a variable is a disabler

Added the function `is_disabler(var)`. Returns true if a variable is a disabler
and false otherwise.


## gtkdoc-check support

`gnome.gtkdoc()` now has a `check` keyword argument. If `true` runs it will run
`gtkdoc-check` when running unit tests. Note that this has the downside of
rebuilding the doc for each build, which is often very slow. It usually should
be enabled only in CI.

## `gnome.gtkdoc()` returns target object

`gnome.gtkdoc()` now returns a target object that can be passed as dependency to
other targets using generated doc files (e.g. in `content_files` of another doc).

## Dist is now a top level command

Previously creating a source archive could only be done with `ninja
dist`. Starting with this release Meson provides a top level `dist`
that can be invoked directly. It also has a command line option to
determine which kinds of archives to create:

```meson
meson dist --formats=xztar,zip
```

