|
|
|
# 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*)
|
|
|
|
- `java_home` is an absolute path pointing to the root of a Java installation.
|
|
|
|
|
|
|
|
### 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_CXX_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.
|