.. _projectconf:


Project configuration
=====================
The project configuration file should be named ``project.conf`` and
be located at the project root. It holds information such as Source
aliases relevant for the sources used in the given project as well as
overrides for the configuration of element types used in the project.

Values specified in the project configuration override any of the
default BuildStream project configuration, which is included
:ref:`here <project_defaults>` for reference.


.. _project_essentials:

Essentials
----------


.. _project_format_name:

Project name
~~~~~~~~~~~~
The project name is a unique symbol for your project and will
be used to distinguish your project from others in user preferences,
namespacing of your project's artifacts in shared artifact caches,
and in any case where BuildStream needs to distinguish between multiple
projects.

The first thing to setup in your ``project.conf`` should be the name
of your project.

.. code:: yaml

   name: my-project-name

The project name may contain alphanumeric characters, dashes and
underscores, and may not start with a leading digit.

.. attention::

   The project name must be specified in the ``project.conf`` and
   cannot be :ref:`included <format_directives_include>` from a separate file.


.. _project_min_version:

Minimum version
~~~~~~~~~~~~~~~
The BuildStream format is guaranteed to be backwards compatible
with any earlier minor point releases, which is to say that
BuildStream 1.4 can read projects written for BuildStream 1.0,
and that BuildStream 2.2 can read projects written for BuildStream 2.0.

Projects are required to specify the minimum version of BuildStream
which it requires, this allows project authors to convey a useful
error message to their users and peers, in the case that a user needs
to get a newer version of BuildStream in order to work with a given
project.

The project's minimum required BuildStream version must be specified
in ``project.conf`` using the ``min-version`` field, e.g.:

.. code:: yaml

  # This project uses features which were added in 2.2
  min-version: 2.2

It is recommended that when using new features, always consult this
documentation and observe which BuildStream version a feature you are
using was added in. If a feature in the BuildStream YAML format is
not documented with a specific *Since* version, you can assume that
it has been there from the beginning.


.. note::

   External :mod:`Element <buildstream.element>` and :mod:`Source <buildstream.source>`
   plugins also implement their own YAML configuration fragments and as
   such are revisioned separately from the core format.

.. attention::

   The ``min-version`` must be specified in the ``project.conf`` and
   cannot be :ref:`included <format_directives_include>` from a separate file.


.. _project_element_path:

Element path
~~~~~~~~~~~~
To allow the user to structure their project nicely, BuildStream
allows the user to specify a project subdirectory where element
``.bst`` files are stored.

.. code:: yaml

   element-path: elements

Note that elements are referred to by their relative paths, whenever
elements are referred to in a ``.bst`` file or on the command line.

.. attention::

   The ``element-path`` can only be specified in the ``project.conf`` and
   cannot be :ref:`included <format_directives_include>` from a separate file.


.. _project_format_ref_storage:

Ref storage
~~~~~~~~~~~
By default, BuildStream expects to read and write source references
directly in the :ref:`source declaration <format_sources>`, but this
can be inconvenient and prohibitive in some workflows.

Alternatively, BuildStream allows source references to be stored
centrally in a :ref:`project.refs file <projectrefs>` in the toplevel
:ref:`project directory <format_structure>`.

This can be controlled with the ``ref-storage`` option, which is
allowed to be configured with the following values:

* ``inline``

  Source references are stored directly in the
  :ref:`source declaration <format_sources>`

* ``project.refs``

  Source references are stored in the ``project.refs`` file, and
  junction source references are stored in the ``junction.refs`` file.

To enable storing of source references in ``project.refs``, add the
following to your ``project.conf``:

.. code:: yaml

  ref-storage: project.refs

.. attention::

   **Storing subproject source references in project.refs**

   When using the ``project.refs`` file, it is possible to override the
   references in subprojects by editing the ``project.refs`` file directly
   or by using :ref:`bst source track --cross-junctions <invoking_source_track>`,
   this can be practical to try out fresher versions of components which
   are maintained in a subproject.

   It should be noted however that overridden subproject source references listed
   in your ``project.refs`` file will be ignored by projects which use your project
   as a subproject.


