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.
[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:
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.
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
subproject('mydep')
In the called subproject:
prog = find_program('my_custom_script')
meson.override_find_program('mycodegen', prog)
In master project (or, in fact, any subproject):
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:
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 to test if the linker
supports given arguments.
compiler.has_link_argument()
compiler.has_multi_link_arguments()
compiler.get_supported_link_arguments()
compiler.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
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 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
intoshare/myapp/dir1/data.txt
-
file2.txt
intoshare/myapp/dir2/data.txt
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 has been added.
Examples of such CPUs:
- Elbrus-8S;
- Elbrus-4S;
- Elbrus-2S+.
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 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.
dep = dependency('xcb')
helper = static_library(
'helper',
['helper1.c', 'helper2.c'],
dependencies : dep.partial_dependency(includes : true),
]
final = shared_library(
'final',
['final.c'],
dependencies : 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()
to the
pkg-config file generator or use
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 topkgconfig
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, 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
.
The results of the search are