# Reference tables

## Compiler ids

These are return values of the `get_id` (Compiler family) and
`get_argument_syntax` (Argument syntax) method in a compiler object.

| Value     | Compiler family                  | Argument syntax |
| -----     | ---------------                  | --------------- |
| arm       | ARM compiler                     |                 |
| armclang  | ARMCLANG compiler                |                 |
| ccomp     | The CompCert formally-verified C compiler |        |
| ccrx      | Renesas RX Family C/C++ compiler |                 |
| clang     | The Clang compiler               | gcc             |
| clang-cl  | The Clang compiler (MSVC compatible driver) | msvc |
| dmd       | D lang reference compiler        |                 |
| emscripten| Emscripten WASM compiler         |                 |
| flang     | Classic Flang Fortran compiler   |                 |
| g95       | The G95 Fortran compiler         |                 |
| gcc       | The GNU Compiler Collection      | gcc             |
| intel     | Intel compiler (Linux and Mac)   | gcc             |
| intel-cl  | Intel compiler (Windows)         | msvc            |
| intel-llvm    | Intel oneAPI LLVM-based compiler            |                 |
| intel-llvm-cl | Intel oneAPI LLVM-based compiler (Windows)  | msvc            |
| lcc       | Elbrus C/C++/Fortran Compiler    |                 |
| llvm      | LLVM-based compiler (Swift, D)   |                 |
| llvm-flang| Flang Fortran compiler (LLVM-based) |              |
| mono      | Xamarin C# compiler              |                 |
| mwccarm   | Metrowerks C/C++ compiler for Embedded ARM         |                 |
| mwcceppc  | Metrowerks C/C++ compiler for Embedded PowerPC     |                 |
| msvc      | Microsoft Visual Studio          | msvc            |
| nagfor    | The NAG Fortran compiler         |                 |
| nvidia_hpc| NVidia HPC SDK compilers         |                 |
| nvcc      | NVidia CUDA compiler             |                 |
| open64    | The Open64 Fortran Compiler      |                 |
| pathscale | The Pathscale Fortran compiler   |                 |
| pgi       | Portland PGI C/C++/Fortran compilers |             |
| rustc     | Rust compiler                    |                 |
| sun       | Sun Fortran compiler             |                 |
| c2000     | Texas Instruments C/C++ Compiler (C2000) |                 |
| c6000     | Texas Instruments C/C++ Compiler (C6000) |                 |
| ti        | Texas Instruments C/C++ Compiler |                 |
| valac     | Vala compiler                    |                 |
| xc16      | Microchip XC16 C compiler        |                 |
| xc32-gcc  | Microchip XC32 C/C++ compiler    | gcc             |
| cython    | The Cython compiler              |                 |
| nasm      | The NASM compiler (Since 0.64.0) |                 |
| yasm      | The YASM compiler (Since 0.64.0) |                 |
| ml        | Microsoft Macro Assembler for x86 and x86_64 (Since 0.64.0) | msvc |
| armasm    | Microsoft Macro Assembler for ARM and AARCH64 (Since 0.64.0) | |
| mwasmarm        | Metrowerks Assembler for Embedded ARM | |
| mwasmeppc       | Metrowerks Assembler for Embedded PowerPC | |
| tasking         | TASKING VX-toolset     | |

## Linker ids

These are return values of the `get_linker_id` method in a compiler object.

| Value      | Linker family                               |
| -----      | ---------------                             |
| ld.bfd     | The GNU linker                              |
| ld.eld     | Qualcomm's embedded linker                  |
| ld.gold    | The GNU gold linker                         |
| ld.lld     | The LLVM linker, with the GNU interface     |
| ld.mold    | The fast MOLD linker                        |
| ld.solaris | Solaris and illumos                         |
| ld.wasm    | emscripten's wasm-ld linker                 |
| ld.zigcc   | The Zig linker (C/C++ frontend; GNU-like)   |
| ld64       | Apple ld64                                  |
| ld64.lld   | The LLVM linker, with the ld64 interface    |
| link       | MSVC linker                                 |
| lld-link   | The LLVM linker, with the MSVC interface    |
| xilink     | Used with Intel-cl only, MSVC like          |
| optlink    | optlink (used with DMD)                     |
| rlink      | The Renesas linker, used with CCrx only     |
| xc16-ar    | The Microchip linker, used with XC16 only   |
| ld.xc32    | The Microchip linker, used with XC32 only   |
| ar2000     | The Texas Instruments linker, used with C2000 only |
| ti-ar      | The Texas Instruments linker |
| ar6000     | The Texas Instruments linker, used with C6000 only |
| armlink    | The ARM linker (arm and armclang compilers) |
| pgi        | Portland/Nvidia PGI                         |
| nvlink     | Nvidia Linker used with cuda                |
| ccomp      | CompCert used as the linker driver          |
| mwldarm    | The Metrowerks Linker with the ARM interface, used with mwccarm only |
| mwldeppc   | The Metrowerks Linker with the PowerPC interface, used with mwcceppc only |
| tasking    | TASKING VX-toolset                          |