.. _configurable_warnings:

Configurable Warnings
~~~~~~~~~~~~~~~~~~~~~
Warnings can be configured as fatal using the ``fatal-warnings`` configuration item.
When a warning is configured as fatal, where a warning would usually be thrown instead an error will be thrown
causing the build to fail.

Individual warnings can be configured as fatal by setting ``fatal-warnings`` to a list of warnings.

.. code:: yaml

  fatal-warnings:
  - overlaps
  - ref-not-in-track
  - <plugin>:<warning>

BuildStream provides a collection of :class:`Core Warnings <buildstream.types.CoreWarnings>` which may be raised
by a variety of plugins. Other configurable warnings are plugin specific and should be noted within their individual documentation.


.. _project_source_aliases:

Source aliases
~~~~~~~~~~~~~~
In order to abstract the download location of source code and
any assets which need to be downloaded, and also as a matter of
convenience, BuildStream allows one to create named aliases for
URLs which are to be used in the individual ``.bst`` files.

.. code:: yaml

   aliases:
     foo: git://git.foo.org/
     bar: http://bar.com/downloads/


Sandbox options
~~~~~~~~~~~~~~~
Sandbox options for the whole project can be supplied in
``project.conf`` in the same way as in an element. See :ref:`element configuration <format_sandbox>`
for more detail.

.. code:: yaml

   # Specify a user id and group id to use in the build sandbox.
   sandbox:
     build-uid: 1003
     build-gid: 1001


.. _project_artifact_cache:

Artifact server
~~~~~~~~~~~~~~~
When maintaining a BuildStream project, it can be convenient to downstream users
of your project to provide access to a :ref:`cache server <cache_servers>` you maintain.

The project can provide *recommended* artifact cache servers through project configuration
using the same semantics as one normally uses in the ``servers`` list of the
:ref:`cache server user configuration <config_cache_servers>`:

.. code:: yaml

  #
  # A remote cache from which to download prebuilt artifacts
  #
  artifacts:
  - url: https://foo.com:11001
    auth:
      server-cert: server.crt

.. attention::

   Unlike user configuration, the filenames provided in the :ref:`auth <config_remote_auth>`
   configuration block are relative to the :ref:`project directory <format_structure>`.

   It is recommended to include public keys such as the ``server-cert`` along with your
   project so that downstream users can have automatic read access to your project.

   To provide write access to downstream users, it is recommended that the required
   private keys such as the ``client-key`` be provided to users out of band,
   and require that users configure write access separately in their own
   :ref:`user configuration <config_cache_servers>`.


.. _project_source_cache:

Source cache server
~~~~~~~~~~~~~~~~~~~
In the same way as artifact cache servers, the project can provide *recommended* source cache
servers through project configuration using the same semantics as one normally uses in the
``servers`` list of the :ref:`cache server user configuration <config_cache_servers>`:

.. code:: yaml

  #
  # A remote cache from which to download prestaged sources
  #
  source-caches:
  - url: https://foo.com:11001
    auth:
      server-cert: server.crt

.. attention::

   Unlike user configuration, the filenames provided in the :ref:`auth <config_remote_auth>`
   configuration block are relative to the :ref:`project directory <format_structure>`.

   It is recommended to include public keys such as the ``server-cert`` along with your
   project so that downstream users can have automatic read access to your project.

   To provide write access to downstream users, it is recommended that the required
   private keys such as the ``client-key`` be provided to users out of band,
   and require that users configure write access separately in their own
   :ref:`user configuration <config_cache_servers>`.


.. _project_essentials_mirrors:

Mirrors
~~~~~~~
A list of mirrors can be defined that couple a location to a mapping of aliases to a
list of URIs, e.g.

