.. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. .. _porting_project: Porting the project format ========================== This document outlines breaking changes made to the project format in BuildStream 2. The project.conf ---------------- This section outlines breaking changes made to the :ref:`project.conf format `. Project name ~~~~~~~~~~~~ Various features related to :mod:`junction ` elements have been added which allow addressing projects by their :ref:`project names `. For this reason, it is important to ensure that your project names are appropriately unique. Project versioning ~~~~~~~~~~~~~~~~~~ Instead of maintaining a separate version number for the format and for BuildStream releases, projects now declare the minimum version of BuildStream 2 they depend on. The ``format-version`` attribute should be removed from your project.conf (if present) and the :ref:`min-version ` attribute must be added. Some attributes can only be specified in project.conf ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Whenever specifying any of the following toplevel project attributes, they must be specified inside the project.conf itself and cannot be :ref:`included ` from a separate file: * :ref:`name ` * :ref:`element-path ` * :ref:`min-version ` * :ref:`plugins ` Artifact cache configuration ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The format for declaring :ref:`artifact caches ` which are associated to your project have been completely redesigned. **BuildStream 1:** .. code:: yaml # # We used to specify a single URL # artifacts: url: https://foo.com/artifacts **BuildStream 2:** .. code:: yaml # # Now we declare a list, and credentials have been split # out into a separate "auth" dictionary # artifacts: - url: https://foo.com:11001 auth: server-cert: server.crt Loading plugins ~~~~~~~~~~~~~~~ The format for :ref:`loading plugins ` has been completely redesigned. .. tip:: A new method for :ref:`loading plugins through junctions ` has been added. In the interest of ensuring strong determinism and reliability it is strongly recommended to use this new method. Local plugins ''''''''''''' Here is an example of how loading :ref:`local plugins ` has changed. **BuildStream 1:** .. code:: yaml plugins: - origin: local path: plugins/sources # # We used to specify version numbers, these no longer exist. # sources: mysource: 0 **BuildStream 2:** .. code:: yaml plugins: - origin: local path: plugins/sources # # Now we merely specify a list of plugins to load from # a given project local directory # sources: - mysource Pip plugins ''''''''''' Here is an example of how loading :ref:`pip plugins ` has changed. **BuildStream 1:** .. code:: yaml plugins: - origin: pip package-name: vegetables # # We used to specify version numbers, these no longer exist. # elements: potato: 0 **BuildStream 2:** .. code:: yaml plugins: - origin: pip # # We can now specify version constraints # package-name: vegetables>=1.2 # # Now we merely specify a list of plugins to load from # a given pip package that is expected to be installed # elements: - potato Core elements ------------- This section outlines breaking changes made to :ref:`core element plugins ` which may require you to make changes to your project. The :mod:`stack ` element ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Stack elements dependencies are now hard required to be both build and runtime dependencies. The :mod:`script ` element ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``layout`` attribute has now been removed in favor of dependency level configuration. Here is an example script which collects a manifest of all files in the hypothetical ``system.bst`` element, using a hypothetical base runtime element ``base-utilities.bst``. **BuildStream 1:** .. code:: yaml kind: script build-depends: - base-utilities.bst - system.bst config: # # The old format was redundant and required explicit layout # of the dependencies already declared above. # layout: - element: base-utilities.bst destination: / - element: system.bst destination: "%{build-root}" commands: - find %{build-root} > %{install-root}/manifest.log **BuildStream 2:** .. code:: yaml kind: script # # The default location is "/" so there is no need to configure # the "base-utilities.bst" dependency # build-depends: - base-utilities.bst - system.bst config: location: "%{build-root}" config: commands: - find %{build-root} > %{install-root}/manifest.log .. tip:: The ``location`` dependency level configuration is also supported by all :mod:`BuildElement ` plugins. The :mod:`junction ` element ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The YAML format for declaring junctions has not changed, however the way that multiple junctions interact in a loaded pipeline has changed significantly. Specifically, the :ref:`element name ` used to declare a junction no longer has any special significance, whereas in BuildStream 1 the junction's name is used to coalesce matching junctions in subprojects. BuildStream 2 offers more flexibility in this regard, and allows you to *inherit* a junction from a subproject, by using a :mod:`link ` element directly in place of a junction, and/or explicitly override the configuration of a subproject's junction using the new ``overrides`` configuration attribute which the junction element now provides. Consult the :mod:`junction ` element documentation for a more detailed explanation. Migrated plugins ---------------- A majority of the plugins which used to be considered core plugins have been removed from BuildStream in favor of a more modular and distributed approach. The remaining core plugins are :ref:`documented here `. Any core plugins which you have been using in BuildStream 1 which have been migrated to separate repositories will need to be accessed externally. +---------------+-----------------------------------------------------------------------------------------+ | Plugin | New location | +===============+=========================================================================================+ | **Element plugins** | +---------------+-----------------------------------------------------------------------------------------+ | make | `buildstream-plugins `__ | +---------------+-----------------------------------------------------------------------------------------+ | autotools | `buildstream-plugins `__ | +---------------+-----------------------------------------------------------------------------------------+ | cmake | `buildstream-plugins `__ | +---------------+-----------------------------------------------------------------------------------------+ | distutils | `buildstream-plugins `__ (as setuptools) | +---------------+-----------------------------------------------------------------------------------------+ | pip | `buildstream-plugins `__ | +---------------+-----------------------------------------------------------------------------------------+ | meson | `buildstream-plugins `__ | +---------------+-----------------------------------------------------------------------------------------+ | qmake | `bst-plugins-experimental `_ | +---------------+-----------------------------------------------------------------------------------------+ | makemaker | `bst-plugins-experimental `_ | +---------------+-----------------------------------------------------------------------------------------+ | modulebuild | `bst-plugins-experimental `_ | +---------------+-----------------------------------------------------------------------------------------+ | **Source plugins** | +---------------+-----------------------------------------------------------------------------------------+ | bzr | `buildstream-plugins `__ | +---------------+-----------------------------------------------------------------------------------------+ | git | `buildstream-plugins `__ | +---------------+-----------------------------------------------------------------------------------------+ | patch | `buildstream-plugins `__ | +---------------+-----------------------------------------------------------------------------------------+ | pip | `buildstream-plugins `__ | +---------------+-----------------------------------------------------------------------------------------+ | deb | `bst-plugins-experimental `_ | +---------------+-----------------------------------------------------------------------------------------+ | ostree | `bst-plugins-experimental `_ | +---------------+-----------------------------------------------------------------------------------------+ | zip | `bst-plugins-experimental `_ | +---------------+-----------------------------------------------------------------------------------------+ .. attention:: **YAML composition with externally loaded plugins** Note that when :ref:`YAML composition ` occurs with plugins loaded from external projects, the *plugin defaults* will be composited with *your project.conf* and not with the project.conf originating in the external project containing the plugin. Example of externally loaded plugin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It is recommended to transition directly :ref:`loading these plugins through junctions `, which can be done as follows. Create an alias for PyPI in your project.conf ''''''''''''''''''''''''''''''''''''''''''''' .. code:: yaml aliases: pypi: https://files.pythonhosted.org/packages/ Create buildstream-plugins-junction.bst ''''''''''''''''''''''''''''''''''''''' Create a junction which accesses the release tarball of the plugin repository. .. code:: yaml kind: junction sources: - kind: tar url: pypi:e2/d8/ed9e849a1386297f854f9fa0200f3fa108498c0fdb5c86468c1601c7e571/buildstream-plugins-1.91.0.tar.gz ref: 44c6ea15d15476b68d0767c1d410d416f71544e57be572201058f8b3d3b05f83 Declare the plugin you want to use in your project.conf ''''''''''''''''''''''''''''''''''''''''''''''''''''''' This will make the ``make`` and ``meson`` element plugins from the `buildstream-plugins `__ project available for use in your project. .. code:: yaml plugins: - origin: junction junction: buildstream-plugins-junction.bst elements: - make - meson Miscellaneous ------------- Here we list some miscellaneous breaking changes to the format in general. Element naming ~~~~~~~~~~~~~~ The names of elements have :ref:`become more restrictive `, for example they must have the ``.bst`` extension. Overlap whitelist ~~~~~~~~~~~~~~~~~ The :ref:`overlap whitelist `, which is the public data found on elements which indicate which files an element can overwrite, must now be expressed with absolute paths. Strip commands ~~~~~~~~~~~~~~ The default ``strip-commands`` which :mod:`BuildElement ` implementations use to split out debug symbols from binaries have been removed. This can be solved by declaring a value for the ``%{strip-binaries}`` variable which will be used for this purpose.