| --- |
| title: Release 0.46 |
| short-description: Release notes for 0.46 |
| ... |
| |
| # New features |
| |
| ## Allow early return from a script |
| |
| Added the function `subdir_done()`. Its invocation exits the current script at |
| the point of invocation. All previously invoked build targets and commands are |
| build/executed. All following ones are ignored. If the current script was |
| invoked via `subdir()` the parent script continues normally. |
| |
| ## Log output slightly changed |
| |
| The format of some human-readable diagnostic messages has changed in |
| minor ways. In case you are parsing these messages, you may need to |
| adjust your code. |
| |
| ## ARM compiler for C and CPP |
| |
| Cross-compilation is now supported for ARM targets using ARM compiler - ARMCC. |
| The current implementation does not support shareable libraries. |
| The default extension of the output is .axf. |
| The environment path should be set properly for the ARM compiler executables. |
| The '--cpu' option with the appropriate target type should be mentioned |
| in the cross file as shown in the snippet below. |
| |
| ```ini |
| [properties] |
| c_args = ['--cpu=Cortex-M0plus'] |
| cpp_args = ['--cpu=Cortex-M0plus'] |
| |
| ``` |
| |
| ## Building both shared and static libraries |
| |
| A new function `both_libraries()` has been added to build both shared and static |
| libraries at the same time. Source files will be compiled only once and object |
| files will be reused to build both shared and static libraries, unless |
| `b_staticpic` user option or `pic:` keyword argument are set to false in which |
| case sources will be compiled twice. |
| |
| The returned `buildtarget` object always represents the shared library. |
| |
| ## Compiler object can now be passed to run_command() |
| |
| This can be used to run the current compiler with the specified arguments |
| to obtain additional information from it. |
| One of the use cases is to get the location of development files for the |
| GCC plugins: |
| |
| ```meson |
| cc = meson.get_compiler('c') |
| result = run_command(cc, '-print-file-name=plugin') |
| plugin_dev_path = result.stdout().strip() |
| ``` |
| |
| ## declare_dependency() now supports `link_whole:` |
| |
| `declare_dependency()` now supports the `link_whole:` keyword argument which |
| transparently works for build targets which use that dependency. |
| |
| ## Old command names are now errors |
| |
| The old executable names `mesonintrospect`, `mesonconf`, `mesonrewriter` |
| and `mesontest` have been deprecated for a long time. Starting from |
| this version they no longer do anything but instead always error |
| out. All functionality is available as subcommands in the main `meson` |
| binary. |
| |
| ## Meson and meson configure now accept the same arguments |
| |
| Previously meson required that builtin arguments (like prefix) be passed as |
| `--prefix` to `meson` and `-Dprefix` to `meson configure`. `meson` now accepts -D |
| form like `meson configure` has. `meson configure` also accepts the `--prefix` |
| form, like `meson` has. |
| |
| ## Recursively extract objects |
| |
| The `recursive:` keyword argument has been added to `extract_all_objects()`. When set |
| to `true` it will also return objects passed to the `objects:` argument of this |
| target. By default only objects built for this target are returned to maintain |
| backward compatibility with previous versions. The default will eventually be |
| changed to `true` in a future version. |
| |
| ```meson |
| lib1 = static_library('a', 'source.c', objects : 'prebuilt.o') |
| lib2 = static_library('b', objects : lib1.extract_all_objects(recursive : true)) |
| ``` |
| |
| ## Can override find_program() |
| |
| It is now possible to override the result of `find_program` to point |
| to a custom program you want. The overriding is global and applies to |
| every subproject from there on. Here is how you would use it. |
| |
| In master project |
| |
| ```meson |
| subproject('mydep') |
| ``` |
| |
| In the called subproject: |
| |
| ```meson |
| prog = find_program('my_custom_script') |
| meson.override_find_program('mycodegen', prog) |
| ``` |
| |
| In master project (or, in fact, any subproject): |
| |
| ```meson |
| genprog = find_program('mycodegen') |
| ``` |
| |
| Now `genprog` points to the custom script. If the dependency had come |
| from the system, then it would point to the system version. |
| |
| You can also use the return value of `configure_file()` to override |
| a program in the same way as above: |
| |
| ```meson |
| prog_script = configure_file(input : 'script.sh.in', |
| output : 'script.sh', |
| configuration : cdata) |
| meson.override_find_program('mycodegen', prog_script) |
| ``` |
| |
| ## New functions: has_link_argument() and friends |
| |
| A new set of methods has been added to [compiler objects](Reference-manual.md#compiler-object) |
| to test if the linker supports given arguments. |
| |
| - `has_link_argument()` |
| - `has_multi_link_arguments()` |
| - `get_supported_link_arguments()` |
| - `first_supported_link_argument()` |
| |
| ## "meson help" now shows command line help |
| |
| Command line parsing is now less surprising. "meson help" is now |
| equivalent to "meson --help" and "meson help <subcommand>" is |
| equivalent to "meson <subcommand> --help", instead of creating a build |
| directory called "help" in these cases. |
| |
| ## Autogeneration of simple meson.build files |
| |
| A feature to generate a meson.build file compiling given C/C++ source |
| files into a single executable has been added to "meson init". By |
| default, it will take all recognizable source files in the current |
| directory. You can also specify a list of dependencies with the -d |
| flag and automatically invoke a build with the -b flag to check if the |
| code builds with those dependencies. |
| |
| For example, |
| |
| ```meson |
| meson init -fbd sdl2,gl |
| ``` |
| |
| will look for C or C++ files in the current directory, generate a |
| meson.build for them with the dependencies of sdl2 and gl and |
| immediately try to build it, overwriting any previous meson.build and |
| build directory. |
| |
| ## install_data() supports `rename:` |
| |
| The `rename:` keyword argument is used to change names of the installed |
| files. Here's how you install and rename the following files: |
| |
| - `file1.txt` into `share/myapp/dir1/data.txt` |
| - `file2.txt` into `share/myapp/dir2/data.txt` |
| |
| ```meson |
| install_data(['file1.txt', 'file2.txt'], |
| rename : ['dir1/data.txt', 'dir2/data.txt'], |
| install_dir : 'share/myapp') |
| ``` |
| |
| ## Support for lcc compiler for e2k (Elbrus) architecture |
| |
| In this version, a support for lcc compiler for Elbrus processors |
| based on [e2k microarchitecture](https://en.wikipedia.org/wiki/Elbrus_2000) |
| has been added. |
| |
| Examples of such CPUs: |
| * [Elbrus-8S](https://en.wikipedia.org/wiki/Elbrus-8S); |
| * Elbrus-4S; |
| * [Elbrus-2S+](https://en.wikipedia.org/wiki/Elbrus-2S%2B). |
| |
| Such compiler have a similar behavior as gcc (basic option compatibility), |
| but, in is not strictly compatible with gcc as of current version. |
| |
| Major differences as of version 1.21.22: |
| * it does not support LTO and PCH; |
| * it suffers from the same dependency file creation error as icc; |
| * it has minor differences in output, especially version output; |
| * it differently reacts to lchmod() detection; |
| * some backend messages are produced in ru_RU.KOI8-R even if LANG=C; |
| * its preprocessor treats some characters differently. |
| |
| So every noted difference is properly handled now in meson. |
| |
| ## String escape character sequence update |
| |
| Single-quoted strings in meson have been taught the same set of escape |
| sequences as in Python. It is therefore now possible to use arbitrary bytes in |
| strings, like for example `NUL` (`\0`) and other ASCII control characters. See |
| the chapter about [*Strings* in *Syntax*](Syntax.md#strings) for more |
| details. |
| |
| Potential backwards compatibility issue: Any valid escape sequence according to |
| the new rules will be interpreted as an escape sequence instead of the literal |
| characters. Previously only the following escape sequences were supported in |
| single-quote strings: `\'`, `\\` and `\n`. |
| |
| Note that the behaviour of triple-quoted (multiline) strings has not changed. |
| They behave like raw strings and do not support any escape sequences. |
| |
| ## New `forcefallback` wrap mode |
| |
| A new wrap mode was added, `--wrap-mode=forcefallback`. When this is set, |
| dependencies for which a fallback was provided will always use it, even |
| if an external dependency exists and satisfies the version requirements. |
| |
| ## Relaxing of target name requirements |
| |
| In earlier versions of Meson you could only have one target of a given name for each type. |
| For example you could not have two executables named `foo`. This requirement is now |
| relaxed so that you can have multiple targets with the same name, as long as they are in |
| different subdirectories. |
| |
| Note that projects that have multiple targets with the same name can not be built with |
| the `flat` layout or any backend that writes outputs in the same directory. |
| |
| ## Addition of OpenMP dependency |
| |
| An OpenMP dependency (`openmp`) has been added that encapsulates the various |
| flags used by compilers to enable OpenMP and checks for the existence of the |
| `omp.h` header. The `language` keyword may be passed to force the use of a |
| specific compiler for the checks. |
| |
| ## Added new partial_dependency method to dependencies and libraries |
| |
| It is now possible to use only part of a dependency in a target. This allows, |
| for example, to only use headers with convenience libraries to avoid linking |
| to the same library multiple times. |
| |
| ```meson |
| dep = dependency('xcb') |
| |
| helper = static_library( |
| 'helper', |
| ['helper1.c', 'helper2.c'], |
| dependencies : dep.partial_dependency(includes : true), |
| ] |
| |
| final = shared_library( |
| 'final', |
| ['final.c'], |
| dependencyes : dep, |
| ) |
| ``` |
| |
| A partial dependency will have the same name version as the full dependency it |
| is derived from, as well as any values requested. |
| |
| ## Improved generation of pkg-config files for static only libraries. |
| |
| Previously pkg-config files generated by the pkgconfig modules for static libraries |
| with dependencies could only be used in a dependencies with `static: true`. |
| |
| Now the generated file contains the needed dependencies libraries directly within |
| `Requires` and `Libs` for build static libraries passed via the `libraries` keyword |
| argument. |
| |
| Projects that install both a static and a shared version of a library should use |
| the result of [`both_libraries()`](Reference-manual.md#both_libraries) to the |
| pkg-config file generator or use [`configure_file()`](Reference-manual.md#configure_file) |
| for more complicated setups. |
| |
| ## Improvements to pkgconfig module |
| |
| A `StaticLibrary` or `SharedLibrary` object can optionally be passed |
| as first positional argument of the `generate()` method. If one is provided a |
| default value will be provided for all required fields of the pc file: |
| - `install_dir` is set to `pkgconfig` folder in the same location than the provided library. |
| - `description` is set to the project's name followed by the library's name. |
| - `name` is set to the library's name. |
| |
| Generating a .pc file is now as simple as: |
| |
| ``` |
| pkgconfig.generate(mylib) |
| ``` |
| |
| ## pkgconfig.generate() requires parameters non-string arguments |
| |
| `pkgconfig.generate()` `requires:` and `requires_private:` keyword arguments |
| now accept pkgconfig-dependencies and libraries that pkgconfig-files were |
| generated for. |
| |
| ## Generic python module |
| |
| Meson now has is a revamped and generic (python 2 and 3) version of the python3 |
| module. With [this new interface](Python-module.md), projects can now fully |
| specify the version of python they want to build against / install sources to, |
| and can do so against multiple major or minor versions in parallel. |
| |
| ## test() now supports the `depends:` keyword argument |
| |
| Build targets and custom targets can be listed in the `depends:` keyword argument |
| of test function. These targets will be built before test is run even if they have |
| `build_by_default : false`. |