.. code:: yaml

  mirrors:
  - name: middle-earth
    aliases:
      foo:
      - http://www.middle-earth.com/foo/1
      - http://www.middle-earth.com/foo/2
      bar:
      - http://www.middle-earth.com/bar/1
      - http://www.middle-earth.com/bar/2
  - name: oz
    aliases:
      foo:
      - http://www.oz.com/foo
      bar:
      - http://www.oz.com/bar

The order that the mirrors (and the URIs therein) are consulted is in the order
they are defined when fetching, and in reverse-order when tracking.

The mirrors can be overridden on a per project basis using
:ref:`user configuration <config_mirrors>`. One can also specify which mirror should
be used first in the :ref:`user configuration <config_default_mirror>`, or using
the  :ref:`--default-mirror <invoking_bst>` command-line argument.


.. _project_plugins:

Loading plugins
---------------
If your project makes use of any custom :mod:`Element <buildstream.element>` or
:mod:`Source <buildstream.source>` plugins, then the project must inform BuildStream
of the plugins it means to make use of and the origin from which they can be loaded.

Note that plugins with the same name from different origins are not permitted.

.. attention::

   The plugins can only be specified in the ``project.conf`` and cannot be
   :ref:`included <format_directives_include>` from a separate file.


.. _project_plugins_local:

Local plugins
~~~~~~~~~~~~~
Local plugins are expected to be found in a subdirectory of the actual
BuildStream project. :mod:`Element <buildstream.element>` and
:mod:`Source <buildstream.source>` plugins should be stored in separate
directories to avoid namespace collisions, you can achieve this by
specifying a separate *origin* for sources and elements.

.. code:: yaml

   plugins:

   - origin: local
     path: plugins/sources

     # We want to use the `mysource` source plugin located in our
     # project's `plugins/sources` subdirectory.
     sources:
     - mysource

There is no strict versioning policy for plugins loaded from the local
origin because the plugin is provided with the project data and as such,
it is considered to be completely deterministic.

Usually your project will be managed by a VCS like git, and any changes
to your local plugins may have an impact on your project, such as changes
to the artifact cache keys produced by elements which use these plugins.
Changes to plugins might provide new YAML configuration options, changes
in the semantics of existing configurations or even removal of existing
YAML configurations.


.. _project_plugins_pip:

Pip plugins
~~~~~~~~~~~
Plugins loaded from the ``pip`` origin are expected to be installed
separately on the host operating system using python's package management
system.

.. code:: yaml

   plugins:

   - origin: pip

     # Specify the name of the python package containing
     # the plugins we want to load. The name one would use
     # on the `pip install` command line.
     #
     package-name: potato

     # We again must specify specifically which plugins we
     # want loaded from this origin.
     #
     elements:
     - starch

Unlike local plugins, plugins loaded from the ``pip`` origin are
loaded from the active *python environment*, and as such you do not
usually have full control over the plugins your project uses unless
one uses strict :ref:`version constraints <project_plugins_pip_version_constraints>`.

The official plugin packages maintained by the BuildStream community are
guaranteed to be fully API stable. If one chooses to load these plugins
from the ``pip`` origin, then it is recommended to use *minimal bound dependency*
:ref:`constraints <project_plugins_pip_version_constraints>` when using
official plugin packages so as to be sure that you have access to all the
features you intend to use in your project.


.. _project_plugins_pip_version_constraints:

