| --- |
| title: Release 0.51.0 |
| short-description: Release notes for 0.51.0 |
| ... |
| |
| # New features |
| |
| ## (C) Preprocessor flag handling |
| |
| Meson previously stored `CPPFLAGS` and per-language compilation flags |
| separately. (That latter would come from `CFLAGS`, `CXXFLAGS`, etc., |
| along with `<lang>_args` options whether specified no the command-line |
| interface (`-D..`), `meson.build` (`default_options`), or cross file |
| (`[properties]`).) This was mostly unobservable, except for certain |
| preprocessor-only checks like `check_header` would only use the |
| preprocessor flags, leading to confusion if some `-isystem` was in |
| `CFLAGS` but not `CPPFLAGS`. Now, they are lumped together, and |
| `CPPFLAGS`, for the languages which are deemed to care to about, is |
| just another source of compilation flags along with the others already |
| listed. |
| |
| ## Sanity checking compilers with user flags |
| |
| Sanity checks previously only used user-specified flags for cross |
| compilers, but now do in all cases. |
| |
| All compilers Meson might decide to use for the build are "sanity |
| checked" before other tests are run. This usually involves building |
| simple executable and trying to run it. Previously user flags |
| (compilation and/or linking flags) were used for sanity checking cross |
| compilers, but not native compilers. This is because such flags might |
| be essential for a cross binary to succeed, but usually aren't for a |
| native compiler. |
| |
| In recent releases, there has been an effort to minimize the |
| special-casing of cross or native builds so as to make building more |
| predictable in less-tested cases. Since this the user flags are |
| necessary for cross, but not harmful for native, it makes more sense |
| to use them in all sanity checks than use them in no sanity checks, so |
| this is what we now do. |
| |
| ## New `sourceset` module |
| |
| A new module, `sourceset`, was added to help building many binaries |
| from the same source files. Source sets associate source files and |
| dependencies to keys in a `configuration_data` object or a dictionary; |
| they then take multiple `configuration_data` objects or dictionaries, |
| and compute the set of source files and dependencies for each of those |
| configurations. |
| |
| ## n_debug=if-release and buildtype=plain means no asserts |
| |
| Previously if this combination was used then assertions were enabled, |
| which is fairly surprising behavior. |
| |
| ## `target_type` in `build_targets` accepts the value 'shared_module' |
| |
| The `target_type` keyword argument in `build_target()` now accepts the |
| value `'shared_module'`. |
| |
| The statement |
| |
| ```meson |
| build_target(..., target_type: 'shared_module') |
| ``` |
| |
| is equivalent to this: |
| |
| ```meson |
| shared_module(...) |
| ``` |
| |
| ## New modules kwarg for python.find_installation |
| |
| This mirrors the modules argument that some kinds of dependencies |
| (such as qt, llvm, and cmake based dependencies) take, allowing you to |
| check that a particular module is available when getting a python |
| version. |
| |
| ```meson |
| py = import('python').find_installation('python3', modules : ['numpy']) |
| ``` |
| |
| ## Support for the Intel Compiler on Windows (ICL) |
| |
| Support has been added for ICL.EXE and ifort on windows. The support |
| should be on part with ICC support on Linux/MacOS. The ICL C/C++ |
| compiler behaves like Microsoft's CL.EXE rather than GCC/Clang like |
| ICC does, and has a different id, `intel-cl` to differentiate it. |
| |
| ```meson |
| cc = meson.get_compiler('c') |
| if cc.get_id == 'intel-cl' |
| add_project_argument('/Qfoobar:yes', language : 'c') |
| endif |
| ``` |
| |
| ## Added basic support for the Xtensa CPU toolchain |
| |
| You can now use `xt-xcc`, `xt-xc++`, `xt-nm`, etc... on your cross |
| compilation file and Meson won't complain about an unknown toolchain. |
| |
| |
| ## Dependency objects now have a get_variable method |
| |
| This is a generic replacement for type specific variable getters such as |
| `ConfigToolDependency.get_configtool_variable` and |
| `PkgConfigDependency.get_pkgconfig_variable`, and is the only way to query |
| such variables from cmake dependencies. |
| |
| This method allows you to get variables without knowing the kind of |
| dependency you have. |
| |
| ```meson |
| dep = dependency('could_be_cmake_or_pkgconfig') |
| # cmake returns 'YES', pkg-config returns 'ON' |
| if ['YES', 'ON'].contains(dep.get_variable(pkgconfig : 'var-name', cmake : 'COP_VAR_NAME', default_value : 'NO')) |
| error('Cannot build your project when dep is built with var-name support') |
| endif |
| ``` |
| |
| ## CMake prefix path overrides |
| |
| When using pkg-config as a dependency resolver we can pass |
| `-Dpkg_config_path=$somepath` to extend or overwrite where pkg-config |
| will search for dependencies. Now cmake can do the same, as long as |
| the dependency uses a ${Name}Config.cmake file (not a |
| Find{$Name}.cmake file), by passing |
| `-Dcmake_prefix_path=list,of,paths`. It is important that point this |
| at the prefix that the dependency is installed into, not the cmake |
| path. |
| |
| If you have installed something to `/tmp/dep`, which has a layout like: |
| ``` |
| /tmp/dep/lib/cmake |
| /tmp/dep/bin |
| ``` |
| |
| then invoke Meson as `meson builddir/ -Dcmake_prefix_path=/tmp/dep` |
| |
| ## Tests that should fail but did not are now errors |
| |
| You can tag a test as needing to fail like this: |
| |
| ```meson |
| test('shoulfail', exe, should_fail: true) |
| ``` |
| |
| If the test passes the problem is reported in the error logs but due |
| to a bug it was not reported in the test runner's exit code. Starting |
| from this release the unexpected passes are properly reported in the |
| test runner's exit code. This means that test runs that were passing |
| in earlier versions of Meson will report failures with the current |
| version. This is a good thing, though, since it reveals an error in |
| your test suite that has, until now, gone unnoticed. |
| |
| ## New target keyword argument: `link_language` |
| |
| There may be situations for which the user wishes to manually specify |
| the linking language. For example, a C++ target may link C, Fortran, |
| etc. and perhaps the automatic detection in Meson does not pick the |
| desired compiler. The user can manually choose the linker by language |
| per-target like this example of a target where one wishes to link with |
| the Fortran compiler: |
| |
| ```meson |
| executable(..., link_language : 'fortran') |
| ``` |
| |
| A specific case this option fixes is where for example the main |
| program is Fortran that calls C and/or C++ code. The automatic |
| language detection of Meson prioritizes C/C++, and so an compile-time |
| error results like `undefined reference to main`, because the linker |
| is C or C++ instead of Fortran, which is fixed by this per-target |
| override. |
| |
| ## New module to parse kconfig output files |
| |
| The new module `unstable-kconfig` adds the ability to parse and use |
| kconfig output files from `meson.build`. |
| |
| |
| ## Add new `meson subprojects foreach` command |
| |
| `meson subprojects` has learned a new `foreach` command which accepts |
| a command with arguments and executes it in each subproject directory. |
| |
| For example this can be useful to check the status of subprojects |
| (e.g. with `git status` or `git diff`) before performing other actions |
| on them. |
| |
| |
| ## Added c17 and c18 as c_std values for recent GCC and Clang Versions |
| |
| For gcc version 8.0 and later, the values c17, c18, gnu17, and gnu18 |
| were added to the accepted values for built-in compiler option c_std. |
| |
| For Clang version 10.0 and later on Apple OSX (Darwin), and for |
| version 7.0 and later on other platforms, the values c17 and gnu17 |
| were added as c_std values. |
| |
| ## gpgme dependency now supports gpgme-config |
| |
| Previously, we could only detect GPGME with custom invocations of |
| `gpgme-config` or when the GPGME version was recent enough (>=1.13.0) |
| to install pkg-config files. Now we added support to Meson allowing us |
| to use `dependency('gpgme')` and fall back on `gpgme-config` parsing. |
| |
| ## Can link against custom targets |
| |
| The output of `custom_target` and `custom_target[i]` can be used in |
| `link_with` and `link_whole` keyword arguments. This is useful for |
| integrating custom code generator steps, but note that there are many |
| limitations: |
| |
| - Meson can not know about link dependencies of the custom target. If |
| the target requires further link libraries, you need to add them manually |
| |
| - The user is responsible for ensuring that the code produced by |
| different toolchains are compatible. |
| |
| - `custom_target` may only be used when it has a single output file. |
| Use `custom_target[i]` when dealing with multiple output files. |
| |
| - The output file must have the correct file name extension. |
| |
| |
| ## Removed the deprecated `--target-files` API |
| |
| The `--target-files` introspection API is now no longer available. The same |
| information can be queried with the `--targets` API introduced in 0.50.0. |
| |
| ## Generators have a new `depends` keyword argument |
| |
| Generators can now specify extra dependencies with the `depends` |
| keyword argument. It matches the behaviour of the same argument in |
| other functions and specifies that the given targets must be built |
| before the generator can be run. This is used in cases such as this |
| one where you need to tell a generator to indirectly invoke a |
| different program. |
| |
| ```meson |
| exe = executable(...) |
| cg = generator(program_runner, |
| output: ['@BASENAME@.c'], |
| arguments: ['--use-tool=' + exe.full_path(), '@INPUT@', '@OUTPUT@'], |
| depends: exe) |
| ``` |
| |
| ## Specifying options per mer machine |
| |
| Previously, no cross builds were controllable from the command line. |
| Machine-specific options like the pkg-config path and compiler options |
| only affected native targets, that is to say all targets in native |
| builds, and `native: true` targets in cross builds. Now, prefix the |
| option with `build.` to affect build machine targets, and leave it |
| unprefixed to affect host machine targets. |
| |
| For those trying to ensure native and cross builds to the same |
| platform produced the same result, the old way was frustrating because |
| very different invocations were needed to affect the same targets, if |
| it was possible at all. Now, the same command line arguments affect |
| the same targets everywhere --- Meson is closer to ignoring whether |
| the "overall" build is native or cross, and just caring about whether |
| individual targets are for the build or host machines. |
| |
| |
| ## subproject.get_variable() now accepts a `fallback` argument |
| |
| Similar to `get_variable`, a fallback argument can now be passed to |
| `subproject.get_variable()`, it will be returned if the requested |
| variable name did not exist. |
| |
| ``` meson |
| var = subproject.get_variable('does-not-exist', 'fallback-value') |
| ``` |
| |
| ## Add keyword `static` to `find_library` |
| |
| `find_library` has learned the `static` keyword. They keyword must be |
| a boolean, where `true` only searches for static libraries and `false` |
| only searches for dynamic/shared. Leaving the keyword unset will keep |
| the old behavior of first searching for dynamic and then falling back |
| to static. |
| |
| ## Fortran `include` statements recursively parsed |
| |
| While non-standard and generally not recommended, some legacy Fortran |
| programs use `include` directives to inject code inline. Since v0.51, |
| Meson can handle Fortran `include` directives recursively. |
| |
| DO NOT list `include` files as sources for a target, as in general |
| their syntax is not correct as a standalone target. In general |
| `include` files are meant to be injected inline as if they were copy |
| and pasted into the source file. |
| |
| `include` was never standard and was superceded by Fortran 90 `module`. |
| |
| The `include` file is only recognized by Meson if it has a Fortran |
| file suffix, such as `.f` `.F` `.f90` `.F90` or similar. This is to |
| avoid deeply nested scanning of large external legacy C libraries that |
| only interface to Fortran by `include biglib.h` or similar. |
| |
| ## CMake subprojects |
| |
| Meson can now directly consume CMake based subprojects with the |
| CMake module. |
| |
| Using CMake subprojects is similar to using the "normal" Meson |
| subprojects. They also have to be located in the `subprojects` |
| directory. |
| |
| Example: |
| |
| ```cmake |
| add_library(cm_lib SHARED ${SOURCES}) |
| ``` |
| |
| ```meson |
| cmake = import('cmake') |
| |
| # Configure the CMake project |
| sub_proj = cmake.subproject('libsimple_cmake') |
| |
| # Fetch the dependency object |
| cm_lib = sub_proj.dependency('cm_lib') |
| |
| executable(exe1, ['sources'], dependencies: [cm_lib]) |
| ``` |
| |
| It should be noted that not all projects are guaranteed to work. The |
| safest approach would still be to create a `meson.build` for the |
| subprojects in question. |
| |
| ## Multiple cross files can be specified |
| |
| `--cross-file` can be passed multiple times, with the configuration files overlaying the same way as `--native-file`. |