For languages that don't have separate dynamic linkers such as C# and Java, the
`get_linker_id` will return the compiler name.

## Script environment variables

| Value               | Comment                         |
| -----               | -------                         |
| MESONINTROSPECT     | Command to run to run the introspection command, may be of the form `python /path/to/meson introspect`, user is responsible for splitting the path if necessary. |
| MESONREWRITE        | Command to run to run the rewriting command, only set when running `dist` scripts |
| MESON_BUILD_ROOT    | Absolute path to the build dir  |
| MESON_DIST_ROOT     | Points to the root of the staging directory, only set when running `dist` scripts |
| MESON_SOURCE_ROOT   | Absolute path to the source dir |
| MESON_SUBDIR        | Current subdirectory, only set for `run_command` |

## CPU families

These are returned by the `cpu_family` method of `build_machine`,
`host_machine` and `target_machine`. For cross compilation they are
set in the cross file.

| Value               | Comment                  |
| -----               | -------                  |
| aarch64             | 64 bit ARM processor     |
| alpha               | DEC Alpha processor      |
| arc                 | 32 bit ARC processor     |
| arm                 | 32 bit ARM processor     |
| avr                 | Atmel AVR processor      |
| c2000               | 32 bit C2000 processor   |
| c6000               | 32 bit C6000 processor   |
| csky                | 32 bit CSky processor    |
| dspic               | 16 bit Microchip dsPIC   |
| e2k                 | MCST Elbrus processor    |
| ft32                | 32 bit Bridgetek MCU     |
| ia64                | Itanium processor        |
| loongarch64         | 64 bit Loongson processor|
| m68k                | Motorola 68000 processor |
| microblaze          | MicroBlaze processor     |
| mips                | 32 bit MIPS processor    |
| mips64              | 64 bit MIPS processor    |
| msp430              | 16 bit MSP430 processor  |
| parisc              | HP PA-RISC processor     |
| pic24               | 16 bit Microchip PIC24   |
| pic32               | 32 bit Microchip PIC32   |
| ppc                 | 32 bit PPC processors    |
| ppc64               | 64 bit PPC processors    |
| riscv32             | 32 bit RISC-V Open ISA   |
| riscv64             | 64 bit RISC-V Open ISA   |
| rl78                | Renesas RL78             |
| rx                  | Renesas RX 32 bit MCU    |
| s390                | IBM zSystem s390         |
| s390x               | IBM zSystem s390x        |
| sh4                 | SuperH SH-4              |
| sparc               | 32 bit SPARC             |
| sparc64             | SPARC v9 processor       |
| sw_64               | 64 bit sunway processor  |
| wasm32              | 32 bit Webassembly       |
| wasm64              | 64 bit Webassembly       |
| x86                 | 32 bit x86 processor     |
| x86_64              | 64 bit x86 processor     |
| tricore             | Tricore 32 bit processor |


Any cpu family not listed in the above list is not guaranteed to
remain stable in future releases.

Those porting from autotools should note that Meson does not add
endianness to the name of the cpu_family. For example, autotools
will call little endian PPC64 "ppc64le", Meson will not, you must
also check the `.endian()` value of the machine for this information.

## Operating system names

These are provided by the `.system()` method call.

| Value               | Comment                         |
| -----               | -------                         |
| android             | Android or OpenHarmony / HarmonyOS (OHOS) |
| cygwin              | Cygwin or MSYS2 environment on Windows |
| darwin              | Either OSX or iOS |
| dragonfly           | DragonFly BSD |
| emscripten          | Emscripten's JavaScript environment |
| freebsd             | FreeBSD and its derivatives |
| gnu                 | GNU Hurd |
| haiku               | |
| linux               | |
| netbsd              | |
| openbsd             | |
| windows             | Native Windows (not Cygwin or MSYS2) |
| sunos               | illumos and Solaris |
| os/2                | OS/2 |
| fuchsia             | Google's Fuchsia |

