---
short-description: Automatic modification of the build system files
...

# Meson file rewriter

Since version 0.50.0, Meson has the functionality to perform some
basic modification on the `meson.build` files from the command line.
The currently supported operations are:

- For build targets:
  - Add/Remove source files
  - Add/Remove targets
  - Modify a select set of kwargs
  - Print some JSON information
- For dependencies:
  - Modify a select set of kwargs
- For the project function:
  - Modify a select set of kwargs
  - Modify the default options list

The rewriter has both, a normal command line interface and a "script
mode". The normal CLI is mostly designed for everyday use. The "script
mode", on the other hand, is meant to be used by external programs
(IDEs, graphical frontends, etc.)

The rewriter itself is considered stable, however the user interface
and the "script mode" API might change in the future. These changes
may also break backwards compatibility to older releases.

We are also open to suggestions for API improvements.

## Using the rewriter

All rewriter functions are accessed via `meson rewrite`. The Meson
rewriter assumes that it is run inside the project root directory. If
this isn't the case, use `--sourcedir` to specify the actual project
source directory.

### Adding and removing sources

The most common operations will probably be the adding and removing of source
files to a build target. This can be easily done with:

```bash
meson rewrite target <target name/id> {add/rm} [list of sources]
```

For instance, given the following example

```meson
src = ['main.cpp', 'fileA.cpp']

exe1 = executable('testExe', src)
```

the source `fileB.cpp` can be added with:

```bash
meson rewrite target testExe add fileB.cpp
```

After executing this command, the new `meson.build` will look like this:

```meson
src = ['main.cpp', 'fileA.cpp', 'fileB.cpp']

exe1 = executable('testExe', src)
```

In this case, `exe1` could also have been used for the target name.
This is possible because the rewriter also searches for assignments
and unique Meson IDs, which can be acquired with introspection. If
there are multiple targets with the same name, Meson will do nothing
and print an error message.

For more information see the help output of the rewriter target
command.

### Adding and removing `extra_files`

*Since 0.61.0*

In the same way you can add and remove source files from a target, you can modify a target's
`extra_files` list:

```bash
meson rewrite target <target name/id> {add_extra_files/rm_extra_files} [list of extra files]
```

### Setting the project version

It is also possible to set kwargs of specific functions with the
rewriter. The general command for setting or removing kwargs is:

```bash
meson rewrite kwargs set <function type> <function ID> <key1> <value1> <key2> <value2> ...
meson rewrite kwargs delete <function type> <function ID> <key1> <key2> ...
```

For instance, setting the project version can be achieved with this command:

```bash
meson rewrite kwargs set project / version 1.0.0
```

Currently, only the following function types are supported:

- dependency
- target (any build target, the function ID is the target name/ID)
- project (the function ID must be `/` since project() can only be called once)

For more information see the help output of the rewrite kwargs command.

Note msys bash may expand `/` to a path. Passing `//` will be
converted to `/` by msys bash but in order to keep usage
shell-agnostic, the rewrite command also allows `//` as the function
ID such that it will work in both msys bash and other shells.

*Before 1.10.0*, the `delete` command expected `<key> <value>` pairs as
in `set`; the `<value>` was ignored.  For backward compatibility, Meson
accepts this syntax with a warning if all `<value>`s are the empty string.

### Setting the project default options

For setting and deleting default options, use the following command:

```bash
meson rewrite default-options set <opt1> <value1> <opt2> <value2> ...
meson rewrite default-options delete <opt1> <opt2> ...
```

*Before 1.10.0*, the `delete` command expected `<opt> <value>` pairs as
in `set`; the `<value>` was ignored.  For backward compatibility, Meson
accepts this syntax with a warning if all `<value>`s are the empty string.

## Limitations

Rewriting a Meson file is not guaranteed to keep the indentation of
the modified functions. Additionally, comments inside a modified
statement will be removed. Furthermore, all source files will be
sorted alphabetically.

For instance adding `e.c` to srcs in the following code

```meson
# Important comment

srcs = [
'a.c', 'c.c', 'f.c',
# something important about b
       'b.c', 'd.c', 'g.c'
]

# COMMENT
```

would result in the following code:

```meson
# Important comment

srcs = [
  'a.c',
  'b.c',
  'c.c',
  'd.c',
  'e.c',
  'f.c',
  'g.c'
]

# COMMENT
```

## Using the "script mode"

The "script mode" should be the preferred API for third party
programs, since it offers more flexibility and higher API stability.
The "scripts" are stored in JSON format and executed with `meson
rewrite command <JSON file or string>`.

The JSON format is defined as follows:

```json
[
  {
    "type": "function to execute",
    ...
  }, {
    "type": "other function",
    ...
  },
  ...
]
```

Each object in the main array must have a `type` entry which specifies which
function should be executed.

Currently, the following functions are supported:

- target
- kwargs
- default_options

### Target modification format

The format for the type `target` is defined as follows:

```json
{
  "type": "target",
  "target": "target ID/name/assignment variable",
  "operation": "one of ['src_add', 'src_rm', 'target_rm', 'target_add', 'extra_files_add', 'extra_files_rm', 'info']",
  "sources": ["list", "of", "source", "files", "to", "add, remove"],
  "subdir": "subdir where the new target should be added (only has an effect for operation 'tgt_add')",
  "target_type": "function name of the new target -- same as in the CLI (only has an effect for operation 'tgt_add')"
}
```

The keys `sources`, `subdir` and `target_type` are optional.

### kwargs modification format

The format for the type `target` is defined as follows:

```json
{
  "type": "kwargs",
  "function": "one of ['dependency', 'target', 'project']",
  "id": "function ID",
  "operation": "one of ['set', 'delete', 'add', 'remove', 'remove_regex', 'info']",
  "kwargs": {
    "key1": "value1",
    "key2": "value2",
    ...
  }
}
```

For operation `delete`, the values of the `options` can be anything
(including `null`).

### Default options modification format

The format for the type `default_options` is defined as follows:

```json
{
  "type": "default_options",
  "operation": "one of ['set', 'delete']",
  "options": {
    "opt1": "value1",
    "opt2": "value2",
    ...
  }
}
```

For operation `delete`, the values of the `options` can be anything
(including `null`).

## Extracting information

The rewriter also offers operation `info` for the types `target` and
`kwargs`. When this operation is used, Meson will print a JSON dump to
stderr, containing all available information to the rewriter about the
build target / function kwargs in question.

The output format is currently experimental and may change in the future.