Versioning constraints
''''''''''''''''''''''
When loading plugins from the ``pip`` plugin origin, it is possible to
specify constraints on the versions of packages you want to load
your plugins from.

The syntax for specifying versioning constraints is the same format supported by
the ``pip`` package manager.

.. note::

   In order to be certain that versioning constraints work properly, plugin
   packages should be careful to adhere to `PEP 440, Version Identification and Dependency
   Specification <https://www.python.org/dev/peps/pep-0440/>`_.

Here are a couple of examples:

**Specifying minimal bound dependencies**:

.. code:: yaml

   plugins:

   - origin: pip

     # This project uses the API stable potato project and
     # requires features from at least version 1.2
     #
     package-name: potato>=1.2

**Specifying exact versions**:

.. code:: yaml

   plugins:

   - origin: pip

     # This project requires plugins from the potato
     # project at exactly version 1.2.3
     #
     package-name: potato==1.2.3

**Specifying version constraints**:

.. code:: yaml

   plugins:

   - origin: pip

     # This project requires plugins from the potato
     # project from version 1.2.3 onward until 1.3.
     #
     package-name: potato>=1.2.3,<1.3

.. important::

   **Unstable plugin packages**

   When using unstable plugins loaded from the ``pip`` origin, the installed
   plugins can sometimes be incompatible with your project.

   **Use virtual environments**

   Your operating system's default python environment can only have one
   version of a given package installed at a time, if you work on multiple
   BuildStream projects on the same host, they may not agree on which versions
   of plugins to use.

   In order to guarantee that you can use a specific version of a plugin,
   you may need to install BuildStream into a `virtual environment
   <https://docs.python.org/3/tutorial/venv.html>`_ in order to control which
   python package versions are available when using your project.

   Follow `these instructions
   <https://buildstream.build/source_install.html#installing-in-virtual-environments>`_
   to install BuildStream in a virtual environment.

   **Possible junction conflicts**

   If you have multiple projects which are connected through
   :mod:`junction <elements.junction>` elements, these projects can disagree
   on which version of a plugin is needed from the ``pip`` origin.

   Since only one version of a given plugin *package* can be installed
   at a time in a given *python environment*, you must ensure that all
   projects connected through :mod:`junction <elements.junction>` elements
   agree on which versions of API unstable plugin packages to use.


.. _project_plugins_junction:

Junction plugins
~~~~~~~~~~~~~~~~
Junction plugins are loaded from another project which your project has a
:mod:`junction <elements.junction>` declaration for. Plugins are loaded directly
from the referenced project, the source and element plugins listed will simply
be loaded from the subproject regardless of how they were defined in that project.

Plugins loaded from a junction might even come from another junction and
be *deeply nested*.

.. code:: yaml

   plugins:

   - origin: junction

     # Specify the local junction name declared in your
     # project as the origin from where to load plugins from.
     #
     junction: subproject-junction.bst

     # Here we want to get the `frobnicate` element
     # from the subproject and use it in our project.
     #
     elements:
     - frobnicate

Plugins loaded across junction boundaries will be loaded in the
context of your project, and any default values set in the ``project.conf``
of the junctioned project will be ignored when resolving the
defaults provided with element plugins.

It is recommended to use :ref:`include directives <format_directives_include>`
in the case that the referenced plugins from junctioned projects depend
on variables defined in the project they come from, in this way you can include
variables needed by your plugins into your own ``project.conf``.

.. tip::

   **Distributing plugins as projects**

   It is encouraged that people use BuildStream projects to distribute plugins
   which are intended to be shared among projects, especially when these plugins
   are not guaranteed to be completely API stable. This can still be done while
   also distributing your plugins as :ref:`pip packages <project_plugins_pip>` at
   the same time.

   This can be achieved by simply creating a repository or tarball which
   contains only the plugins you want to distribute, along with a ``project.conf``
   file declaring these plugins as :ref:`local plugins <project_plugins_local>`.

   Using plugins which are distributed as local plugins in a BuildStream project
   ensures that you always have full control over which exact plugin your
   project is using at all times, without needing to store the plugin as a
   :ref:`local plugin <project_plugins_local>` in your own project.


.. _project_plugins_deprecation:

Suppressing deprecation warnings
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Plugins can be deprecated over time, and using deprecated plugins will
trigger a warning when loading elements and sources which use
deprecated plugin kinds.

These deprecation warnings can be suppressed for the entire plugin
origin or on a per plugin kind basis.

To suppress all deprecation warnings from the origin, set the
``allow-deprecated`` flag for the origin as follows:

.. code:: yaml

   plugins:

   - origin: local
     path: plugins/sources

     # Suppress deprecation warnings for any plugins loaded here
     allow-deprecated: True

     sources:
     - mysource


In order to suppress deprecation warnings for a single element or
source kind within an origin, you will have to use a dictionary
to declare the specific plugin kind and set the ``allow-deprecated`` flag
on that dictionary as follows:

.. code:: yaml

   plugins:

   - origin: pip
     package-name: potato

     # Here we use a dictionary to declare the "starch"
     # element kind, and specify that it is allowed to
     # be deprecated.
     #
     elements:
     - kind: starch
       allow-deprecated: True


.. _project_options:

Options
-------
Options are how BuildStream projects can define parameters which
can be configured by users invoking BuildStream to build your project.

Options are declared in the ``project.conf`` in the main ``options``
dictionary.

.. code:: yaml

   options:
     debug:
       type: bool
       description: Whether to enable debugging
       default: False

Project options can be specified on the command line using
:ref:`bst --option ... <invoking_bst>`

.. note::

   The name of the option may contain alphanumeric characters
   underscores, and may not start with a leading digit.


Common properties
~~~~~~~~~~~~~~~~~
All option types accept the following common attributes

* ``type``

  Indicates the type of option to declare

* ``description``

  A description of the meaning of the option

* ``variable``

  Optionally indicate a :ref:`variable <format_variables>` name to
  export the option to. A string form of the selected option will
  be used to set the exported value.

  If used, this value will override any existing value for the
  variable declared in ``project.conf``, and will be overridden in
  the regular :ref:`composition order <format_composition>`.

  .. note::

     The name of the variable to export may contain alphanumeric
     characters, dashes, underscores, and may not start with a leading
     digit.


.. _project_options_bool:

Boolean
~~~~~~~
The ``bool`` option type allows specifying boolean values which
can be cased in conditional expressions.


**Declaring**

.. code:: yaml

   options:
     debug:
       type: bool
       description: Whether to enable debugging
       default: False


**Evaluating**

Boolean options can be tested in expressions with equality tests:

.. code:: yaml

   variables:
     enable-debug: False
     (?):
     - debug == True:
         enable-debug: True

Or simply treated as truthy values:

.. code:: yaml

   variables:
     enable-debug: False
     (?):
     - debug:
         enable-debug: True


**Exporting**

When exporting boolean options as variables, a ``True`` option value
will be exported as ``1`` and a ``False`` option as ``0``


.. _project_options_enum:

Enumeration
~~~~~~~~~~~
The ``enum`` option type allows specifying a string value
with a restricted set of possible values.


**Declaring**

.. code:: yaml

   options:
     loglevel:
       type: enum
       description: The logging level
       values:
       - debug
       - info
       - warning
       default: info


**Evaluating**

Enumeration options must be tested as strings in conditional
expressions:

.. code:: yaml

   variables:
     enable-debug: False
     (?):
     - loglevel == "debug":
         enable-debug: True


**Exporting**

When exporting enumeration options as variables, the value is
exported as a variable directly, as it is a simple string.


.. _project_options_flags:

Flags
~~~~~
The ``flags`` option type allows specifying a list of string
values with a restricted set of possible values.

In contrast with the ``enum`` option type, the *default* value
need not be specified and will default to an empty set.


**Declaring**

.. code:: yaml

   options:
     logmask:
       type: flags
       description: The logging mask
       values:
       - debug
       - info
       - warning
       default:
       - info


**Evaluating**

Options of type ``flags`` can be tested in conditional expressions using
a pythonic *in* syntax to test if an element is present in a set:

.. code:: yaml

   variables:
     enable-debug: False
     (?):
     - ("debug" in logmask):
         enable-debug: True


**Exporting**

When exporting flags options as variables, the value is
exported as a comma separated list of selected value strings.


.. _project_options_arch:

Architecture
~~~~~~~~~~~~
The ``arch`` option type is a special enumeration option which defaults via
`uname -m` results to the following list.

* aarch32
* aarch64
* aarch64-be
* power-isa-be
* power-isa-le
* sparc-v9
* x86-32
* x86-64

The reason for this, opposed to using just `uname -m`, is that we want an
OS-independent list, as well as several results mapping to the same architecture
(e.g. i386, i486 etc. are all x86-32). It does not support assigning any default
in the project configuration.

.. code:: yaml

   options:
     machine_arch:
       type: arch
       description: The machine architecture
       values:
       - aarch32
       - aarch64
       - x86-32
       - x86-64


Architecture options can be tested with the same expressions
as other Enumeration options.


.. _project_options_os:

OS
~~

The ``os`` option type is a special enumeration option, which defaults to the
results of `uname -s`. It does not support assigning any default in the project
configuration.

.. code:: yaml

    options:
      machine_os:
        type: os
        description: The machine OS
        values:
        - Linux
        - SunOS
        - Darwin
        - FreeBSD

Os options can be tested with the same expressions as other Enumeration options.


.. _project_options_element_mask:

Element mask
~~~~~~~~~~~~
The ``element-mask`` option type is a special Flags option
which automatically allows only element names as values.

.. code:: yaml

   options:
     debug_elements:
       type: element-mask
       description: The elements to build in debug mode

This can be convenient for automatically declaring an option
which might apply to any element, and can be tested with the
same syntax as other Flag options.


.. code:: yaml

   variables:
     enable-debug: False
     (?):
     - ("element.bst" in debug_elements):
         enable-debug: True


.. _project_junctions:

Junctions
---------
In this section of ``project.conf``, we can define the relationship a project
has with :mod:`junction <elements.junction>` elements in the same project, or
even in subprojects.

Sometimes when your project has multiple :mod:`junction <elements.junction>` elements,
a situation can arise where you have multiple instances of the same project loaded
at the same time. In most cases, you will want to reconcile this conflict by ensuring
that your projects share the same junction. In order to reconcile conflicts by
ensuring nested junctions to the same project are shared, please refer to
:ref:`the documentation on nested junctions <core_junction_nested>`.

In some exceptional cases, it is entirely intentional and appropriate to use
the same project more than once in the same build pipeline. The attributes
in the ``junctions`` group here in ``project.conf`` provide some tools you can
use to explicitly allow the coexistence of the same project multiple times.


Duplicate junctions
~~~~~~~~~~~~~~~~~~~
In the case that you are faced with an error due to subprojects sharing
a common sub-subproject, you can use the ``duplicates`` configuration
in order to allow the said project to be loaded twice.

**Example**:

.. code:: yaml

   junctions:

     duplicates:

       # Here we use the packaging tooling completely separately from
       # the payload that we are packaging, they are never staged to
       # the same location in a given sandbox, and as such we would
       # prefer to allow the 'runtime' project to be loaded separately.
       #
       # This statement will ensure that loading the 'runtime' project
       # from these two locations will not produce any errors.
       #
       runtime:
       - payload.bst:runtime.bst
       - packaging.bst:runtime.bst

When considering duplicated projects in the same pipeline, all instances
of the said project need to be marked as ``duplicates`` in order to avoid
a *conflicting junction error* at load time.

.. tip::

   The declaration of ``duplicates`` is inherited by any dependant projects
   which may later decide to depend on your project.

   If you depend on a project which itself has ``duplicates``, and you need
   to duplicate it again, then you only need to declare the new duplicate,
   you do not need to redeclare duplicates redundantly.


Internal junctions
~~~~~~~~~~~~~~~~~~
Another way to avoid *conflicting junction errors* when you know that your
subproject should not conflict with other instances of the same subproject,
is to declare the said subproject as *internal*.

**Example**:

.. code:: yaml

   junctions:

     # Declare this subproject as "internal" because we know
     # that we only use it for build dependencies, and as such
     # we know that it cannot collide with elements in dependant
     # projects.
     #
     internal:
     - special-compiler.bst

When compared to *duplicates* above, *internal* projects have the advantage
of never producing any *conflicting junction errors* in dependant projects
(reverse dependency projects).

This approach is preferrable in cases where you know for sure that dependant
projects will not be depending directly on elements from your internal
subproject.

.. attention::

   Declaring a junction as *internal* is a promise that dependant projects
   will not accrue runtime dependencies on elements in your *internal* subproject.


.. _project_defaults:

Element default configuration
-----------------------------
The ``project.conf`` plays a role in defining elements by
providing default values and also by overriding values declared
by plugins on a plugin wide basis.

See the :ref:`composition <format_composition>` documentation for
more detail on how elements are composed.


.. _project_defaults_variables:

Variables
~~~~~~~~~
The defaults for :ref:`Variables <format_variables>` used in your
project is defined here.

.. code:: yaml

   variables:
     prefix: "/usr"


.. _project_defaults_environment:

Environment
~~~~~~~~~~~
The defaults environment for the build sandbox is defined here.

.. code:: yaml

   environment:
     PATH: /usr/bin:/bin:/usr/sbin:/sbin

Additionally, the special ``environment-nocache`` list which specifies
which environment variables do not affect build output, and are thus
not considered in the calculation of artifact keys can be defined here.

.. code:: yaml

   environment-nocache:
   - MAXJOBS

Note that the ``environment-nocache`` list only exists so that we can
control parameters such as ``make -j ${MAXJOBS}``, allowing us to control
the number of jobs for a given build without affecting the resulting
cache key.


.. _project_split_rules:

Split rules
~~~~~~~~~~~
The project wide :ref:`split rules <public_split_rules>` defaults can
be specified here.

.. code:: yaml

   split-rules:
     devel:
     - |
       %{includedir}
     - |
       %{includedir}/**
     - |
       %{libdir}/lib*.a
     - |
       %{libdir}/lib*.la


.. _project_overrides:

Overriding plugin defaults
--------------------------
Base attributes declared by element and source plugins can be overridden
on a project wide basis. This section explains how to make project wide
statements which augment the configuration of an element or source plugin.


.. _project_element_overrides:

Element overrides
~~~~~~~~~~~~~~~~~
The elements dictionary can be used to override variables, environments
or plugin specific configuration data as shown below.


.. code:: yaml

   elements:

     # Override default values for all autotools elements
     autotools:

       variables:
         bindir: "%{prefix}/bin"

       config:
         configure-commands: ...

       environment:
         PKG_CONFIG_PATH=%{libdir}/pkgconfig


.. _project_source_overrides:

Source overrides
~~~~~~~~~~~~~~~~
The sources dictionary can be used to override source plugin
specific configuration data as shown below.


.. code:: yaml

   sources:

     # Override default values for all git sources
     git:

       config:
         checkout-submodules: False


.. _project_shell:

Customizing the shell
---------------------
Since BuildStream cannot know intimate details about your host or about
the nature of the runtime and software that you are building, the shell
environment for debugging and testing applications may need some help.

The ``shell`` section allows some customization of the shell environment.


Interactive shell command
~~~~~~~~~~~~~~~~~~~~~~~~~
By default, BuildStream will use ``sh -i`` when running an interactive
shell, unless a specific command is given to the ``bst shell`` command.

BuildStream will automatically set a convenient prompt via the ``PS1``
environment variable for interactive shells; which might be overwritten
depending on the shell you use in your runtime.

If you are using ``bash``, we recommend the following configuration to
ensure that the customized prompt is not overwritten:

.. code:: yaml

   shell:

     # Specify the command to run by default for interactive shells
     command: [ 'bash', '--noprofile', '--norc', '-i' ]


Environment assignments
~~~~~~~~~~~~~~~~~~~~~~~
In order to cooperate with your host environment, a debugging shell
sometimes needs to be configured with some extra knowledge inheriting
from your host environment.

This can be achieved by setting up the shell ``environment`` configuration,
which is expressed as a dictionary very similar to the
:ref:`default environment <project_defaults_environment>`, except that it
supports host side environment variable expansion in values.

For example, to share your host ``DISPLAY`` and ``DBUS_SESSION_BUS_ADDRESS``
environments with debugging shells for your project, specify the following:

.. code:: yaml

   shell:

     # Share some environment variables from the host environment
     environment:
       DISPLAY: '$DISPLAY'
       DBUS_SESSION_BUS_ADDRESS: '$DBUS_SESSION_BUS_ADDRESS'

Or, a more complex example is how one might share the host pulseaudio
server with a ``bst shell`` environment:

.. code:: yaml

   shell:

     # Set some environment variables explicitly
     environment:
       PULSE_SERVER: 'unix:${XDG_RUNTIME_DIR}/pulse/native'


Host files
~~~~~~~~~~
It can be useful to share some files on the host with a shell so that
it can integrate better with the host environment.

The ``host-files`` configuration allows one to specify files and
directories on the host to be bind mounted into the sandbox.

.. warning::

   One should never mount directories where one expects to
   find data and files which belong to the user, such as ``/home``
   on POSIX platforms.

   This is because the unsuspecting user may corrupt their own
   files accidentally as a result. Instead users can use the
   ``--mount`` option of ``bst shell`` to mount data into the shell.


The ``host-files`` configuration is an ordered list of *mount specifications*.

Members of the list can be *fully specified* as a dictionary, or a simple
string can be used if only the defaults are required.

The fully specified dictionary has the following members:

* ``path``

  The path inside the sandbox. This is the only mandatory
  member of the mount specification.

* ``host_path``

  The host path to mount at ``path`` in the sandbox. This
  will default to ``path`` if left unspecified.

* ``optional``

  Whether the mount should be considered optional. This
  is ``False`` by default.


Here is an example of a *fully specified mount specification*:

.. code:: yaml

   shell:

     # Mount an arbitrary resolv.conf from the host to
     # /etc/resolv.conf in the sandbox, and avoid any
     # warnings if the host resolv.conf doesnt exist.
     host-files:
     - host_path: '/usr/local/work/etc/resolv.conf'
       path: '/etc/resolv.conf'
       optional: True

Here is an example of using *shorthand mount specifications*:

.. code:: yaml

   shell:

     # Specify a list of files to mount in the sandbox
     # directory from the host.
     #
     # If these do not exist on the host, a warning will
     # be issued but the shell will still be launched.
     host-files:
     - '/etc/passwd'
     - '/etc/group'
     - '/etc/resolv.conf'

Host side environment variable expansion is also supported:

.. code:: yaml

   shell:

     # Mount a host side pulseaudio server socket into
     # the shell environment at the same location.
     host-files:
     - '${XDG_RUNTIME_DIR}/pulse/native'


.. _project_default_targets:

Default targets
---------------
When running BuildStream commands from a project directory or subdirectory
without specifying any target elements on the command line, the default targets
of the project will be used.  The default targets can be configured in the
``defaults`` section as follows:

.. code:: yaml

   defaults:

     # List of default target elements
     targets:
     - app.bst

If no default targets are configured in ``project.conf``, BuildStream commands
will default to all ``.bst`` files in the configured element path.

Commands that cannot support junctions as target elements (``bst build``,
``bst artifact push``, and ``bst artifact pull``) ignore junctions in the list
of default targets.

When running BuildStream commands from a workspace directory (that is not a
BuildStream project directory), project default targets are not used and the
workspace element will be used as the default target instead.

``bst artifact checkout``, ``bst source checkout``, and ``bst shell`` are
currently limited to a single target element and due to this, they currently
do not use project default targets.  However, they still use the workspace
element as default target when run from a workspace directory.


.. _project_builtin_defaults:

Builtin defaults
----------------
BuildStream defines some default values for convenience, the default
values overridden by your project's ``project.conf`` are presented here:

  .. literalinclude:: ../../src/buildstream/data/projectconfig.yaml
     :language: yaml
