---
short-description: Built-in options to configure project properties
...

# Built-in options

Meson provides two kinds of options: [build options provided by the
build files](Build-options.md) and built-in options that are either
universal options, base options, compiler options.

## Universal options

A list of these options can be found by running `meson --help`. All
these can be set by passing `-Doption=value` to `meson` (aka `meson setup`), or
by setting them inside `default_options` of `project()` in your `meson.build`.
Some options can also be set by `--option=value`, or `--option value`--- a list
is shown by running `meson setup --help`.

For legacy reasons `--warnlevel` is the cli argument for the `warning_level` option.

They can also be edited after setup using `meson configure -Doption=value`.

Installation options are all relative to the prefix, except:

* When the prefix is `/usr`: `sysconfdir` defaults to `/etc`, `localstatedir` defaults to `/var`, and `sharedstatedir` defaults to `/var/lib`
* When the prefix is `/usr/local`: `localstatedir` defaults to `/var/local`, and `sharedstatedir` defaults to `/var/local/lib`

### Directories

| Option                               | Default value | Description |
| ------                               | ------------- | ----------- |
| prefix                               | see below     | Installation prefix |
| bindir                               | bin           | Executable directory |
| datadir                              | share         | Data file directory |
| includedir                           | include       | Header file directory |
| infodir                              | share/info    | Info page directory |
| libdir                               | see below     | Library directory |
| libexecdir                           | libexec       | Library executable directory |
| localedir                            | share/locale  | Locale data directory |
| localstatedir                        | var           | Localstate data directory |
| mandir                               | share/man     | Manual page directory |
| sbindir                              | sbin          | System executable directory |
| sharedstatedir                       | com           | Architecture-independent data directory |
| sysconfdir                           | etc           | Sysconf data directory |


`prefix` defaults to `C:/` on Windows, and `/usr/local` otherwise. You should always
override this value.

