---
name: "meson.build"
section: "5"
platform: "linux"
package: "muon-meson"
version: "0.4.0-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/meson.build"
---

# meson.build(5)

a build system dsl

## NAME

meson.build - a build system dsl

## DESCRIPTION

The meson dsl is a dynamically typed language, similar to other interpreted languages like python and ruby.  All objects are immutable. Functions cannot be defined, only built-in functions are available.

- •

  **STRUCTURE** - overview of source and project layout

- •

  **TYPES** - information on all primitive types

- •

  **SYNTAX** - description of syntax and keywords

## STRUCTURE

All meson projects must have a file called \`meson.build\` at the project root. This is the root build file.  This file must have a call to the \`project()\` function as its first statement.  Additional \`meson.build\` files may reside in any subdirectories of the project.  These build files are then executed with the \`subdir()\` function.

## TYPES

The meson build system dsl contains most of the common types that would be expected:

- •

  booleans (written as \`true\` and \`false\`)

- •

  integers

- •

  strings

- •

  arrays

- •

  dictionaries

### Booleans

Booleans are either \`true\` or \`false\`.

**OPERATORS**

- •

  \`and\` - logical and

- •

  \`or\` - logical or

- •

  \`not\` - logical and

### Integers

You can specify an integer literal using decimal, hexadecimal, octal, and binary.

```
int_1 = 1
int_42 = 42
int_255 = 0xFF
int_493 = 0o755
int_1365 = 0b10101010101
```

All common arithmetic operations are implemented for integers: addition, subtraction, division, multiplication, and modulo.

**OPERATORS**

- •

  \`\*\` - multiplication

- •

  \`/\` - integer division

- •

  \`%\` - modulo (remainder)

- •

  \`+\` - addition

- •

  \`-\` - subtraction

- •

  \`==\` - equal to

- •

  \`!=\` - not equal to

- •

  \`\<\` - less than

- •

  \`\>\` - greater than

- •

  \`\<=\` - less than or equal to

- •

  \`\>=\` - greater than or equal to

### Strings

Strings in Meson are declared with single quotes.  \`\` is the escape character.

The full list of escape sequences is:

- •

  \`\\\` Backslash

- •

  \`'\` Single quote

- •

  \`a\` Bell

- •

  \`b\` Backspace

- •

  \`f\` Formfeed

- •

  \`n\` Newline

- •

  \`r\` Carriage Return

- •

  \`t\` Horizontal Tab

- •

  \`v\` Vertical Tab

- •

  \`ooo\` Character with octal value ooo, up to 3 digits long

- •

  \`xhh\` Character with hex value hh

- •

  \`uxxxx\` Character with 16-bit hex value xxxx

- •

  \`Uxxxxxxxx\` Character with 32-bit hex value xxxxxxxx

- •

  \`N{name}\` Character named name in Unicode database

Multi-line strings are surrounded by 3 consecutive quotes.  These are raw strings that do not support the escape sequences listed above.

Format strings are expressed by a placing leading \`f\` before the first opening quote.  Inside of a format string, sequences of the form \`@\[a-z\_\]+@\` will be substituted with the value of the matching variable.  This variable can be of type bool, int, or str.

```
name = 'Alice'
# prints "Hello Alice"
message(f'Hello @name@')
```

**OPERATORS**

- •

  \`+\` - concatenate two strings

- •

  \`/\` - concatenate two strings as if \`join\_paths()\` was called

- •

  \`\[int\]\` -  access the character at index

- •

  \`\<str\> in \<str\>\` - check if str is a substring

- •

  \`\<str\> not in \<str\>\` - check if str is not a substring

- •

  \`==\` - equal to

- •

  \`!=\` - not equal to

### Arrays

Arrays are delimited by brackets. An array can contain an arbitrary number of objects of any type.

**OPERATORS**

- •

  \`+\` -  If the rhs operand is an array, it will be joined to the lhs array. If it is a scalar, it will be appended to the lhs array.

- •

  \`\[int\]\` - access the object at index

- •

  \`\<any\> in \<array\>\` - check if object is in \`array\`

- •

  \`\<any\> not in \<array\>\` - check if object is not in \`array\`

- •

  \`==\` - equal to

- •

  \`!=\` - not equal to

### Dictionaries

Dictionaries are delimited by curly braces. A dictionary can contain an arbitrary number of key: value pairs. Keys are required to be strings, but values can be objects of any type.  Dictionaries are immutable and do not have a guaranteed order.

**OPERATORS**

- •

  \`+\` - merge two dictionaries.  In case of a conflicting key, the value from the rhs dictionary will be taken.

- •

  \`\[str\]\` - access the object with key \`key\`

- •

  \`\<str\> in \<dict\>\` - check if key is in \`dict\`

- •

  \`\<str\> not in \<dict\>\` - check if key is not in \`dict\`

- •

  \`==\` - equal to

- •

  \`!=\` - not equal to

## SYNTAX

A meson build file is composed of statements, which are terminated by newlines. Other than the statement-terminating newline, white space has no syntactic meaning.

### Comments

A comment starts with the \`#\` character and extends until the end of the line.

### Variables

A variable can contain a value of any type, and does not need to be predeclared.

```
var1 = 'hello'
var2 = 102
```

One important difference in how variables work in the dsl is that all objects are immutable. When you see an operation which appears like a mutation, actually a new object is created and assigned to the name.

```
var1 = [1, 2, 3]
var2 = var1
var2 += [4]
# var2 is now [1, 2, 3, 4]
# var1 is still [1, 2, 3]
```

### Function and method calls

Builtin functions are called by their name followed by parenthesis containing optional, comma-separated arguments.  Arguments are either positional or keyword.  Keyword arguments are expressed using the keyword without quotes, followed by a colon.

```
foo()
foo('bar')
foo('bar', baz: true)
```

Method calls are expressed by a \`.\` followed by the same function call syntax as above.

```
foo.bar()
foo.bar('baz', qux: false)
```

For a complete list of functions and methods, please see \`[meson-reference(3)](/meson-reference/3.md)\`.

### If statements

Start an if statement with the \`if\` keyword followed by a boolean expression. Further conditions can be expressed using the \`elif\` keyword followed by a boolean expression.  The \`else\` keyword can be used to handle the case when no conditions are matched.  An if statement is terminated with the \`endif\` keyword.

```
if conditon1
	...
elif condition2
	...
else condition3
	...
endif
```

### Foreach statements

To loop over values in an iterable, use the \`foreach\` keyword followed by a comma separated list of names to assign the values of the iterable to, a colon, and an iterable expression.  Only arrays and dictionaries are iterable.  A foreach statement is terminated with the \`endforeach\` keyword.

Arrays have one value to assign to.

```
foreach value : array
	foo(value)
endforeach
```

Dictionaries have one two values to assign to.

```
foreach key, value : dictionary
	foo(key)
	bar(value)
endforeach
```

Inside a \`foreach\` block you may use the \`break\` and \`continue\` keywords. \`break\` exits the loop immediately.  \`continue\` skips the rest of the current iteration.

## SEE ALSO

[meson-reference(3)](/meson-reference/3.md) [meson(1)](/meson/1.md) muon(1)