Any string not listed above is not guaranteed to remain stable in
future releases.

## Kernel names (since 1.2.0)

Native names as returned by the `.kernel()` method.

| Value               | Comment                         |
| -----               | -------                         |
| linux   | |
| freebsd | |
| openbsd | |
| netbsd  | |
| gnu     | GNU Hurd |
| nt      | |
| xnu                 | Kernel of various Apple OSes    |
| illumos             | Kernel derived from OpenSolaris by community efforts |
| solaris             | Kernel derived from OpenSolaris by Oracle |
| dragonfly | |
| haiku| |
| fuchsia             | Google's Fuchsia |
| none                | For e.g. bare metal embedded    |


## Subsystem names (since 1.2.0)

A more specific description of the system in question. Most values are
meant to be used in cross files only, as those platforms can not run
Meson natively.

### `darwin` subsystems

Set when `system` is `darwin`.

| Value               | Comment                         |
| -----               | -------                         |
| macos               | Apple macOS (formerly OSX)      |
| ios                 | Apple iOS                       |
| ios-simulator       |                                 |
| tvos                | Apple tvOS                      |
| tvos-simulator      |                                 |
| visionos            | Apple visionOS                  |
| visionos-simulator  |                                 |
| watchos             | Apple watchOS                   |
| watchos-simulator   |                                 |

### `android` subsystems (since 1.12.0)

Set when `system` is `android`.

| Value               | Comment                         |
| -----               | -------                         |
| android             | Android (Bionic libc)           |
| ohos                | OpenHarmony / HarmonyOS (OHOS)  |

## Language arguments parameter names

These are the parameter names for passing language specific arguments
to your build target.

| Language      | compiler name  | linker name       |
| ------------- | -------------- | ----------------- |
| C             | c_args         | c_link_args       |
| C++           | cpp_args       | cpp_link_args     |
| C#            | cs_args        | cs_link_args      |
| CUDA          | cuda_args      | cuda_link_args    |
| D             | d_args         | d_link_args       |
| Fortran       | fortran_args   | fortran_link_args |
| Java          | java_args      | java_link_args    |
| Objective C   | objc_args      | objc_link_args    |
| Objective C++ | objcpp_args    | objcpp_link_args  |
| Rust          | rust_args      | rust_link_args    |
| Vala          | vala_args      | vala_link_args    |
| Cython        | cython_args    | cython_link_args  |
| NASM          | nasm_args      | N/A               |
| MASM          | masm_args      | N/A               |
| Linear ASM    | linearasm_args | N/A               |

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

## Compiler and linker flag environment variables

These environment variables will be used to modify the compiler and
linker flags.

