| --- |
| title: Release 0.55.0 |
| short-description: Release notes for 0.55.0 |
| ... |
| |
| # New features |
| |
| ## rpath removal now more careful |
| |
| On Linux-like systems, Meson adds rpath entries to allow running apps |
| in the build tree, and then removes those build-time-only rpath |
| entries when installing. Rpath entries may also come in via LDFLAGS |
| and via .pc files. Meson used to remove those latter rpath entries by |
| accident, but is now more careful. |
| |
| ## Added ability to specify targets in `meson compile` |
| |
| It's now possible to specify targets in `meson compile`, which will |
| result in building only the requested targets. |
| |
| Usage: `meson compile [TARGET [TARGET...]]` |
| `TARGET` has the following syntax: `[PATH/]NAME[:TYPE]`. |
| `NAME`: name of the target from `meson.build` (e.g. `foo` from `executable('foo', ...)`). |
| `PATH`: path to the target relative to the root `meson.build` file. Note: relative path for a target specified in the root `meson.build` is `./`. |
| `TYPE`: type of the target (e.g. `shared_library`, `executable` and etc) |
| |
| `PATH` and/or `TYPE` can be omitted if the resulting `TARGET` can be used to uniquely identify the target in `meson.build`. |
| |
| For example targets from the following code: |
| ```meson |
| shared_library('foo', ...) |
| static_library('foo', ...) |
| executable('bar', ...) |
| ``` |
| can be invoked with `meson compile foo:shared_library foo:static_library bar`. |
| |
| ## Test protocol for gtest |
| |
| Due to the popularity of Gtest (google test) among C and C++ |
| developers Meson now supports a special protocol for gtest. With this |
| protocol Meson injects arguments to gtests to output JUnit, reads that |
| JUnit, and adds the output to the JUnit it generates. |
| |
| ## meson.add_*_script methods accept new types |
| |
| All three (`add_install_script`, `add_dist_script`, and |
| `add_postconf_script`) now accept ExternalPrograms (as returned by |
| `find_program`), Files, and the output of `configure_file`. The dist and |
| postconf methods cannot accept other types because of when they are run. |
| While dist could, in theory, take other dependencies, it would require more |
| extensive changes, particularly to the backend. |
| |
| ```meson |
| meson.add_install_script(find_program('foo'), files('bar')) |
| meson.add_dist_script(find_program('foo'), files('bar')) |
| meson.add_postconf_script(find_program('foo'), files('bar')) |
| ``` |
| |
| The install script variant is also able to accept custom_targets, |
| custom_target indexes, and build targets (executables, libraries), and |
| can use built executables a the script to run |
| |
| ```meson |
| installer = executable('installer', ...) |
| meson.add_install_script(installer, ...) |
| meson.add_install_script('foo.py', installer) |
| ``` |
| |
| ## Machine file constants |
| |
| Native and cross files now support string and list concatenation using |
| the `+` operator, and joining paths using the `/` operator. Entries |
| defined in the `[constants]` section can be used in any other section. |
| An entry defined in any other section can be used only within that |
| same section and only after it has been defined. |
| |
| ```ini |
| [constants] |
| toolchain = '/toolchain' |
| common_flags = ['--sysroot=' + toolchain + '/sysroot'] |
| |
| [properties] |
| c_args = common_flags + ['-DSOMETHING'] |
| cpp_args = c_args + ['-DSOMETHING_ELSE'] |
| |
| [binaries] |
| c = toolchain + '/gcc' |
| ``` |
| |
| ## Configure CMake subprojects with Meson.subproject_options |
| |
| Meson now supports passing configuration options to CMake and |
| overriding certain build details extracted from the CMake subproject. |
| |
| The new CMake configuration options object is very similar to the |
| [configuration data |
| object](Reference-manual.md#configuration-data-object) object returned |
| by [`configuration_data`](Reference-manual.md#configuration_data). It |
| is generated by the `subproject_options` function |
| |
| All configuration options have to be set *before* the subproject is |
| configured and must be passed to the `subproject` method via the |
| `options` key. Altering the configuration object won't have any effect |
| on previous `cmake.subproject` calls. |
| |
| **Note:** The `cmake_options` kwarg for the `subproject` function is |
| now deprecated since it is replaced by the new `options` system. |
| |
| ## find_program: Fixes when the program has been overridden by executable |
| |
| When a program has been overridden by an executable, the returned |
| object of find_program() had some issues: |
| |
| ```meson |
| # In a subproject: |
| exe = executable('foo', ...) |
| meson.override_find_program('foo', exe) |
| |
| # In main project: |
| # The version check was crashing Meson. |
| prog = find_program('foo', version : '>=1.0') |
| |
| # This was crashing Meson. |
| message(prog.path()) |
| |
| # New method to be consistent with built objects. |
| message(prog.full_path()) |
| ``` |
| |
| ## Response files enabled on Linux, reined in on Windows |
| |
| Meson used to always use response files on Windows, |
| but never on Linux. |
| |
| It now strikes a happier balance, using them on both platforms, |
| but only when needed to avoid command line length limits. |
| |
| ## `unstable-kconfig` module renamed to `unstable-keyval` |
| |
| The `unstable-kconfig` module is now renamed to `unstable-keyval`. We |
| expect this module to become stable once it has some usage experience, |
| specifically in the next or the following release |
| |
| |
| ## Fatal warnings in `gnome.generate_gir()` |
| |
| `gnome.generate_gir()` now has `fatal_warnings` keyword argument to |
| abort when a warning is produced. This is useful for example in CI |
| environment where it's important to catch potential issues. |
| |
| ## b_ndebug support for D language compilers |
| |
| D Language compilers will now set -release/--release/-frelease (depending on |
| the compiler) when the b_ndebug flag is set. |
| |
| ## Meson test now produces JUnit xml from results |
| |
| Meson will now generate a JUnit compatible XML file from test results. |
| it will be in the `meson-logs` directory and is called |
| `testlog.junit.xml`. |
| |
| ## Config tool based dependencies no longer search PATH for cross compiling |
| |
| Before 0.55.0 config tool based dependencies (llvm-config, |
| cups-config, etc), would search system $PATH if they weren't defined |
| in the cross file. This has been a source of bugs and has been |
| deprecated. It is now removed, config tool binaries must be specified |
| in the cross file now or the dependency will not be found. |
| |
| ## Rename has_exe_wrapper -> can_run_host_binaries |
| |
| The old name was confusing as it didn't really match the behavior of |
| the function. The old name remains as an alias (the behavior hasn't |
| changed), but is now deprecated. |
| |
| ## String concatenation in meson_options.txt |
| |
| It is now possible to use string concatenation (with the `+` |
| opperator) in the `meson_options.txt` file. This allows splitting long |
| option descriptions. |
| |
| ```meson |
| option( |
| 'testoption', |
| type : 'string', |
| value : 'optval', |
| description : 'An option with a very long description' + |
| 'that does something in a specific context' |
| ) |
| ``` |
| |
| ## Wrap fallback URL |
| |
| Wrap files can now define `source_fallback_url` and |
| `patch_fallback_url` to be used in case the main server is temporaly |
| down. |
| |
| ## Clang coverage support |
| |
| llvm-cov is now used to generate coverage information when clang is |
| used as the compiler. |
| |
| ## Local wrap source and patch files |
| |
| It is now possible to use the `patch_filename` and `source_filename` |
| value in a `.wrap` file without `*_url` to specify a local source / |
| patch file. All local files must be located in the |
| `subprojects/packagefiles` directory. The `*_hash` entries are |
| optional with this setup. |
| |
| ## Local wrap patch directory |
| |
| Wrap files can now specify `patch_directory` instead of |
| `patch_filename` in the case overlay files are local. Every files in |
| that directory, and subdirectories, will be copied to the subproject |
| directory. This can be used for example to add `meson.build` files to |
| a project not using Meson build system upstream. The patch directory |
| must be placed in `subprojects/packagefiles` directory. |
| |
| ## Patch on all wrap types |
| |
| `patch_*` keys are not limited to `wrap-file` any more, they can be |
| specified for all wrap types. |
| |
| ## link_language argument added to all targets |
| |
| Previously the `link_language` argument was only supposed to be |
| allowed in executables, because the linker used needs to be the linker |
| for the language that implements the main function. Unfortunately it |
| didn't work in that case, and, even worse, if it had been implemented |
| properly it would have worked for *all* targets. In 0.55.0 this |
| restriction has been removed, and the bug fixed. It now is valid for |
| `executable` and all derivative of `library`. |
| |
| ## meson dist --no-tests |
| |
| `meson dist` has a new option `--no-tests` to skip build and tests of |
| generated packages. It can be used to not waste time for example when |
| done in CI that already does its own testing. |
| |
| ## Force fallback for |
| |
| A newly-added `--force-fallback-for` command line option can now be |
| used to force fallback for specific subprojects. |
| |
| Example: |
| |
| ``` |
| meson builddir/ --force-fallback-for=foo,bar |
| ``` |
| |
| ## Implicit dependency fallback |
| |
| `dependency('foo')` now automatically fallback if the dependency is |
| not found on the system but a subproject wrap file or directory exists |
| with the same name. |
| |
| That means that simply adding `subprojects/foo.wrap` is enough to add |
| fallback to any `dependency('foo')` call. It is however requires that |
| the subproject call `meson.override_dependency('foo', foo_dep)` to |
| specify which dependency object should be used for `foo`. |
| |
| ## Wrap file `provide` section |
| |
| Wrap files can define the dependencies it provides in the `[provide]` |
| section. When `foo.wrap` provides the dependency `foo-1.0` any call do |
| `dependency('foo-1.0')` will automatically fallback to that subproject |
| even if no `fallback` keyword argument is given. See [Wrap |
| documentation](Wrap-dependency-system-manual.md#provide_section). |
| |
| ## `find_program()` fallback |
| |
| When a program cannot be found on the system but a wrap file has its |
| name in the `[provide]` section, that subproject will be used as |
| fallback. |
| |
| ## Test scripts are given the exe wrapper if needed |
| |
| Meson will now set the `MESON_EXE_WRAPPER` as the properly wrapped and |
| joined representation. For Unix-like OSes this means python's |
| shelx.join, on Windows an implementation that attempts to properly |
| quote windows argument is used. This allow wrapper scripts to run test |
| binaries, instead of just skipping. |
| |
| for example, if the wrapper is `['emulator', '--script']`, it will be passed |
| as `MESON_EXE_WRAPPER="emulator --script"`. |
| |
| ## Added ability to specify backend arguments in `meson compile` |
| |
| It's now possible to specify backend specific arguments in `meson compile`. |
| |
| Usage: `meson compile [--vs-args=args] [--ninja-args=args]` |
| |
| ``` |
| --ninja-args NINJA_ARGS Arguments to pass to `ninja` (applied only on `ninja` backend). |
| --vs-args VS_ARGS Arguments to pass to `msbuild` (applied only on `vs` backend). |
| ``` |
| |
| These arguments use the following syntax: |
| |
| If you only pass a single string, then it is considered to have all |
| values separated by commas. Thus invoking the following command: |
| |
| ``` |
| $ meson compile --ninja-args=-n,-d,explain |
| ``` |
| |
| would add `-n`, `-d` and `explain` arguments to ninja invocation. |
| |
| If you need to have commas or spaces in your string values, then you |
| need to pass the value with proper shell quoting like this: |
| |
| ``` |
| $ meson compile "--ninja-args=['a,b', 'c d']" |
| ``` |
| |
| ## Introspection API changes |
| |
| dumping the AST (--ast): **new in 0.55.0** |
| - prints the AST of a meson.build as JSON |
| |
| ## `--backend=vs` now matches `-Db_vscrt=from_buildtype` behaviour in the Ninja backend |
| |
| When `--buildtype=debugoptimized` is used with the Ninja backend, the |
| VS CRT option used is `/MD`, which is the [behaviour documented for |
| all |
| backends](https://mesonbuild.com/Builtin-options.html#b_vscrt-from_buildtype). |
| However, the Visual Studio backend was pass `/MT` in that case, which |
| is inconsistent. |
| |
| If you need to use the MultiThreaded CRT, you should explicitly pass |
| `-Db_vscrt=mt` |