|
|
|
# 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 either 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 absoulte 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 varaibles 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 controlls 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 occurances 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.
|