title: Release 1.3.0 short-description: Release notes for 1.3.0 ...
Meson 1.3.0 was released on 19 November 2023
Compiler check methods compiler.compute_int()
, compiler.alignment()
and compiler.sizeof()
now have their implicitly-included headers corrected and documented.
<stdio.h>
was included unintentionally when cross-compiling, which is less than ideal because there is no guarantee that a standard library is available for the target platform. Only <stddef.h>
is included instead.
For projects that depend on the old behavior, the compiler check methods have an optional argument prefix
, which can be used to specify additional #include
directives.
Compiler check methods compiler.compiles()
, compiler.links()
and compiler.run()
now have a new werror: true
keyword argument to treat compiler warnings as error. This can be used to check if code compiles without warnings.
has_define
methodThis method returns true if the given preprocessor symbol is defined, else false is returned. This is useful is cases where an empty define has to be distinguished from a non-set one, which is not possible using get_define
.
Additionally it makes intent clearer for code that only needs to check if a specific define is set at all and does not care about its value.
macro_name
parameter.This new paramater, macro_name
allows C macro-style include guards to be added to [[configure_file]]'s output when a template file is not given. This change simplifies the creation of configure files that define macros with dynamic names and want the C-style include guards.
c_std
and cpp_std
options now accepts a list of valuesProjects that prefer GNU C, but can fallback to ISO C, can now set, for example, default_options: 'c_std=gnu11,c11'
, and it will use gnu11
when available, but fallback to c11
otherwise. It is an error only if none of the values are supported by the current compiler.
Likewise, a project that can take benefit of c++17
but can still build with c++11
can set default_options: 'cpp_std=c++17,c++11'
.
This allows us to deprecate gnuXX
values from the MSVC compiler. That means that default_options: 'c_std=gnu11'
will now print a warning with MSVC but fallback to c11
. No warning is printed if at least one of the values is valid, i.e. default_options: 'c_std=gnu11,c11'
.
In the future that deprecation warning will become an hard error because c_std=gnu11
should mean GNU is required, for projects that cannot be built with MSVC for example.
When a module uses a CustomTarget
to process files, it now has the possibility to customize the message displayed by ninja.
Many modules were updated to take advantage of this new feature.
The point of build_target()
is that what is produced can be conditionally changed. However, jar()
has a significant number of non-overlapping arguments from other build_targets, including the kinds of sources it can include. Because of this crafting a build_target
that can be used as a Jar and as something else is incredibly hard to do. As such, it has been deprecated, and using jar()
directly is recommended.
Like the kwarg of the same name in custom_target()
, env
allows you to set the environment in which the generator will process inputs.
In previous versions of meson, a meson.build
file like this:
exectuable('foo', 'main.c') exectuable('foo', 'main.c', name_suffix: 'bar')
would result in a configure error because meson internally used the same id for both executables. This build file is now allowed since meson takes into account the bar
suffix when generating the second executable. This allows for executables with the same basename but different suffixes to be built in the same subdirectory.
This allows using a .def file to control which functions an [[executable]] will expose to a [[shared_module]].
In a similar fashion as dependency(), find_program() now also allows you to set default options for the subproject that gets built in case of a fallback.
fs.relative_to()
The fs
module now has a relative_to
method. The method will return the relative path from argument one to argument two, if one exists. Otherwise, the absolute path to argument one is returned.
assert(fs.relative_to('c:\\prefix\\lib', 'c:\\prefix\\bin') == '..\\lib') assert(fs.relative_to('c:\\proj1\\foo', 'd:\\proj1\\bar') == 'c:\\proj1\\foo') assert(fs.relative_to('prefix\\lib\\foo', 'prefix') == 'lib\\foo') assert(fs.relative_to('/prefix/lib', '/prefix/bin') == '../lib') assert(fs.relative_to('prefix/lib/foo', 'prefix') == 'lib/foo')
In addition to strings, it can handle files, custom targets, custom target indices, and build targets.
The [[install_data]], [[install_headers]], [[install_subdir]] functions now have an optional argument follow_symlinks
that, if set to true
, makes it so symbolic links in the source are followed, rather than copied into the destination tree, to match the old behavior. The default, which is currently to follow links, is subject to change in the future.
int.to_string() now accepts a fill
argument. This allows you to pad the string representation of the integer with leading zeroes:
n = 4 message(n.to_string()) message(n.to_string(fill: 3)) n = -4 message(n.to_string(fill: 3))
OUTPUT:
4 004 -04
When no input file is specified, [[configure_file]] can now generate a json
file from given [[@cfg_data]]. Field descriptions are not preserved in the json file.
@GLOBAL_SOURCE_ROOT@
and @DIRNAME@
in machine filesSome tokens are now replaced in the machine file before parsing it:
@GLOBAL_SOURCE_ROOT@
: the absolute path to the project's source tree@DIRNAME@
: the absolute path to the machine file's parent directory.It can be used, for example, to have paths relative to the source directory, or relative to toolchain's installation directory.
[binaries] c = '@DIRNAME@/toolchain/gcc' exe_wrapper = '@GLOBAL_SOURCE_ROOT@' / 'build-aux' / 'my-exe-wrapper.sh'
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-fix
target that runs run-clang-tidy
tool with -fix
option to apply the changes found by clang-tidy to the source code.
If you have defined your own clang-tidy-fix
target, Meson will not generate its own target.
The syntax for specifying a target for meson compile is now [PATH_TO_TARGET/]TARGET_NAME.TARGET_SUFFIX[:TARGET_TYPE]
where TARGET_SUFFIX
is the suffix argument given in the build target within meson.build. It is optional and TARGET_NAME
remains sufficient if it uniquely resolves to one single target.
MESON_PACKAGE_CACHE_DIR
If the MESON_PACKAGE_CACHE_DIR
environment variable is set, it is used instead of the project's subprojects/packagecache
. This allows sharing the cache across multiple projects. In addition it can contain an already extracted source tree as long as it has the same directory name as the directory
field in the wrap file. In that case, the directory will be copied into subprojects/
before applying patches.
meson setup <builddir> -Dopt=value
If the build directory already exists, options are updated with their new value given on the command line (-Dopt=value
). Unless --reconfigure
is also specified, this won't reconfigure immediately. This has the same behaviour as meson configure <builddir> -Dopt=value
.
Previous Meson versions were simply a no-op.
meson setup --clearcache
Just like meson configure --clearcache
, it is now possible to clear the cache and reconfigure in a single command with meson setup --clearcache --reconfigure <builddir>
.
When using [[dep.get_variable]] and defining a pkgconfig_define
, it is sometimes useful to remap multiple dependency variables. For example, if the upstream project changed the variable name that is interpolated and it is desirable to support both versions.
It is now possible to pass multiple pairs of variable/value.
The same applies to the compatibility [[dep.get_pkgconfig_variable]] method.
pkgconfig
field deprecated and replaced by pkg-config
Meson used to allow both pkgconfig
and pkg-config
entries in machine files, the former was used for dependency()
lookup and the latter was used as return value for find_program('pkg-config')
.
This inconsistency is now fixed by deprecating pkgconfig
in favor of pkg-config
which matches the name of the binary. For backward compatibility it is still allowed to define both with the same value, in that case no deprecation warning is printed.
The Python module‘s extension_module
function has gained the ability to build extensions which target Python’s limited C API via a new keyword argument: limited_api
.
has_*
methods support the required
keywordNow instead of
assert(cc.has_function('some_function')) assert(cc.has_type('some_type')) assert(cc.has_member('struct some_type', 'x')) assert(cc.has_members('struct some_type', ['x', 'y']))
we can use
cc.has_function('some_function', required: true) cc.has_type('some_type', required: true) cc.has_member('struct some_type', 'x', required: true) cc.has_members('struct some_type', ['x', 'y'], required: true)
rust_crate_type
and replaced by rust_abi
The new rust_abi
keyword argument is accepted by [[shared_library]], [[static_library]], [[library]] and [[shared_module]] functions. It can be either 'rust'
(the default) or 'c'
strings.
rust_crate_type
is now deprecated because Meson already knows if it's a shared or static library, user only need to specify the ABI (Rust or C).
proc_macro
crates are now handled by the rust.proc_macro()
method.
Sanitizers like AddressSanitizer and UndefinedBehaviorSanitizer do not abort by default on detected violations. Meson now exports ASAN_OPTIONS
and UBSAN_OPTIONS
when unset in the environment to provide sensible abort-by-default behavior.
<lang>_(shared|static)_args
for both_library, library, and build_targetWe now allow passing arguments like c_static_args
and c_shared_args
. This allows a [[both_libraries]] to have arguments specific to either the shared or static library, as well as common arguments to both.
There is a drawback to this, since Meson now cannot re-use object files between the static and shared targets. This could lead to much higher compilation time when using a [[both_libraries]] if there are many sources.
-j
shorthand for --num-processes
-j
now means the same thing as --num-processes
. It was inconsistently supported only in some subcommands. Now you may use it everywhere
They now all support the same set of values: strings, integers, bools, options, dictionaries and lists thereof.
The scan-build
target, created when using the ninja
backend with scan-build
present, now excludes bugs found in subprojects from its final report.
This means you can do something like:
defs = custom_target('generate_module_defs', ...) shared_library('lib1', vs_module_defs : defs[0]) shared_library('lib2', vs_module_defs : defs[2])
cmake
and cargo
subprojectCMake subprojects have been supported for a while using the cmake.subproject()
module method. However until now it was not possible to use a CMake subproject as fallback in a dependency()
call.
A wrap file can now specify the method used to build it by setting the method
key in the wrap file's first section. The method defaults to meson
.
Supported methods:
meson
requires meson.build
file.cmake
requires CMakeLists.txt
file. See details.cargo
requires Cargo.toml
file. See details.