title: Release 0.62.0 short-description: Release notes for 0.62.0 ...
meson devenv
If bash-completion scripts are being installed and the shell is bash, they will be automatically sourced.
meson devenv
When GDB helper scripts (*-gdb.py, *-gdb.gdb, and *-gdb.csm) are installed with a library name that matches one being built, Meson adds the needed auto-load commands into <builddir>/.gdbinit
file. When running gdb from top build directory, that file is loaded by gdb automatically.
meson devenv --dump
With --dump
option, all environment variables that have been modified are printed instead of starting an interactive shell. It can be used by shell scripts that wish to setup their environment themselves.
method
and separator
kwargs on environment()
and meson.add_devenv()
It simplifies this common pattern:
env = environment() env.prepend('FOO', ['a', 'b'], separator: ',') meson.add_devenv(env)
becomes one line:
meson.add_devenv({'FOO': ['a', 'b']}, method: 'prepend', separator: ',')
or two lines:
env = environment({'FOO': ['a', 'b']}, method: 'prepend', separator: ',') meson.add_devenv(env)
dependency('dl')
will now check for the functionality of libdl.so, but first check if it is provided in the libc (for example in libc on OpenBSD or in musl libc on linux).
When using the variables:
family of kwargs to pkgconfig.generate
to refer to installed paths, traditionally only prefix
, includedir
, and libdir
were available by default, and generating a correct (relocatable) pkg-config file required manually constructing variables for e.g. datadir
.
Meson now checks each variable to see if it begins with a reference to a standard directory, and if so, adds it to the list of directories for which a builtin variable is created.
For example, before it was necessary to do this:
pkgconfig.generate( name: 'bash-completion', description: 'programmable completion for the bash shell', dataonly: true, variables: { 'prefix': get_option('prefix'), 'datadir': join_paths('${prefix}', get_option('datadir')), 'sysconfdir': join_paths('${prefix}', get_option('sysconfdir')), 'compatdir': '${sysconfdir}/bash_completion.d', 'completionsdir': '${datadir}/bash-completion/completions', 'helpersdir': '${datadir}/bash-completion/helpers', }, install_dir: join_paths(get_option('datadir'), 'pkgconfig'), )
Now the first three variables are not needed.
verbose
for tests and benchmarksThe new keyword argument verbose
can be used to mark tests and benchmarks that must always be logged verbosely on the console. This is particularly useful for long-running tests, or when a single Meson test() is wrapping an external test harness.
Support for CMake versions below 3.17.0 is now deprecated for both CMake dependencies and subprojects.
Due to lack of interest, lack of maintainership, and lack of a clear purpose, the RPM module has been removed.
Users interested in one-shot tools to generate an RPM spec file template for distro packaging, are encouraged develop an external tool that reads the introspection data.
For more details, see https://github.com/mesonbuild/meson/issues/9764
Support for the deprecated (since CMake 3.15) and now removed (since CMake 3.20) CMake server API is dropped from Meson.
The new CMake minimum version for CMake subprojects is now CMake 3.14.
Rust has these handy things called proc-macro crates, which are a bit like a compiler plugin. We can now support them, simply build a [[shared_library]] with the rust_crate_type
set to proc-macro
.
proc = shared_library( 'proc', 'proc.rs', rust_crate_type : 'proc-macro', install : false, ) user = executable('user, 'user.rs', link_with : proc)
The return value of [[find_program]] can now check the exact version of the found program, independent of the minimum version requirement. This can be used e.g. to perform different actions depending on the exact version detected.
Meson now requires at least Python version 3.7 to run as Python 3.6 reached EOL on December 2021. In practice this should only affect people developing on Ubuntu Bionic, who will need to manually install python3.8 from the official repositories.
XML files can now be translated easier by using itstool
via i18n.itstool_join()
. This ensures the XML is translated correctly based on the defined ITS rules for the specific XML layout.
The JNI system dependency now supports a modules
keyword argument which is a list containing any of the following: jvm
, awt
.
jni_dep = dependency('jni', version: '>= 1.8.0', modules: ['jvm', 'awt'])
This will add appropriate linker arguments to your target.
This module can search for protocol xml files from the wayland-protocols package, and generate .c and .h files using wayland-scanner.
Meson has a new command env2mfile
that can be used to convert “environment variable based” cross and native compilation environments to Meson machine files. This is especially convenient for e.g. distro packagers so they can easily generate unambiguous configuration files for package building.
As an example here's how you would generate a cross file that takes its settings from the CC
, CXX
, CFLAGS
etc environment variables.
meson env2mfile --cross --system=baremetal --cpu=armv7 --cpu-family=arm -o armcross.txt
The command also has support for generating Debian build files using system introspection:
meson env2mfile --cross --debarch armhf -o debarmhf_cross.txt
Note how you don't need to specify any system details, the command gets them transparently via dpkg-architecture
.
Creating a native file is done in the same way:
meson env2mfile --native -o current_system.txt
This system will detect if the _FOR_BUILD
environment variables are enabled and then uses them as needed.
With this you should be able to convert any envvar-based cross build setup to cross and native files and then use those. This means, among other things, that you can then run your compilations from any shell, not just the special one that has all the environment variables set.
As this functionality is still a bit in flux, the specific behaviour and command line arguments to use are subject to change. Because of this the main documentation has not yet been updated.
Please try this for your use cases and report to us if it is working. Patches to make the autodetection work on other distros and platforms are also welcome.
An optional --allow-dirty
flag has been added to the dist
command.
Previously, if uncommitted changes were present, Meson would warn about this but continue with the dist process. It now errors out instead. The error can be suppressed by using the --allow-dirty
option.
Due to various issues of fragility and concern that it doesn't predictably do the right thing, meson no longer runs ldconfig during meson install
, and users who need it run should run it themselves, instead.
Meson now supports the TI MSP430 and ARM toolchains. The compiler and linker are identified as ti
and ti-ar
, respectively. To maintain backwards compatibility with existing build definitions, the C2000 toolchain is still identified as c2000
and ar2000
.
The configuration
kwarg of the configure_package_config_file()
function from the cmake
module can now take a dict object, just like the regular configure_file()
function.
java.generate_native_header()
in favor of the new java.generate_native_headers()
java.generate_native_header()
was only useful for the most basic of situations. It didn‘t take into account that in order to generate native headers, you had to have all the referenced Java files. It also didn’t take into account inner classes. Do not use this function from 0.62.0
onward.
java.generate_native_headers()
has been added as a replacement which should account for the previous function's shortcomings.
// Outer.java package com.mesonbuild; public class Outer { private static native void outer(); public static class Inner { private static native void inner(); } }
With the above file, an invocation would look like the following:
java = import('java') native_headers = java.generate_native_headers( 'Outer.java', package: 'com.mesonbuild', classes: ['Outer', 'Outer.Inner'] )
It is now possible to specify -Dpython.install_env
and choose how python modules are installed.
venv
: assume that a virtualenv is active and install to thatsystem
: install to the global site-packages of the selected interpreter (the one that the venv module calls --system-site-packages)prefix
: preserve existing behaviorauto
: autodetect whether to use venv or systemjdk
to jni
The JDK system dependency is useful for creating native Java modules using the JNI. Since the purpose is to find the JNI, it has been decided that a better name is in fact “jni”. Use of dependency('jdk')
should be replaced with dependency('jni')
.
The i18n module partially accounts for builds with NLS disabled, by disabling gettext compiled translation catalogs if it cannot build them. Due to implementation details, this also disabled important data files created via merge_file, leading to important desktop files etc. not being installed.
This overreaction has been fixed. It is no longer possible to have NLS-disabled builds which break the project by not installing important files which have nothing to do with NLS (other than including some).
If you were depending on not having the Gettext tools installed and successfully mis-building your project, you may need to make your project actually work with NLS disabled, for example by providing some version of your files which is still installed even when merge_file cannot be run.
Previously, Meson only allowed most directory options to be relative to prefix. This restriction has been now lifted, bringing us in line with Autotools and CMake. It is also useful for platforms like Nix, which install projects into multiple independent prefixes.
As a consequence, get_option
might return absolute paths for any directory option, if a directory outside of prefix is passed. This is technically a backwards incompatible change but its effect should be minimal, thanks to widespread use of join_paths
/ /
operator and pkg-config generator module.
meson install --strip
It is now possible to strip targets using meson install --strip
even if -Dstrip=true
option was not set during configuration. This allows doing stripped and not stripped installations without reconfiguring the build.
Support for the armltdclang
compiler has been added. This differs from the existing armclang
toolchain in that it is a fork of Clang by ARM Ltd. and supports native compilation. The Keil armclang
toolchain only supports cross-compilation to embedded devices.
A new function, structured_sources()
has been added. This function allows languages like Rust which depend on the filesystem layout at compile time to mix generated and static sources.
executable( 'main', structured_sources( 'main.rs, {'mod' : generated_mod_rs}, ) )
Meson will then at build time copy the files into the build directory (if necessary), so that the desired file structure is laid out, and compile that. In this case:
root/ main.rs mod/ mod.rs
Detecting an OpenSSL installation in a cross-platform manner can be complicated. Officially, pkg-config is supported by upstream. Unofficially, cmake includes a FindOpenSSL using a different name and which requires specifying modules.
Meson will now allow the pkg-config name to work in all cases using the following lookup order:
declare_dependency
declare_dependency
accepts parameters for D specific features. Accepted new parameters are d_module_versions
and d_import_dirs
.
This can be useful to propagate conditional compilation versions. E.g.:
my_lua_dep = declare_dependency( # ... d_module_versions: ['LUA_53'], d_import_dirs: include_directories('my_lua_folder'), )
The write_basic_package_version_file()
function from the cmake
module now supports an arch_independent
kwarg, so that architecture checks in the generated Package Version file are skipped, reproducing the behaviour of CMake's ARCH_INDEPENDENT option.
dataonly
Pkgconfig Default Install PathThe default install path for dataonly
pkgconfig files has changed from ${libdir}/pkgconfig
to ${datadir}/pkgconfig
.
The previous default for jar()
was libdir
. With this release, it has been changed to datadir/java
. Please open an issue if this is not a sane default for your system.