|  | .. _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 | 
|  |  | 
|  |  | 
|  | .. _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. | 
|  |  | 
|  | A default mirror to consult first can be defined via | 
|  | :ref:`user config <config_default_mirror>`, or the command-line argument | 
|  | :ref:`--default-mirror <invoking_bst>`. | 
|  |  | 
|  |  | 
|  | .. _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 constraints are `explained here <https://python-poetry.org/docs/versions/>`_, | 
|  | and they are 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 | 
|  |  | 
|  | Users can configure those options when invoking BuildStream with the | 
|  | ``--option`` argument:: | 
|  |  | 
|  | $ bst --option debug True ... | 
|  |  | 
|  | .. 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 |