| --- |
| title: Release 0.49 |
| short-description: Release notes for 0.49 |
| ... |
| |
| # New features |
| |
| ## Libgcrypt dependency now supports libgcrypt-config |
| |
| Earlier, `dependency('libgcrypt')` could only detect the library with |
| pkg-config files. Now, if pkg-config files are not found, Meson will |
| look for `libgcrypt-config` and if it's found, will use that to find |
| the library. |
| |
| ## New `section` key for the buildoptions introspection |
| |
| Meson now has a new `section` key in each build option. This allows |
| IDEs to group these options similar to `meson configure`. |
| |
| The possible values for `section` are: |
| |
| - core |
| - backend |
| - base |
| - compiler |
| - directory |
| - user |
| - test |
| |
| ## CC-RX compiler for C and CPP |
| |
| Cross-compilation is now supported for Renesas RX targets with the |
| CC-RX compiler. |
| |
| The environment path should be set properly for the CC-RX compiler |
| executables. The `-cpu` option with the appropriate value should be |
| mentioned in the cross-file as shown in the snippet below. |
| |
| ```ini |
| [properties] |
| c_args = ['-cpu=rx600'] |
| cpp_args = ['-cpu=rx600'] |
| ``` |
| |
| The default extension of the executable output is `.abs`. Other target |
| specific arguments to the compiler and linker will need to be added |
| explicitly from the |
| cross-file(`c_args`/`c_link_args`/`cpp_args`/`cpp_link_args`) or some |
| other way. Refer to the CC-RX User's manual for additional compiler |
| and linker options. |
| |
| ## CMake `find_package` dependency backend |
| |
| Meson can now use the CMake `find_package` ecosystem to detect |
| dependencies. Both the old-style `<NAME>_LIBRARIES` variables as well |
| as imported targets are supported. Meson can automatically guess the |
| correct CMake target in most cases but it is also possible to manually |
| specify a target with the `modules` property. |
| |
| ```meson |
| # Implicitly uses CMake as a fallback and guesses a target |
| dep1 = dependency('KF5TextEditor') |
| |
| # Manually specify one or more CMake targets to use |
| dep2 = dependency('ZLIB', method : 'cmake', modules : ['ZLIB::ZLIB']) |
| ``` |
| |
| CMake is automatically used after `pkg-config` fails when |
| no `method` (or `auto`) was provided in the dependency options. |
| |
| ## New compiler method `get_argument_syntax` |
| |
| The compiler object now has `get_argument_syntax` method, which |
| returns a string value of `gcc`, `msvc`, or an undefined value string |
| value. This can be used to determine if a compiler uses gcc syntax |
| (`-Wfoo`), msvc syntax (`/w1234`), or some other kind of arguments. |
| |
| ```meson |
| cc = meson.get_compiler('c') |
| |
| if cc.get_argument_syntax() == 'msvc' |
| if cc.has_argument('/w1235') |
| add_project_arguments('/w1235', language : ['c']) |
| endif |
| elif cc.get_argument_syntax() == 'gcc' |
| if cc.has_argument('-Wfoo') |
| add_project_arguments('-Wfoo', language : ['c']) |
| endif |
| elif cc.get_id() == 'some other compiler' |
| add_project_arguments('--error-on-foo', language : ['c']) |
| endif |
| ``` |
| |
| ## Return `Disabler()` instead of not-found object |
| |
| Functions such as `dependency()`, `find_library()`, `find_program()`, |
| and `python.find_installation()` have a new keyword argument: |
| `disabler`. When set to `true` those functions return `Disabler()` |
| objects instead of not-found objects. |
| |
| ## `introspect --projectinfo` can now be used without configured build directory |
| |
| This allows IDE integration to get information about the project |
| before the user has configured a build directory. |
| |
| Before you could use `meson.py introspect --projectinfo |
| build-directory`. Now you also can use `meson.py introspect |
| --projectinfo project-dir/meson.build`. |
| |
| The output is similar to the output with a build directory but |
| additionally also includes information from `introspect |
| --buildsystem-files`. |
| |
| For example `meson.py introspect --projectinfo test\ cases/common/47\ |
| subproject\ options/meson.build` This outputs (pretty printed for |
| readability): |
| |
| ``` |
| { |
| "buildsystem_files": [ |
| "meson_options.txt", |
| "meson.build" |
| ], |
| "name": "suboptions", |
| "version": null, |
| "descriptive_name": "suboptions", |
| "subprojects": [ |
| { |
| "buildsystem_files": [ |
| "subprojects/subproject/meson_options.txt", |
| "subprojects/subproject/meson.build" |
| ], |
| "name": "subproject", |
| "version": "undefined", |
| "descriptive_name": "subproject" |
| } |
| ] |
| } |
| ``` |
| |
| Both usages now include a new `descriptive_name` property which always |
| shows the name set in the project. |
| |
| ## Can specify keyword arguments with a dictionary |
| |
| You can now specify keyword arguments for any function and method call |
| with the `kwargs` keyword argument. This is perhaps best described |
| with an example: |
| |
| ```meson |
| options = {'include_directories': include_directories('inc')} |
| |
| ... |
| |
| executable(... |
| kwargs: options) |
| ``` |
| |
| The above code is identical to this: |
| |
| ```meson |
| executable(... |
| include_directories: include_directories('inc')) |
| ``` |
| |
| That is, Meson will expand the dictionary given to `kwargs` as if the |
| entries in it had been given as keyword arguments directly. |
| |
| Note that any individual argument can be specified either directly or |
| with the `kwarg` dict but not both. If a key is specified twice, it |
| is a hard error. |
| |
| ## Manpages are no longer compressed implicitly |
| |
| Earlier, the `install_man` command has automatically compressed |
| installed manpages into `.gz` format. This collided with manpage |
| compression hooks already used by various distributions. Now, manpages |
| are installed uncompressed and distributors are expected to handle |
| compressing them according to their own compression preferences. |
| |
| ## Native config files |
| |
| Native files (`--native-file`) are the counterpart to cross files |
| (`--cross-file`), and allow specifying information about the build |
| machine, both when cross compiling and when not. |
| |
| Currently the native files only allow specifying the names of |
| binaries, similar to the cross file, for example: |
| |
| ```ini |
| [binaries] |
| llvm-config = "/opt/llvm-custom/bin/llvm-config" |
| ``` |
| |
| Will override the llvm-config used for *native* binaries. Targets for |
| the host machine will continue to use the cross file. |
| |
| ## Foreach `break` and `continue` |
| |
| `break` and `continue` keywords can be used inside foreach loops. |
| |
| ```meson |
| items = ['a', 'continue', 'b', 'break', 'c'] |
| result = [] |
| foreach i : items |
| if i == 'continue' |
| continue |
| elif i == 'break' |
| break |
| endif |
| result += i |
| endforeach |
| # result is ['a', 'b'] |
| ``` |
| |
| You can check if an array contains an element like this: |
| ```meson |
| my_array = [1, 2] |
| if 1 in my_array |
| # This condition is true |
| endif |
| if 1 not in my_array |
| # This condition is false |
| endif |
| ``` |
| |
| You can check if a dictionary contains a key like this: |
| ```meson |
| my_dict = {'foo': 42, 'foo': 43} |
| if 'foo' in my_dict |
| # This condition is true |
| endif |
| if 42 in my_dict |
| # This condition is false |
| endif |
| if 'foo' not in my_dict |
| # This condition is false |
| endif |
| ``` |
| |
| ## Joining paths with / |
| |
| For clarity and conciseness, we recommend using the `/` operator to separate |
| path elements: |
| |
| ```meson |
| joined = 'foo' / 'bar' |
| ``` |
| |
| Before Meson 0.49, joining path elements was done with the legacy |
| `join_paths` function, but the `/` syntax above is now recommended. |
| |
| ```meson |
| joined = join_paths('foo', 'bar') |
| ``` |
| |
| This only works for strings. |
| |
| ## Position-independent executables |
| |
| When `b_pie` option, or `executable()`'s `pie` keyword argument is set |
| to `true`, position-independent executables are built. All their |
| objects are built with `-fPIE` and the executable is linked with |
| `-pie`. Any static library they link must be built with `pic` set to |
| `true` (see `b_staticpic` option). |
| |
| ## Deprecation warning in pkg-config generator |
| |
| All libraries passed to the `libraries` keyword argument of the |
| `generate()` method used to be associated with that generated |
| pkg-config file. That means that any subsequent call to `generate()` |
| where those libraries appear would add the filebase of the |
| `generate()` that first contained them into `Requires:` or |
| `Requires.private:` field instead of adding an `-l` to `Libs:` or |
| `Libs.private:`. |
| |
| This behaviour is now deprecated. The library that should be |
| associated with the generated pkg-config file should be passed as |
| first positional argument instead of in the `libraries` keyword |
| argument. The previous behaviour is maintained but prints a |
| deprecation warning and support for this will be removed in a future |
| Meson release. If you can not create the needed pkg-config file |
| without this warning, please file an issue with as much details as |
| possible about the situation. |
| |
| For example this sample will write `Requires: liba` into `libb.pc` but |
| print a deprecation warning: |
| |
| ```meson |
| liba = library(...) |
| pkg.generate(libraries : liba) |
| |
| libb = library(...) |
| pkg.generate(libraries : [liba, libb]) |
| ``` |
| |
| It can be fixed by passing `liba` as first positional argument:: |
| ```meson |
| liba = library(...) |
| pkg.generate(liba) |
| |
| libb = library(...) |
| pkg.generate(libb, libraries : [liba]) |
| ``` |
| |
| ## Subprojects download, checkout, update command-line |
| |
| New command-line tool has been added to manage subprojects: |
| |
| - `meson subprojects download` to download all subprojects that have a wrap file. |
| - `meson subprojects update` to update all subprojects to latest version. |
| - `meson subprojects checkout` to checkout or create a branch in all git subprojects. |
| |
| ## New keyword argument `is_default` to `add_test_setup()` |
| |
| The keyword argument `is_default` may be used to set whether the test |
| setup should be used by default whenever `meson test` is run without |
| the `--setup` option. |
| |
| ```meson |
| add_test_setup('default', is_default: true, env: 'G_SLICE=debug-blocks') |
| add_test_setup('valgrind', env: 'G_SLICE=always-malloc', ...) |
| test('mytest', exe) |
| ``` |
| |
| For the example above, running `meson test` and `meson test |
| --setup=default` is now equivalent. |