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

# New features

## Added warning function

This function prints its argument to the console prefixed by "WARNING:" in
yellow color. A simple example:

warning('foo is deprecated, please use bar instead')


## Adds support for additional Qt5-Module keyword `moc_extra_arguments`

When `moc`-ing sources, the `moc` tool does not know about any
preprocessor macros. The generated code might not match the input
files when the linking with the moc input sources happens.

This amendment allows to specify a a list of additional arguments
passed to the `moc` tool. They are called `moc_extra_arguments`.


## Prefix-dependent defaults for sysconfdir, localstatedir and sharedstatedir

These options now default in a way consistent with
[FHS](http://refspecs.linuxfoundation.org/fhs.shtml) and common usage.

If prefix is `/usr`, default sysconfdir to `/etc`, localstatedir to `/var` and
sharedstatedir to `/var/lib`.

If prefix is `/usr/local` (the default), default localstatedir to `/var/local`
and sharedstatedir to `/var/local/lib`.


## An array type for user options

Previously to have an option that took more than one value a string
value would have to be created and split, but validating this was
difficult. A new array type has been added to the meson_options.txt
for this case. It works like a 'combo', but allows more than one
option to be passed. The values can optionally be validated against a
list of valid values. When used on the command line (with -D), values
are passed as a comma separated list.

```meson
option('array_opt', type : 'array', choices : ['one', 'two', 'three'], value : ['one'])
```

These can be overwritten on the command line,

```meson
meson _build -Darray_opt=two,three
```

## LLVM dependency supports both dynamic and static linking

The LLVM dependency has been improved to consistently use dynamic linking.
Previously recent version (>= 3.9) would link dynamically while older versions
would link statically.

Now LLVM also accepts the `static` keyword to enable statically linking to LLVM
modules instead of dynamically linking.


## Added `if_found` to subdir

Added a new keyword argument to the `subdir` command. It is given a
list of dependency objects and the function will only recurse in the
subdirectory if they are all found. Typical usage goes like this.

```meson
d1 = dependency('foo') # This is found
d2 = dependency('bar') # This is not found

subdir('somedir', if_found : [d1, d2])
```

In this case the subdirectory would not be entered since `d2` could
not be found.

## `get_unquoted()` method for the `configuration` data object

New convenience method that allows reusing a variable value
defined quoted. Useful in C for config.h strings for example.


## Added disabler object

A disabler object is a new kind of object that has very specific
semantics. If it is used as part of any other operation such as an
argument to a function call, logical operations etc, it will cause the
operation to not be evaluated. Instead the return value of said
operation will also be the disabler object.

For example if you have an setup like this:

```meson
dep = dependency('foo')
lib = shared_library('mylib', 'mylib.c',
  dependencies : dep)
exe = executable('mytest', 'mytest.c',
  link_with : lib)
test('mytest', exe)
```

If you replace the dependency with a disabler object like this:

```meson
dep = disabler()
lib = shared_library('mylib', 'mylib.c',
  dependencies : dep)
exe = executable('mytest', 'mytest.c',
  link_with : lib)
test('mytest', exe)
```

Then the shared library, executable and unit test are not
created. This is a handy mechanism to cut down on the number of `if`
statements.


## Config-Tool based dependencies gained a method to get arbitrary options

A number of dependencies (CUPS, LLVM, pcap, WxWidgets, GnuStep) use a config
tool instead of pkg-config. As of this version they now have a
`get_configtool_variable` method, which is analogous to the
`get_pkgconfig_variable` for pkg config.

```meson
dep_llvm = dependency('LLVM')
llvm_inc_dir = dep_llvm.get_configtool_variable('includedir')
```

## Embedded Python in Windows MSI packages

Meson now ships an internal version of Python in the MSI installer packages.
This means that it can run Python scripts that are part of your build
transparently. That is, if you do the following:

```meson
myprog = find_program('myscript.py')
```

Then Meson will run the script with its internal Python version if necessary.

## Libwmf dependency now supports libwmf-config

Earlier, `dependency('libwmf')` could only detect the library with pkg-config
files. Now, if pkg-config files are not found, Meson will look for
`libwmf-config` and if it's found, will use that to find the library.
