The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
358 lines
9.7 KiB
358 lines
9.7 KiB
# Cross and Native File reference |
|
|
|
Cross and native files are nearly identical, but not completely. This |
|
is the documentation on the common values used by both, for the |
|
specific values of one or the other see the [cross |
|
compilation](Cross-compilation.md) and [native |
|
environments](Native-environments.md). |
|
|
|
*Changed in 0.56.0* Keys within sections are now case sensitive. This |
|
*is required to make project options work correctly. |
|
|
|
## Data Types |
|
|
|
There are four basic data types in a machine file: |
|
- strings |
|
- arrays |
|
- booleans |
|
- integers |
|
|
|
A string is specified single quoted: |
|
```ini |
|
[section] |
|
option1 = 'false' |
|
option2 = '2' |
|
``` |
|
|
|
An array is enclosed in square brackets, and must consist of strings or booleans |
|
```ini |
|
[section] |
|
option = ['value'] |
|
``` |
|
|
|
A boolean must be either `true` or `false`, and unquoted. |
|
```ini |
|
option = false |
|
``` |
|
|
|
An integer must be an unquoted numeric constant. |
|
```ini |
|
option = 42 |
|
``` |
|
|
|
## Sections |
|
|
|
The following sections are allowed: |
|
- constants |
|
- binaries |
|
- paths |
|
- properties |
|
- cmake |
|
- project options |
|
- built-in options |
|
|
|
### constants |
|
|
|
*Since 0.56.0* |
|
|
|
String and list concatenation is supported using the `+` operator, |
|
joining paths is supported using the `/` operator. Entries defined in |
|
the `[constants]` section can be used in any other section (they are |
|
always parsed first), entries in any other section can be used only |
|
within that same section and only after it has been defined. |
|
|
|
```ini |
|
[constants] |
|
toolchain = '/toolchain' |
|
common_flags = ['--sysroot=' + toolchain / 'sysroot'] |
|
|
|
[properties] |
|
c_args = common_flags + ['-DSOMETHING'] |
|
cpp_args = c_args + ['-DSOMETHING_ELSE'] |
|
|
|
[binaries] |
|
c = toolchain / 'gcc' |
|
``` |
|
|
|
This can be useful with cross file composition as well. A generic |
|
cross file could be composed with a platform specific file where |
|
constants are defined: |
|
|
|
```ini |
|
# aarch64.ini |
|
[constants] |
|
arch = 'aarch64-linux-gnu' |
|
``` |
|
|
|
```ini |
|
# cross.ini |
|
[binaries] |
|
c = arch + '-gcc' |
|
cpp = arch + '-g++' |
|
strip = arch + '-strip' |
|
pkgconfig = arch + '-pkg-config' |
|
... |
|
``` |
|
|
|
This can be used as `meson setup --cross-file aarch64.ini --cross-file |
|
cross.ini builddir`. |
|
|
|
Note that file composition happens before the parsing of values. The |
|
example below results in `b` being `'HelloWorld'`: |
|
|
|
```ini |
|
# file1.ini: |
|
[constants] |
|
a = 'Foo' |
|
b = a + 'World' |
|
``` |
|
|
|
```ini |
|
#file2.ini: |
|
[constants] |
|
a = 'Hello' |
|
``` |
|
|
|
The example below results in an error when file1.ini is included |
|
before file2.ini because `b` would be defined before `a`: |
|
|
|
```ini |
|
# file1.ini: |
|
[constants] |
|
b = a + 'World' |
|
``` |
|
|
|
```ini |
|
#file2.ini: |
|
[constants] |
|
a = 'Hello' |
|
``` |
|
|
|
### Binaries |
|
|
|
The binaries section contains a list of binaries. These can be used |
|
internally by Meson, or by the `find_program` function. |
|
|
|
These values must be either strings or an array of strings |
|
|
|
Compilers and linkers are defined here using `<lang>` and `<lang>_ld`. |
|
`<lang>_ld` is special because it is compiler specific. For compilers |
|
like gcc and clang which are used to invoke the linker this is a value |
|
to pass to their "choose the linker" argument (-fuse-ld= in this |
|
case). For compilers like MSVC and Clang-Cl, this is the path to a |
|
linker for Meson to invoke, such as `link.exe` or `lld-link.exe`. |
|
Support for `ld` is *new in 0.53.0* |
|
|
|
*changed in 0.53.1* the `ld` variable was replaced by `<lang>_ld`, |
|
*because it regressed a large number of projects. in 0.53.0 the `ld` |
|
*variable was used instead. |
|
|
|
Native example: |
|
|
|
```ini |
|
c = '/usr/bin/clang' |
|
c_ld = 'lld' |
|
sed = 'C:\\program files\\gnu\\sed.exe' |
|
llvm-config = '/usr/lib/llvm8/bin/llvm-config' |
|
``` |
|
|
|
Cross example: |
|
|
|
```ini |
|
c = ['ccache', '/usr/bin/i586-mingw32msvc-gcc'] |
|
cpp = ['ccache', '/usr/bin/i586-mingw32msvc-g++'] |
|
c_ld = 'gold' |
|
cpp_ld = 'gold' |
|
ar = '/usr/i586-mingw32msvc/bin/ar' |
|
strip = '/usr/i586-mingw32msvc/bin/strip' |
|
pkgconfig = '/usr/bin/i586-mingw32msvc-pkg-config' |
|
``` |
|
|
|
An incomplete list of internally used programs that can be overridden |
|
here is: |
|
|
|
- cmake |
|
- cups-config |
|
- gnustep-config |
|
- gpgme-config |
|
- libgcrypt-config |
|
- libwmf-config |
|
- llvm-config |
|
- pcap-config |
|
- pkgconfig |
|
- sdl2-config |
|
- wx-config (or wx-3.0-config or wx-config-gtk) |
|
|
|
### Paths and Directories |
|
|
|
*Deprecated in 0.56.0* use the built-in section instead. |
|
|
|
As of 0.50.0 paths and directories such as libdir can be defined in |
|
the native and cross files in a paths section. These should be |
|
strings. |
|
|
|
```ini |
|
[paths] |
|
libdir = 'mylibdir' |
|
prefix = '/my prefix' |
|
``` |
|
|
|
These values will only be loaded when not cross compiling. Any |
|
arguments on the command line will override any options in the native |
|
file. For example, passing `--libdir=otherlibdir` would result in a |
|
prefix of `/my prefix` and a libdir of `otherlibdir`. |
|
|
|
### Properties |
|
|
|
*New in native files in 0.54.0*, always in cross files. |
|
|
|
In addition to special data that may be specified in cross files, this |
|
section may contain random key value pairs accessed using the |
|
`meson.get_external_property()`, or `meson.get_cross_property()`. |
|
|
|
*Changed in 0.56.0* putting `<lang>_args` and `<lang>_link_args` in |
|
the properties section has been deprecated, and should be put in the |
|
built-in options section. |
|
|
|
#### Supported properties |
|
|
|
This is a non exhaustive list of supported variables in the `[properties]` |
|
section. |
|
|
|
- `cmake_toolchain_file` specifies an absolute path to an already existing |
|
CMake toolchain file that will be loaded with `include()` as the last |
|
instruction of the automatically generated CMake toolchain file from Meson. |
|
(*new in 0.56.0*) |
|
- `cmake_defaults` is a boolean that specifies whether Meson should automatically |
|
generate default toolchain variables from other sections (`binaries`, |
|
`host_machine`, etc.) in the machine file. Defaults are always overwritten |
|
by variables set in the `[cmake]` section. The default is `true`. (*new in 0.56.0*) |
|
- `cmake_skip_compiler_test` is an enum that specifies when Meson should |
|
automatically generate toolchain variables to skip the CMake compiler |
|
sanity checks. This only has an effect if `cmake_defaults` is `true`. |
|
Supported values are `always`, `never`, `dep_only`. The default is `dep_only`. |
|
(*new in 0.56.0*) |
|
- `cmake_use_exe_wrapper` is a boolean that controls whether to use the |
|
`exe_wrapper` specified in `[binaries]` to run generated executables in CMake |
|
subprojects. This setting has no effect if the `exe_wrapper` was not specified. |
|
The default value is `true`. (*new in 0.56.0*) |
|
|
|
### CMake variables |
|
|
|
*New in 0.56.0* |
|
|
|
All variables set in the `[cmake]` section will be added to the |
|
generate CMake toolchain file used for both CMake dependencies and |
|
CMake subprojects. The type of each entry must be either a string or a |
|
list of strings. |
|
|
|
**Note:** All occurrences of `\` in the value of all keys will be replaced with |
|
a `/` since CMake has a lot of issues with correctly escaping `\` when |
|
dealing with variables (even in cases where a path in `CMAKE_C_COMPILER` |
|
is correctly escaped, CMake will still trip up internaly for instance) |
|
|
|
A custom toolchain file should be used (via the `cmake_toolchain_file` |
|
property) if `\` support is required. |
|
|
|
```ini |
|
[cmake] |
|
|
|
CMAKE_C_COMPILER = '/usr/bin/gcc' |
|
CMAKE_CXX_COMPILER = 'C:\\user\\bin\\g++' |
|
CMAKE_SOME_VARIABLE = ['some', 'value with spaces'] |
|
``` |
|
|
|
For instance, the `[cmake]` section from above will generate the |
|
following code in the CMake toolchain file: |
|
|
|
```cmake |
|
set(CMAKE_C_COMPILER "/usr/bin/gcc") |
|
set(CMAKE_C_COMPILER "C:/usr/bin/g++") |
|
set(CMAKE_SOME_VARIABLE "some" "value with spaces") |
|
``` |
|
|
|
### Project specific options |
|
|
|
*New in 0.56.0* |
|
|
|
Path options are not allowed, those must be set in the `[paths]` |
|
section. |
|
|
|
Being able to set project specific options in a cross or native file |
|
can be done using the `[project options]` section of the specific file |
|
(if doing a cross build the options from the native file will be |
|
ignored) |
|
|
|
For setting options in subprojects use the `[<subproject>:project |
|
options]` section instead. |
|
|
|
```ini |
|
[project options] |
|
build-tests = true |
|
|
|
[zlib:project options] |
|
build-tests = false |
|
``` |
|
|
|
### Meson built-in options |
|
|
|
Meson built-in options can be set the same way: |
|
|
|
```ini |
|
[built-in options] |
|
c_std = 'c99' |
|
``` |
|
|
|
You can set some Meson built-in options on a per-subproject basis, |
|
such as `default_library` and `werror`. The order of precedence is: |
|
|
|
1) Command line |
|
2) Machine file |
|
3) Build system definitions |
|
|
|
```ini |
|
[zlib:built-in options] |
|
default_library = 'static' |
|
werror = false |
|
``` |
|
|
|
Options set on a per-subproject basis will inherit the option from the |
|
parent if the parent has a setting but the subproject doesn't, even |
|
when there is a default set Meson language. |
|
|
|
```ini |
|
[built-in options] |
|
default_library = 'static' |
|
``` |
|
|
|
will make subprojects use default_library as static. |
|
|
|
Some options can be set on a per-machine basis (in other words, the |
|
value of the build machine can be different than the host machine in a |
|
cross compile). In these cases the values from both a cross file and a |
|
native file are used. |
|
|
|
An incomplete list of options is: |
|
- pkg_config_path |
|
- cmake_prefix_path |
|
|
|
## Loading multiple machine files |
|
|
|
Native files allow layering (cross files can be layered since Meson |
|
0.52.0). More than one file can be loaded, with values from a previous |
|
file being overridden by the next. The intention of this is not |
|
overriding, but to allow composing files. This composition is done by |
|
passing the command line argument multiple times: |
|
|
|
```console |
|
meson setup builddir/ --cross-file first.ini --cross-file second.ini --cross-file thrid.ini |
|
``` |
|
|
|
In this case `first.ini` will be loaded, then `second.ini`, with |
|
values from `second.ini` replacing `first.ini`, and so on. |
|
|
|
For example, if there is a project using C and C++, python 3.4-3.7, |
|
and LLVM 5-7, and it needs to build with clang 5, 6, and 7, and gcc |
|
5.x, 6.x, and 7.x; expressing all of these configurations in |
|
monolithic configurations would result in 81 different native files. |
|
By layering them, it can be expressed by just 12 native files.
|
|
|