.. program is needed to resolve :option: references
.. program:: gcovr

.. _configuration:

Configuration Files
===================

.. warning::
    Config files are an experimental feature
    and may be subject to change without prior notice.

Defaults for the command line options can be set in a configuration file.
Example::

    filter = src/
    html-details = yes  # info about each source file
    output = build/coverage.html

How the configuration file is found:
If a :option:`--config` option is provided, that file is used.
Otherwise, a ``gcovr.cfg`` file in the :option:`-r/--root <--root>`
directory is used, if that file exists.

Each line contains a ``key = value`` pair.
Space around the ``=`` is optional.
The value may be empty.
Comments start with a hash ``#`` and ignore the rest of the line,
but cannot start within a word.
Empty lines are also ignored.

The available config keys correspond closely to the command line options,
and are parsed similarly.
In most cases, the name of a long command line option
can be used as a config key.
If not, this is documented in the option's help message.
For example, :option:`--gcov-executable`
can be set via the ``gcov-executable`` config key.
But :option:`-b/--branches <--branches>` is set via ``txt-branch``.

Just like command line options,
the config keys can be specified multiple times.
Depending on the option the last one wins or a list will be built.
For example, :option:`-f/--filter <--filter>` can be provided multiple times::

    # Only show coverage for files in src/, lib/foo, or for main.cpp files.
    filter = src/
    filter = lib/foo/
    filter = *./main\.cpp

Note that relative filters specified in config files will be interpreted
relative to the location of the config file itself.

Option arguments are parsed with the following precedence:

-   First the config file is parsed, if any.
-   Then, all command line arguments are added.
-   Finally, if an option was specified
    neither in a config file nor on the command line,
    its documented default value is used.

Therefore, it doesn't matter
whether a value is provided in the config file or the command line.

Boolean flags are treated specially.
When their config value is ``yes`` they are enabled,
as if the flag had been provided on the command line.
When their value is ``no``, they are explicitly disabled
by assigning their default value.
The :option:`-j` flag is special as it takes an optional argument.
In the config file,
``gcov-parallel = yes`` would refer to the no-argument form,
whereas ``gcov-parallel = 4`` would provide an explicit argument.

If the option is a path and is not absolute, the path is used relative to
the config file. For the option :option:`--json-add-tracefile`,
the directory of the config file is always prepended.

Some config file syntax is explicitly reserved for future extensions:
semicolon comments, INI-style sections, multi-line values, quoted values,
variable substitutions, alternative key-value separators, etc.
