blob: bb2dc20cf16351f9f776959d3f08214fb425c651 [file] [log] [blame]
About
-----
.. image:: https://buildstream.gitlab.io/buildstream/_static/release.svg
:target: https://gitlab.com/BuildStream/buildstream/commits/bst-1.2
.. image:: https://buildstream.gitlab.io/buildstream/_static/snapshot.svg
:target: https://gitlab.com/BuildStream/buildstream/commits/master
.. image:: https://gitlab.com/BuildStream/buildstream/badges/master/pipeline.svg
:target: https://gitlab.com/BuildStream/buildstream/commits/master
.. image:: https://gitlab.com/BuildStream/buildstream/badges/master/coverage.svg?job=coverage
:target: https://gitlab.com/BuildStream/buildstream/commits/master
.. image:: https://img.shields.io/pypi/v/BuildStream.svg
:target: https://pypi.org/project/BuildStream
What is BuildStream?
====================
`BuildStream <https://buildstream.build>`_ is a Free Software tool for
building/integrating software stacks.
It takes inspiration, lessons and use-cases from various projects including
OBS, Reproducible Builds, Yocto, Baserock, Buildroot, Aboriginal, GNOME Continuous,
JHBuild, Flatpak Builder and Android repo.
BuildStream supports multiple build-systems (e.g. autotools, cmake, cpan, distutils,
make, meson, qmake), and can create outputs in a range of formats (e.g. debian packages,
flatpak runtimes, sysroots, system images) for multiple platforms and chipsets.
Why should I use BuildStream?
=============================
BuildStream offers the following advantages:
* **Declarative build instructions/definitions**
BuildStream provides a flexible and extensible framework for the modelling
of software build pipelines in a declarative YAML format, which allows you to
manipulate filesystem data in a controlled, reproducible sandboxed environment.
* **Support for developer and integrator workflows**
BuildStream provides traceability and reproducibility for integrators handling
stacks of hundreds/thousands of components, as well as workspace features and
shortcuts to minimise cycle-time for developers.
* **Fast and predictable**
BuildStream can cache previous builds and track changes to source file content
and build/config commands. BuildStream only rebuilds the things that have changed.
* **Extensible**
You can extend BuildStream to support your favourite build-system.
* **Bootstrap toolchains and bootable systems**
BuildStream can create full systems and complete toolchains from scratch, for
a range of ISAs including x86_32, x86_64, ARMv7, ARMv8, MIPS.
Mission statement
=================
* **Deterministic build environment**
Ideally, the build result (or *artifact*) of any given build will always be
bit-for-bit identical if it is given exactly the same inputs, regardless of
the host environment, so long as BuildStream supports the given host.
To this end, we go to some lengths to ensure a clean execution environment
for building, and we bump the core cache key version if ever we change or
improve sanitizing of the execution environment, so that everything needs
to be rebuilt.
While BuildStream cannot itself guarantee a bit-for-bit identical result
for every identical input, we can help in the majority of the work needed
to ensure your builds are determinstic and reproducible.
* **Reusable build instructions**
Our declarative format is designed with the intention that the same BuildStream
project can be used to accomplish various things for the set of software it
defines the integration for.
For instance, using project options; it should be possible to reuse the same
project to deploy the same software stack, or bundle, in various ways and
on various platforms. This should be possible with BuildStream using only some
conditional statements, with minimal redundance and maximum reuse.
* **Backwards compatibility**
BuildStream provides various backwards compatible stable API surfaces, in this
way we ensure that nobody's project can ever break as a result of upgrading to
a new version of BuildStream.
These stable API surfaces include:
* The command line interface. BuildStream is intended to be scriptable and integratable
into third party tooling. For this reason the command line interface may be extended
from version to version but existing interfaces cannot be modified or removed.
* The Python plugin facing API surface. In order to avoid breaking anyone's project
who uses a custom or third party plugin, the plugin interfaces may be extended but
can never be modified or removed.
* The YAML format. As the main API surface for project authors, interfaces can be
extended in the YAML format but never modified or removed.
Beyond stability of the API surfaces, there is also the stability of the cache
keys. Currently BuildStream guarantees that artifact cache keys will never change
in a given stable release of BuildStream (e.g., all versions of 1.2.x will produce
the same cache key for the same project).
It is a long term goal to also make artifact cache keys stable, that any later version
of BuildStream produces the same cache key for an artifact which was built by any other
version of BuildStream
* **Build avoidance**
It is a general goal to reduce builds as much as possible. Whenever we can
guarantee that we already have a cached artifact which has identical inputs,
we should always prefer the existing artifact.
* **Convenient developer experience**
As an integration tool, we place focus on determinism first, but recognize that
developers need to have the same guarantees of determinism as integrators do, but
normally lack the tooling perform edit, compile and test cycles inside a well
defined deterministic build environment.
BuildStream aims to bring the deterministic and predictable target system
environment to the developer's fingertips, while also bringing convinent
developer tools to the integrator.
* **Decoupling of tooling and payload**
BuildStream is a generic build and integration tool which does not make any
assumptions about which software platform or machine architecture is going to
be used.
Some plugin elements invoking platform specific tooling such as autotools or
cmake, these provide configurable defaults for and are designed with maximum
configurability in mind, while the core application should not become biased
towards specific platforms.
* **Project Modularity**
From various experiences with tooling used to produce customized Linux based
appliances, we have recognized a trend that is to combine all build metadata
for the whole stack (from kernel to the user facing applications) in a single
repository, we see this as problematic as it does not allow inter-organizational
knowledge sharing easily, or separation of teams which produce and maintain separate
parts of the operating system stack.
BuildStream aims to make it easier to produce and maintain systems in a modular
fashion, where organizations or teams can maintain and share parts of the stack.
* **Easy to use**
Part of the mission is to be well documented, and as simple and straightforward
to use as possible.
As a part of this, we place great emphasis on error reporting, and try to fail
as early as possible when we know that we can fail; and provide as much useful
context to the user as possible to allow them to easily figure out what went
wrong.
* **Core simplicity, maximum flexibility**
BuildStream aims to be a generic core which simply processes an abstract pipeline
of elements which perform filesystem permutations inside a sandboxed environment.
We address the problem of scope creep in the following ways:
- **Many simple tools exposed in the CLI**
The command line interface is composed mostly of simple commands which
are API stable.
In this way we allow more complex and user specific constructs to be implemented
as shell scripts which invoke BuildStream one or more times, instead of growing
user specific features directly in the BuildStream CLI.
- **Stable Plugin API**
By providing a stable plugin API with strong guarantees that BuildStream will
not break external plugins, we hope to encourage and develop a healthy ecosystem
of useful plugins which users can reliably use in their project.
How do I use BuildStream?
=========================
Please refer to the `documentation <https://buildstream.gitlab.io/buildstream/>`_
for information about installing BuildStream, and about the BuildStream YAML format
and plugin options.
How does BuildStream work?
==========================
BuildStream operates on a set of YAML files (.bst files), as follows:
* Loads the YAML files which describe the target(s) and all dependencies.
* Evaluates the version information and build instructions to calculate a build
graph for the target(s) and all dependencies and unique cache-keys for each
element.
* Retrieves previously built elements (artifacts) from a local/remote cache, or
builds the elements in a sandboxed environment using the instructions declared
in the .bst files.
* Transforms/configures and/or deploys the resulting target(s) based on the
instructions declared in the .bst files.
How can I get started?
======================
To get started, first `install BuildStream by following the installation guide
<https://buildstream.gitlab.io/buildstream/main_install.html>`_
and then follow our tutorial in the
`user guide <https://buildstream.gitlab.io/buildstream/main_using.html>`_.
We also recommend exploring some existing BuildStream projects:
* https://gitlab.gnome.org/GNOME/gnome-build-meta/
* https://gitlab.com/freedesktop-sdk/freedesktop-sdk
* https://gitlab.com/baserock/definitions
If you have any questions please ask on our `#buildstream <irc://irc.gnome.org/buildstream>`_ channel in `irc.gnome.org <irc://irc.gnome.org>`_