--- title: Release 0.62.0 short-description: Release notes for 0.62.0 ... # New features ## Bash completion scripts sourced in `meson devenv` If bash-completion scripts are being installed and the shell is bash, they will be automatically sourced. ## Setup GDB auto-load for `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 `/.gdbinit` file. When running gdb from top build directory, that file is loaded by gdb automatically. ## Print modified environment variables with `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. ## New `method` and `separator` kwargs on `environment()` and `meson.add_devenv()` It simplifies this common pattern: ```meson env = environment() env.prepend('FOO', ['a', 'b'], separator: ',') meson.add_devenv(env) ``` becomes one line: ```meson meson.add_devenv({'FOO': ['a', 'b']}, method: 'prepend', separator: ',') ``` or two lines: ```meson env = environment({'FOO': ['a', 'b']}, method: 'prepend', separator: ',') meson.add_devenv(env) ``` ## New custom dependency for libdl ``` 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). ## pkgconfig.generate will now include variables for builtin directories when referenced 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: ```meson 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. ## New keyword argument `verbose` for tests and benchmarks The 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. ## CMake support for versions <3.17.0 is deprecated Support for CMake versions below 3.17.0 is now deprecated for *both* CMake dependencies and subprojects. ## Removal of the RPM module 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 ## CMake server API support is removed Support for the [deprecated (since CMake 3.15)](https://cmake.org/cmake/help/latest/release/3.15.html#deprecated-and-removed-features) and now [removed (since CMake 3.20)](https://cmake.org/cmake/help/latest/release/3.20.html#deprecated-and-removed-features) CMake server API is dropped from Meson. The new CMake minimum version for CMake subprojects is now CMake 3.14. ## Rust proc-macro crates 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`. ```meson proc = shared_library( 'proc', 'proc.rs', rust_crate_type : 'proc-macro', install : false, ) user = executable('user, 'user.rs', link_with : proc) ``` ## found programs now have a version method 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. ## Minimum required Python version updated to 3.7 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. ## Added support for XML translations using itstool 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. ## JNI System Dependency Modules The JNI system dependency now supports a `modules` keyword argument which is a list containing any of the following: `jvm`, `awt`. ```meson jni_dep = dependency('jni', version: '>= 1.8.0', modules: ['jvm', 'awt']) ``` This will add appropriate linker arguments to your target. ## New unstable wayland module This module can search for protocol xml files from the wayland-protocols package, and generate .c and .h files using wayland-scanner. ## Experimental command to convert environments to cross files 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. ## Added optional '--allow-dirty' flag for the 'dist' command 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. ## ldconfig is no longer run on install 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. ## Added support for Texas Instruments MSP430 and ARM compilers Meson now supports the TI [MSP430](https://www.ti.com/tool/MSP-CGT) and [ARM](https://www.ti.com/tool/ARM-CGT) toolchains. The compiler and linker are identified as `ti` and `ti-ar`, respectively. To maintain backwards compatibility with existing build definitions, the [C2000 toolchain](https://www.ti.com/tool/C2000-CGT) is still identified as `c2000` and `ar2000`. ## cmake.configure_package_config_file can now take a dict 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. ## Deprecated `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. ```java // 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: ```meson java = import('java') native_headers = java.generate_native_headers( 'Outer.java', package: 'com.mesonbuild', classes: ['Outer', 'Outer.Inner'] ) ``` ## New option to choose python installation environment 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 that - `system`: install to the global site-packages of the selected interpreter (the one that the venv module calls --system-site-packages) - `prefix`: preserve existing behavior - `auto`: autodetect whether to use venv or system ## JDK System Dependency Renamed from `jdk` 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')`. ## i18n.merge_file no longer arbitrarily leaves your project half-built 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. ## All directory options now support paths outside of prefix 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 ARM Ltd. Clang toolchain 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. ## structured_sources() 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. ```meson 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 ``` ## New custom dependency for OpenSSL 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: - prefer pkg-config if at all possible - attempt to probe the system for the standard library naming, and retrieve the version from the headers - if all else fails, check if cmake can find it ## D features in `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.: ```meson my_lua_dep = declare_dependency( # ... d_module_versions: ['LUA_53'], d_import_dirs: include_directories('my_lua_folder'), ) ``` ## arch_independent kwarg in cmake.write_basic_package_version_file 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](https://cmake.org/cmake/help/latest/module/CMakePackageConfigHelpers.html#command:write_basic_package_version_file) option. ## `dataonly` Pkgconfig Default Install Path The default install path for `dataonly` pkgconfig files has changed from `${libdir}/pkgconfig` to `${datadir}/pkgconfig`. ## JAR default install dir 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.