`libdir` is automatically detected based on your platform, it should be
correct when doing "native" (build machine == host machine) compilation. For
cross compiles meson will try to guess the correct libdir, but it may not be
accurate, especially on Linux where different distributions have different
defaults. Using a [cross file](Cross-compilation.md#defining-the-environment),
particularly the paths section may be necessary.

### Core options

Options that are labeled "per machine" in the table are set per machine. See
the [specifying options per machine](#specifying-options-per-machine) section
for details.

| Option                               | Default value | Description                                                    | Is per machine | Is per subproject |
| ------                               | ------------- | -----------                                                    | -------------- | ----------------- |
| auto_features {enabled, disabled, auto} | auto       | Override value of all 'auto' features                          | no             | no                |
| backend {ninja, vs,<br>vs2010, vs2015, vs2017, vs2019, xcode} | ninja | Backend to use                                | no             | no                |
| buildtype {plain, debug,<br>debugoptimized, release, minsize, custom} | debug |  Build type to use                    | no             | no                |
| debug                                | true          | Debug                                                          | no             | no                |
| default_library {shared, static, both} | shared      | Default library type                                           | no             | yes               |
| errorlogs                            | true          | Whether to print the logs from failing tests.                  | no             | no                |
| install_umask {preserve, 0000-0777}  | 022           | Default umask to apply on permissions of installed files       | no             | no                |
| layout {mirror,flat}                 | mirror        | Build directory layout                                         | no             | no                |
| optimization {0, g, 1, 2, 3, s}      | 0             | Optimization level                                             | no             | no                |
| pkg_config_path {OS separated path}  | ''            | Additional paths for pkg-config to search before builtin paths | yes            | no                |
| cmake_prefix_path                    | []            | Additional prefixes for cmake to search before builtin paths   | yes            | no                |
| stdsplit                             | true          | Split stdout and stderr in test logs                           | no             | no                |
| strip                                | false         | Strip targets on install                                       | no             | no                |
| unity {on, off, subprojects}         | off           | Unity build                                                    | no             | no                |
| unity_size {>=2}                     | 4             | Unity file block size                                          | no             | no                |
| warning_level {0, 1, 2, 3}           | 1             | Set the warning level. From 0 = none to 3 = highest            | no             | yes               |
| werror                               | false         | Treat warnings as errors                                       | no             | yes               |
| wrap_mode {default, nofallback,<br>nodownload, forcefallback, nopromote} | default | Wrap mode to use                 | no             | no                |
| force_fallback_for                   | []            | Force fallback for those dependencies                          | no             | no                |

<a name="build-type-options"></a>
For setting optimization levels and toggling debug, you can either set the
`buildtype` option, or you can set the `optimization` and `debug` options which
give finer control over the same. Whichever you decide to use, the other will
be deduced from it. For example, `-Dbuildtype=debugoptimized` is the same as
`-Ddebug=true -Doptimization=2` and vice-versa. This table documents the
two-way mapping:

| buildtype      | debug | optimization |
| ---------      | ----- | ------------ |
| plain          | false | 0            |
| debug          | true  | 0            |
| debugoptimized | true  | 2            |
| release        | false | 3            |
| minsize        | true  | s            |

All other combinations of `debug` and `optimization` set `buildtype` to `'custom'`.

## Base options

These are set in the same way as universal options, either by `-Doption=value`, 
or by setting them inside `default_options` of `project()` in your `meson.build`.
However, they cannot be shown in the
output of `meson --help` because they depend on both the current platform and
the compiler that will be selected. The only way to see them is to setup
a builddir and then run `meson configure` on it with no options.

The following options are available. Note that they may not be available on all
platforms or with all compilers:

| Option      | Default value | Possible values         | Description |
| ----------- | ------------- | ---------------         | ----------- |
| b_asneeded  | true          | true, false             | Use -Wl,--as-needed when linking |
| b_bitcode   | false         | true, false             | Embed Apple bitcode, see below |
| b_colorout  | always        | auto, always, never     | Use colored output |
| b_coverage  | false         | true, false             | Enable coverage tracking |
| b_lundef    | true          | true, false             | Don't allow undefined symbols when linking |
| b_lto       | false         | true, false             | Use link time optimization |
| b_ndebug    | false         | true, false, if-release | Disable asserts |
| b_pch       | true          | true, false             | Use precompiled headers |
| b_pgo       | off           | off, generate, use      | Use profile guided optimization |
| b_sanitize  | none          | see below               | Code sanitizer to use |
| b_staticpic | true          | true, false             | Build static libraries as position independent |
| b_pie       | false         | true, false             | Build position-independent executables (since 0.49.0)|
| b_vscrt     | from_buildtype| none, md, mdd, mt, mtd, from_buildtype, static_from_buildtype | VS runtime library to use (since 0.48.0) (static_from_buildtype since 0.56.0) |

The value of `b_sanitize` can be one of: `none`, `address`, `thread`,
`undefined`, `memory`, `address,undefined`.

<a name="b_vscrt-from_buildtype"></a>
The default value of `b_vscrt` is `from_buildtype`. The following table is used
internally to pick the CRT compiler arguments for `from_buildtype` or
`static_from_buildtype` *(since 0.56)* based on the value of the `buildtype` option:

| buildtype      | from_buildtype | static_from_buildtype |
| --------       | -------------- | --------------------- |
| debug          | `/MDd`         | `/MTd`                |
| debugoptimized | `/MD`          | `/MT`                 |
| release        | `/MD`          | `/MT`                 |
| minsize        | `/MD`          | `/MT`                 |
| custom         | error!         | error!                |

### Notes about Apple Bitcode support

`b_bitcode` will pass `-fembed-bitcode` while compiling and will pass
`-Wl,-bitcode_bundle` while linking. These options are incompatible with
`b_asneeded`, so that option will be silently disabled.

[Shared modules](Reference-manual.md#shared_module) will not have bitcode
embedded because `-Wl,-bitcode_bundle` is incompatible with both `-bundle` and
`-Wl,-undefined,dynamic_lookup` which are necessary for shared modules to work.

## Compiler options

Same caveats as base options above.

The following options are available. They can be set by passing `-Doption=value`
to `meson`. Note that both the options themselves and
the possible values they can take will depend on the target platform or
compiler being used:

| Option           | Default value | Possible values                          | Description |
| ------           | ------------- | ---------------                          | ----------- |
| c_args           |               | free-form comma-separated list           | C compile arguments to use |
| c_link_args      |               | free-form comma-separated list           | C link arguments to use |
| c_std            | none          | none, c89, c99, c11, c17, c18, c2x, gnu89, gnu99, gnu11, gnu17, gnu18, gnu2x | C language standard to use |
| c_winlibs        | see below     | free-form comma-separated list           | Standard Windows libs to link against |
| c_thread_count   | 4             | integer value ≥ 0                        | Number of threads to use with emcc when using threads |
| cpp_args         |               | free-form comma-separated list           | C++ compile arguments to use |
| cpp_link_args    |               | free-form comma-separated list           | C++ link arguments to use |
| cpp_std          | none          | none, c++98, c++03, c++11, c++14, c++17, c++2a <br/>c++1z, gnu++03, gnu++11, gnu++14, gnu++17, gnu++1z, gnu++2a, <br/> vc++14, vc++17, vc++latest | C++ language standard to use |
| cpp_debugstl     | false         | true, false                              | C++ STL debug mode |
| cpp_eh           | default       | none, default, a, s, sc                  | C++ exception handling type |
| cpp_rtti         | true          | true, false                              | Whether to enable RTTI (runtime type identification) |
| cpp_thread_count | 4             | integer value ≥ 0                        | Number of threads to use with emcc when using threads |
| cpp_winlibs      | see below     | free-form comma-separated list           | Standard Windows libs to link against |
| fortran_std      | none          | [none, legacy, f95, f2003, f2008, f2018] | Fortran language standard to use |

The default values of `c_winlibs` and `cpp_winlibs` are in compiler-specific
argument forms, but the libraries are: kernel32, user32, gdi32, winspool,
shell32, ole32, oleaut32, uuid, comdlg32, advapi32.

All these `<lang>_*` options are specified per machine. See below in the
[specifying options per machine](#specifying-options-per-machine) section on
how to do this in cross builds.

When using MSVC, `cpp_eh=none` will result in no exception flags being passed,
while the `cpp_eh=[value]` will result in `/EH[value]`.
Since *0.51.0* `cpp_eh=default` will result in `/EHsc` on MSVC. When using
gcc-style compilers, nothing is passed (allowing exceptions to work), while
`cpp_eh=none` passes `-fno-exceptions`.

Since *0.54.0* The `<lang>_thread_count` option can be used to control the
value passed to `-s PTHREAD_POOL_SIZE` when using emcc. No other c/c++
compiler supports this option.

## Specifying options per machine

Since *0.51.0*, some options are specified per machine rather than globally for
all machine configurations. Prefixing the option with `build.` just affects the
build machine configuration, while unprefixed just affects the host machine
configuration, respectively. For example:

 - `build.pkg_config_path` controls the paths pkg-config will search for just
   `native: true` dependencies (build machine).

 - `pkg_config_path` controls the paths pkg-config will search for just
   `native: false` dependencies (host machine).

This is useful for cross builds. In the native builds, build = host, and the
unprefixed option alone will suffice.

Prior to *0.51.0*, these options just effected native builds when specified on
the command line, as there was no `build.` prefix. Similarly named fields in
the `[properties]` section of the cross file would effect cross compilers, but
the code paths were fairly different allowing differences in behavior to crop
out.

## Specifying options per subproject

Since *0.54.0* `default_library` and `werror` built-in options can be defined
per subproject. This is useful for example when building shared libraries in the
main project, but static link a subproject, or when the main project must build
with no warnings but some subprojects cannot.

Most of the time this would be used either by the parent project by setting
subproject's default_options (e.g. `subproject('foo', default_options: 'default_library=static')`),
or by the user using the command line `-Dfoo:default_library=static`.

The value is overriden in this order:
- Value from parent project
- Value from subproject's default_options if set
- Value from subproject() default_options if set
- Value from command line if set

Since 0.56.0 `warning_level` can also be defined per subproject.
