| --- |
| 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: |
| |
| ```meson |
| 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`. |