It is recommended that you **do not use these**. They are provided
purely to for backwards compatibility with other build systems. There
are many caveats to their use, especially when rebuilding the project.
It is **highly** recommended that you use [the command line
arguments](#language-arguments-parameter-names) instead.

| Name        | Comment                                  |
| -----       | -------                                  |
| CFLAGS      | Flags for the C compiler                 |
| CXXFLAGS    | Flags for the C++ compiler               |
| CUFLAGS     | Flags for the CUDA compiler              |
| OBJCFLAGS   | Flags for the Objective C compiler       |
| FFLAGS      | Flags for the Fortran compiler           |
| DFLAGS      | Flags for the D compiler                 |
| VALAFLAGS   | Flags for the Vala compiler              |
| RUSTFLAGS   | Flags for the Rust compiler              |
| CYTHONFLAGS | Flags for the Cython compiler            |
| LDFLAGS     | The linker flags, used for all languages |

N.B. these settings are specified per machine, and so the environment
variables actually come in pairs. See the [environment variables per
machine](#Environment-variables-per-machine) section for details.

## Function Attributes

These are the parameters names that are supported using
`compiler.has_function_attribute()` or
`compiler.get_supported_function_attributes()`

### GCC `__attribute__`

These values are supported using the GCC style `__attribute__` annotations,
which are supported by GCC, Clang, and other compilers.


| Name                        |
|-----------------------------|
| alias                       |
| aligned                     |
| alloc_size                  |
| always_inline               |
| artificial                  |
| cold                        |
| const                       |
| constructor                 |
| constructor_priority        |
| counted_by⁸                 |
| deprecated                  |
| destructor                  |
| error                       |
| externally_visible          |
| fallthrough                 |
| flatten                     |
| format                      |
| format_arg                  |
| force_align_arg_pointer³    |
| gnu_inline                  |
| hot                         |
| ifunc                       |
| malloc                      |
| noclone                     |
| noinline                    |
| nonnull                     |
| noreturn                    |
| nothrow                     |
| null_terminated_string_arg⁷ |
| optimize                    |
| packed                      |
| pure                        |
| retain⁴                     |
| returns_nonnull             |
| section⁵                    |
| sentinel⁵                   |
| unused                      |
| used                        |
| vector_size⁶                |
| visibility*                 |
| visibility:default†         |
| visibility:hidden†          |
| visibility:internal†        |
| visibility:protected†       |
| warning                     |
| warn_unused_result          |
| weak                        |
| weakref                     |

\* *Changed in 0.52.0* the "visibility" target no longer includes
"protected", which is not present in Apple's clang.

† *New in 0.52.0* These split visibility attributes are preferred to the plain
"visibility" as they provide narrower checks.

³ *New in 0.55.0*

⁴ *New in 0.62.0*

⁵ *New in 0.63.0*

⁶ *New in 1.1.0*

⁷ *New in 1.5.0*

⁸ *New in 1.10.0*

### MSVC __declspec

These values are supported using the MSVC style `__declspec` annotation,
which are supported by MSVC, GCC, Clang, and other compilers.

| Name                 |
|----------------------|
| dllexport            |
| dllimport            |


## Dependency lookup methods

These are the values that can be passed to `dependency` function's
`method` keyword argument.

| Name              | Comment                                      |
| -----             | -------                                      |
| auto              | Automatic method selection                   |
| pkg-config        | Use Pkg-Config                               |
| cmake             | Look up as a CMake module                    |
| config-tool       | Use a custom dep tool such as `cups-config`  |
| system            | System provided (e.g. OpenGL)                |
| extraframework    | A macOS/iOS framework                        |


## Compiler and Linker selection variables

N.B. these settings are specified per machine, and so the environment
variables actually come in pairs. See the [environment variables per
machine](#Environment-variables-per-machine) section for details.

| Language      | Compiler | Linker    | Note                                        |
|---------------|----------|-----------|---------------------------------------------|
| C             | CC       | CC_LD     |                                             |
| C++           | CXX      | CXX_LD    |                                             |
| D             | DC       | DC_LD     | Before 0.54 D_LD*                           |
| Fortran       | FC       | FC_LD     | Before 0.54 F_LD*                           |
| Objective-C   | OBJC     | OBJC_LD   |                                             |
| Objective-C++ | OBJCXX   | OBJCXX_LD | Before 0.54 OBJCPP_LD*                      |
| Rust          | RUSTC    | RUSTC_LD  | Before 0.54 RUST_LD*                        |
| Vala          | VALAC    |           | Use CC_LD. Vala transpiles to C             |
| C#            | CSC      | CSC       | The linker is the compiler                  |
| Cython        | CYTHON   |           |                                             |
| nasm          | NASM     |           | Uses the C linker                           |
| archiver      |          | AR        |                                             |

*The old environment variables are still supported, but are deprecated
and will be removed in a future version of Meson.

*changed in 1.3.0* Paths with spaces were split unconditionally to extract
components such as the [path to Ccache](Feature-autodetection.md#ccache),
intrinsic compiler flags like `-m32` or `--target`, etc. This broke passing
a hardcoded compiler path to CMake subprojects. To work around this, paths
must be wrapped with double quotes:

```bash
export CC='"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.34.31933/bin/Hostx64/x64/cl.exe"'
```

You can also set the values through [machine files](Machine-files.md#binaries).

*New in 1.3.0* Paths that point to an existing executable no longer need
wrapping:

```bash
export CC='C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.34.31933/bin/Hostx64/x64/cl.exe'
```


## Environment variables per machine

Since *0.54.0*, Following Autotool and other legacy build systems,
environment variables that affect machine-specific settings come in
pairs: for every bare environment variable `FOO`, there is a suffixed
`FOO_FOR_BUILD`, where `FOO` just affects the host machine
configuration, while `FOO_FOR_BUILD` just affects the build machine
configuration. For example:

 - `PKG_CONFIG_PATH_FOR_BUILD` 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 mirrors the `build.` prefix used for (built-in) Meson options,
which has the same meaning.

This is useful for cross builds. In the native builds, build = host,
and the unsuffixed environment variables alone will suffice.

Prior to *0.54.0*, there was no `_FOR_BUILD`-suffixed variables, and
most environment variables only effected native machine
configurations, though this wasn't consistent (e.g. `PKG_CONFIG_PATH`
still affected cross builds).
