summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim MacArthur <jim.macarthur@codethink.co.uk>2018-07-05 14:16:34 +0100
committerJim MacArthur <jim.macarthur@codethink.co.uk>2018-07-05 14:16:34 +0100
commit5d1009b0af1d30584708ffdd5192408106ae6ede (patch)
tree0e696df1c097c82accb42e20c71610b1e37444ab
parent8c82f22f2bdbcbb623d24d80d2e72070e03e2080 (diff)
parentaf993bbb5319cc0568695b9f3ea26b738ef6f76f (diff)
downloadbuildstream-jmac/googlecas_and_virtual_directories_3.tar.gz
Merge branch 'jmac/virtual_directories' into jmac/googlecas_and_virtual_directories_3jmac/googlecas_and_virtual_directories_3
-rw-r--r--.gitlab-ci.yml5
-rw-r--r--HACKING.rst101
-rw-r--r--MANIFEST.in2
-rw-r--r--NEWS2
-rw-r--r--README.rst4
-rw-r--r--buildstream/__init__.py1
-rw-r--r--buildstream/_artifactcache/__init__.py1
-rw-r--r--buildstream/_artifactcache/artifactcache.py1
-rw-r--r--buildstream/_cachekey.py1
-rw-r--r--buildstream/_context.py9
-rw-r--r--buildstream/_elementfactory.py1
-rw-r--r--buildstream/_exceptions.py5
-rw-r--r--buildstream/_frontend/__init__.py1
-rw-r--r--buildstream/_frontend/app.py2
-rw-r--r--buildstream/_frontend/cli.py129
-rw-r--r--buildstream/_frontend/complete.py10
-rw-r--r--buildstream/_frontend/linuxapp.py1
-rw-r--r--buildstream/_frontend/profile.py1
-rw-r--r--buildstream/_frontend/status.py1
-rw-r--r--buildstream/_frontend/widget.py1
-rw-r--r--buildstream/_fuse/__init__.py1
-rw-r--r--buildstream/_fuse/hardlinks.py1
-rw-r--r--buildstream/_fuse/mount.py1
-rw-r--r--buildstream/_loader/__init__.py1
-rw-r--r--buildstream/_loader/loadelement.py1
-rw-r--r--buildstream/_loader/loader.py76
-rw-r--r--buildstream/_loader/metaelement.py1
-rw-r--r--buildstream/_loader/metasource.py1
-rw-r--r--buildstream/_loader/types.py1
-rw-r--r--buildstream/_message.py1
-rw-r--r--buildstream/_options/__init__.py1
-rw-r--r--buildstream/_options/option.py1
-rw-r--r--buildstream/_options/optionarch.py1
-rw-r--r--buildstream/_options/optionbool.py1
-rw-r--r--buildstream/_options/optioneltmask.py1
-rw-r--r--buildstream/_options/optionenum.py1
-rw-r--r--buildstream/_options/optionflags.py1
-rw-r--r--buildstream/_options/optionpool.py1
-rw-r--r--buildstream/_ostree.py81
-rw-r--r--buildstream/_pipeline.py17
-rw-r--r--buildstream/_platform/__init__.py1
-rw-r--r--buildstream/_platform/linux.py1
-rw-r--r--buildstream/_platform/platform.py1
-rw-r--r--buildstream/_platform/unix.py1
-rw-r--r--buildstream/_plugincontext.py1
-rw-r--r--buildstream/_profile.py1
-rw-r--r--buildstream/_project.py37
-rw-r--r--buildstream/_projectrefs.py1
-rw-r--r--buildstream/_scheduler/__init__.py1
-rw-r--r--buildstream/_scheduler/buildqueue.py1
-rw-r--r--buildstream/_scheduler/fetchqueue.py1
-rw-r--r--buildstream/_scheduler/job.py24
-rw-r--r--buildstream/_scheduler/pullqueue.py1
-rw-r--r--buildstream/_scheduler/pushqueue.py1
-rw-r--r--buildstream/_scheduler/queue.py8
-rw-r--r--buildstream/_scheduler/scheduler.py1
-rw-r--r--buildstream/_scheduler/trackqueue.py1
-rw-r--r--buildstream/_signals.py1
-rw-r--r--buildstream/_site.py1
-rw-r--r--buildstream/_sourcefactory.py1
-rw-r--r--buildstream/_stream.py76
-rw-r--r--buildstream/_variables.py1
-rw-r--r--buildstream/_versions.py3
-rw-r--r--buildstream/_workspaces.py53
-rw-r--r--buildstream/_yaml.py5
-rw-r--r--buildstream/buildelement.py5
-rw-r--r--buildstream/element.py118
-rw-r--r--buildstream/plugin.py5
-rw-r--r--buildstream/plugins/elements/autotools.py6
-rw-r--r--buildstream/plugins/elements/autotools.yaml10
-rw-r--r--buildstream/plugins/elements/cmake.py6
-rw-r--r--buildstream/plugins/elements/compose.py44
-rw-r--r--buildstream/plugins/elements/distutils.py6
-rw-r--r--buildstream/plugins/elements/filter.py6
-rw-r--r--buildstream/plugins/elements/import.py26
-rw-r--r--buildstream/plugins/elements/junction.py6
-rw-r--r--buildstream/plugins/elements/make.py46
-rw-r--r--buildstream/plugins/elements/make.yaml42
-rw-r--r--buildstream/plugins/elements/makemaker.py6
-rw-r--r--buildstream/plugins/elements/manual.py6
-rw-r--r--buildstream/plugins/elements/meson.py5
-rw-r--r--buildstream/plugins/elements/modulebuild.py6
-rw-r--r--buildstream/plugins/elements/pip.py6
-rw-r--r--buildstream/plugins/elements/qmake.py6
-rw-r--r--buildstream/plugins/elements/script.py6
-rw-r--r--buildstream/plugins/elements/stack.py14
-rw-r--r--buildstream/plugins/sources/bzr.py9
-rw-r--r--buildstream/plugins/sources/deb.py9
-rw-r--r--buildstream/plugins/sources/git.py9
-rw-r--r--buildstream/plugins/sources/local.py5
-rw-r--r--buildstream/plugins/sources/ostree.py5
-rw-r--r--buildstream/plugins/sources/patch.py9
-rw-r--r--buildstream/plugins/sources/tar.py10
-rw-r--r--buildstream/plugins/sources/zip.py5
-rw-r--r--buildstream/sandbox/__init__.py1
-rw-r--r--buildstream/sandbox/_config.py1
-rw-r--r--buildstream/sandbox/_mount.py4
-rw-r--r--buildstream/sandbox/_mounter.py1
-rw-r--r--buildstream/sandbox/_sandboxbwrap.py13
-rw-r--r--buildstream/sandbox/_sandboxchroot.py8
-rw-r--r--buildstream/sandbox/sandbox.py76
-rw-r--r--buildstream/scriptelement.py15
-rw-r--r--buildstream/source.py5
-rw-r--r--buildstream/storage/__init__.py22
-rw-r--r--buildstream/storage/_filebaseddirectory.py253
-rw-r--r--buildstream/storage/directory.py134
-rw-r--r--buildstream/utils.py7
-rwxr-xr-xcontrib/bst-here11
-rw-r--r--doc/Makefile58
-rwxr-xr-xdoc/bst2html.py480
-rw-r--r--doc/examples/autotools/elements/base.bst5
-rw-r--r--doc/examples/autotools/elements/base/alpine.bst13
-rw-r--r--doc/examples/autotools/elements/hello.bst21
-rw-r--r--doc/examples/autotools/project.conf13
-rw-r--r--doc/examples/first-project/elements/hello.bst13
-rw-r--r--doc/examples/first-project/hello.world0
-rw-r--r--doc/examples/first-project/project.conf8
-rw-r--r--doc/examples/flatpak-autotools/project.conf2
-rw-r--r--doc/examples/integration-commands/elements/base.bst5
-rw-r--r--doc/examples/integration-commands/elements/base/alpine.bst17
-rw-r--r--doc/examples/integration-commands/elements/hello.bst22
-rw-r--r--doc/examples/integration-commands/elements/libhello.bst22
-rw-r--r--doc/examples/integration-commands/files/hello/Makefile12
-rw-r--r--doc/examples/integration-commands/files/hello/hello.c20
-rw-r--r--doc/examples/integration-commands/files/libhello/Makefile17
-rw-r--r--doc/examples/integration-commands/files/libhello/libhello.c9
-rw-r--r--doc/examples/integration-commands/files/libhello/libhello.h8
-rw-r--r--doc/examples/integration-commands/project.conf12
-rw-r--r--doc/examples/running-commands/elements/base.bst5
-rw-r--r--doc/examples/running-commands/elements/base/alpine.bst13
-rw-r--r--doc/examples/running-commands/elements/hello.bst22
-rw-r--r--doc/examples/running-commands/files/src/Makefile12
-rw-r--r--doc/examples/running-commands/files/src/hello.c10
-rw-r--r--doc/examples/running-commands/project.conf12
-rw-r--r--doc/sessions/autotools.run20
-rw-r--r--doc/sessions/first-project.run37
-rw-r--r--doc/sessions/flatpak-autotools.run21
-rw-r--r--doc/sessions/integration-commands.run15
-rw-r--r--doc/sessions/running-commands.run25
-rw-r--r--doc/source/additional_cachekeys.rst (renamed from doc/source/cachekeys.rst)0
-rw-r--r--doc/source/additional_sandboxing.rst (renamed from doc/source/sandboxing.rst)0
-rw-r--r--doc/source/authoring.rst80
-rw-r--r--doc/source/core_additional.rst10
-rw-r--r--doc/source/core_format.rst17
-rw-r--r--doc/source/core_framework.rst21
-rw-r--r--doc/source/core_plugins.rst67
-rw-r--r--doc/source/examples/flatpak-autotools.rst (renamed from doc/source/examples_flatpak_autotools.rst)74
-rw-r--r--doc/source/format_declaring.rst (renamed from doc/source/format.rst)8
-rw-r--r--doc/source/format_intro.rst (renamed from doc/source/formatintro.rst)2
-rw-r--r--doc/source/format_project.rst (renamed from doc/source/projectconf.rst)0
-rw-r--r--doc/source/format_project_refs.rst (renamed from doc/source/projectrefs.rst)0
-rw-r--r--doc/source/format_public.rst (renamed from doc/source/public.rst)3
-rw-r--r--doc/source/index.rst15
-rw-r--r--doc/source/install_artifacts.rst (renamed from doc/source/artifacts.rst)0
-rw-r--r--doc/source/install_docker.rst (renamed from doc/source/docker.rst)0
-rw-r--r--doc/source/install_main.rst (renamed from doc/source/install.rst)4
-rw-r--r--doc/source/main_about.rst (renamed from doc/source/about.rst)0
-rw-r--r--doc/source/main_core.rst24
-rw-r--r--doc/source/main_install.rst13
-rw-r--r--doc/source/main_using.rst16
-rw-r--r--doc/source/plugin.rsttemplate5
-rw-r--r--doc/source/resources.rst10
-rw-r--r--doc/source/sessions-stored/autotools-build.html135
-rw-r--r--doc/source/sessions-stored/autotools-shell.html23
-rw-r--r--doc/source/sessions-stored/autotools-show-variables.html67
-rw-r--r--doc/source/sessions-stored/first-project-build.html50
-rw-r--r--doc/source/sessions-stored/first-project-checkout.html19
-rw-r--r--doc/source/sessions-stored/first-project-init.html8
-rw-r--r--doc/source/sessions-stored/first-project-ls.html8
-rw-r--r--doc/source/sessions-stored/first-project-show.html14
-rw-r--r--doc/source/sessions-stored/first-project-touch.html6
-rw-r--r--doc/source/sessions-stored/flatpak-autotools-build.html145
-rw-r--r--doc/source/sessions-stored/flatpak-autotools-shell.html23
-rw-r--r--doc/source/sessions-stored/integration-commands-build.html159
-rw-r--r--doc/source/sessions-stored/integration-commands-shell.html26
-rw-r--r--doc/source/sessions-stored/running-commands-build.html103
-rw-r--r--doc/source/sessions-stored/running-commands-shell.html22
-rw-r--r--doc/source/sessions-stored/running-commands-show-after.html16
-rw-r--r--doc/source/sessions-stored/running-commands-show-before.html16
-rw-r--r--doc/source/tutorial/autotools.rst146
-rw-r--r--doc/source/tutorial/first-project.rst128
-rw-r--r--doc/source/tutorial/integration-commands.rst130
-rw-r--r--doc/source/tutorial/running-commands.rst236
-rw-r--r--doc/source/using_commands.rst (renamed from doc/source/commands.rst)0
-rw-r--r--doc/source/using_config.rst (renamed from doc/source/user_config.rst)0
-rw-r--r--doc/source/using_examples.rst (renamed from doc/source/examples.rst)6
-rw-r--r--doc/source/using_tutorial.rst15
-rwxr-xr-xsetup.py3
-rw-r--r--tests/completions/completions.py25
-rw-r--r--tests/context/context.py17
-rw-r--r--tests/examples/__init__.py0
-rw-r--r--tests/examples/autotools.py47
-rw-r--r--tests/examples/first-project.py29
-rw-r--r--tests/examples/integration-commands.py36
-rw-r--r--tests/examples/running-commands.py36
-rw-r--r--tests/format/project.py15
-rw-r--r--tests/format/project/project-from-subdir/manual.bst1
-rw-r--r--tests/format/project/project-from-subdir/project.conf4
-rw-r--r--tests/format/project/project-from-subdir/subdirectory/README1
-rw-r--r--tests/frontend/buildcheckout.py19
-rw-r--r--tests/frontend/cross_junction_workspace.py117
-rw-r--r--tests/frontend/fetch.py38
-rw-r--r--tests/frontend/pull.py98
-rw-r--r--tests/frontend/push.py7
-rw-r--r--tests/frontend/show.py47
-rw-r--r--tests/frontend/track.py43
-rw-r--r--tests/frontend/track_cross_junction.py156
-rw-r--r--tests/integration/make.py47
-rw-r--r--tests/integration/project/elements/make/makehello.bst10
-rw-r--r--tests/integration/project/elements/sandbox-bwrap/base-with-tmp.bst6
-rw-r--r--tests/integration/project/elements/sandbox-bwrap/test-cleanup.bst13
-rw-r--r--tests/integration/project/files/base-with-tmp/tmp/dummy1
-rw-r--r--tests/integration/project/files/makehello.tar.gzbin0 -> 432 bytes
-rw-r--r--tests/integration/sandbox-bwrap.py31
-rw-r--r--tests/loader/basics.py12
-rw-r--r--tests/loader/junctions.py40
-rw-r--r--tests/sandboxes/missing-command.py19
-rw-r--r--tests/sandboxes/missing-command/no-runtime.bst1
-rw-r--r--tests/sandboxes/missing-command/project.conf1
-rw-r--r--tests/testutils/__init__.py1
-rw-r--r--tests/testutils/element_generators.py40
221 files changed, 4856 insertions, 611 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 827415882..f7c93d658 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -141,12 +141,13 @@ tests-unix:
docs:
stage: test
script:
- - pip3 install sphinx==1.7.1
+ - export BST_SOURCE_CACHE="$(pwd)/cache/integration-cache/sources"
+ - pip3 install sphinx
- pip3 install sphinx-click
- pip3 install sphinx_rtd_theme
- cd dist && ./unpack.sh && cd buildstream
- pip3 install .
- - make -C doc
+ - make BST_FORCE_SESSION_REBUILD=1 -C doc
- cd ../..
- mv dist/buildstream/doc/build/html public
artifacts:
diff --git a/HACKING.rst b/HACKING.rst
index 76aab91a7..dd791bd24 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -1,5 +1,5 @@
-Hacking on BuildStream
-======================
+Contributing
+============
Some tips and guidelines for developers hacking on BuildStream
@@ -257,7 +257,7 @@ using pip or some other mechanism::
pip3 install --user arpy
Furthermore, the documentation build requires that BuildStream itself
-be installed.
+be installed, as it will be used in the process of generating its docs.
To build the documentation, just run the following::
@@ -267,6 +267,23 @@ This will give you a ``doc/build/html`` directory with the html docs which
you can view in your browser locally to test.
+Regenerating session html
+'''''''''''''''''''''''''
+The documentation build will build the session files if they are missing,
+or if explicitly asked to rebuild. We revision the generated session html files
+in order to reduce the burden on documentation contributors.
+
+To explicitly rebuild the session snapshot html files, it is recommended that you
+first set the ``BST_SOURCE_CACHE`` environment variable to your source cache, this
+will make the docs build reuse already downloaded sources::
+
+ export BST_SOURCE_CACHE=~/.cache/buildstream/sources
+
+To force rebuild session html while building the doc, simply build the docs like this::
+
+ make BST_FORCE_SESSION_REBUILD=1 -C doc
+
+
Man pages
~~~~~~~~~
Unfortunately it is quite difficult to integrate the man pages build
@@ -314,6 +331,84 @@ format::
"""
+Documentation Examples
+~~~~~~~~~~~~~~~~~~~~~~
+The examples section of the documentation contains a series of standalone
+examples, here are the criteria for an example addition.
+
+* The example has a ``${name}``
+
+* The example has a project users can copy and use
+
+ * This project is added in the directory ``doc/examples/${name}``
+
+* The example has a documentation component
+
+ * This is added at ``doc/source/examples/${name}.rst``
+ * A reference to ``examples/${name}`` is added to the toctree in ``doc/source/examples.rst``
+ * This documentation discusses the project elements declared in the project and may
+ provide some BuildStream command examples
+ * This documentation links out to the reference manual at every opportunity
+
+* The example has a CI test component
+
+ * This is an integration test added at ``tests/examples/${name}``
+ * This test runs BuildStream in the ways described in the example
+ and assert that we get the results which we advertize to users in
+ the said examples.
+
+
+Adding BuildStream command output
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+As a part of building the docs, BuildStream will run itself and extract
+some html for the colorized output which is produced.
+
+If you want to run BuildStream to produce some nice html for your
+documentation, then you can do so by adding new ``.run`` files to the
+``doc/sessions/`` directory.
+
+Any files added as ``doc/sessions/${example}.run`` will result in generated
+file at ``doc/source/sessions/${example}.html``, and these files can be
+included in the reStructuredText documentation at any time with::
+
+ .. raw:: html
+ :file: sessions/${example}.html
+
+The ``.run`` file format is just another YAML dictionary which consists of a
+``commands`` list, instructing the program what to do command by command.
+
+Each *command* is a dictionary, the members of which are listed here:
+
+* ``directory``: The input file relative project directory
+
+* ``output``: The input file relative output html file to generate (optional)
+
+* ``fake-output``: Don't really run the command, just pretend to and pretend
+ this was the output, an empty string will enable this too.
+
+* ``command``: The command to run, without the leading ``bst``
+
+When adding a new ``.run`` file, one should normally also commit the new
+resulting generated ``.html`` file(s) into the ``doc/source/sessions-stored/``
+directory at the same time, this ensures that other developers do not need to
+regenerate them locally in order to build the docs.
+
+**Example**:
+
+.. code:: yaml
+
+ commands:
+
+ # Make it fetch first
+ - directory: ../examples/foo
+ command: fetch hello.bst
+
+ # Capture a build output
+ - directory: ../examples/foo
+ output: ../source/sessions/foo-build.html
+ command: build hello.bst
+
+
Testing BuildStream
-------------------
BuildStream uses pytest for regression tests and testing out
diff --git a/MANIFEST.in b/MANIFEST.in
index 1ba9c3357..0ef33d078 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,5 +1,5 @@
# Basic toplevel package includes
-include buildstream.doap
+include BuildStream.doap
include COPYING
include HACKING.rst
include MAINTAINERS
diff --git a/NEWS b/NEWS
index 3fa18217f..1d621e0de 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,8 @@ buildstream 1.1.4
Artifact servers need to be migrated.
+ o Added new simple `make` element
+
=================
buildstream 1.1.3
diff --git a/README.rst b/README.rst
index f571ebff6..6f64f47a6 100644
--- a/README.rst
+++ b/README.rst
@@ -1,5 +1,5 @@
-About BuildStream
------------------
+About
+-----
.. image:: https://gitlab.com/BuildStream/buildstream/badges/master/pipeline.svg
:target: https://gitlab.com/BuildStream/buildstream/commits/master
diff --git a/buildstream/__init__.py b/buildstream/__init__.py
index 7c4b5e5e6..cf56ecfe1 100644
--- a/buildstream/__init__.py
+++ b/buildstream/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_artifactcache/__init__.py b/buildstream/_artifactcache/__init__.py
index 66373fd75..07ed52b4b 100644
--- a/buildstream/_artifactcache/__init__.py
+++ b/buildstream/_artifactcache/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017-2018 Codethink Limited
#
diff --git a/buildstream/_artifactcache/artifactcache.py b/buildstream/_artifactcache/artifactcache.py
index 1a0d14f74..f33b112bc 100644
--- a/buildstream/_artifactcache/artifactcache.py
+++ b/buildstream/_artifactcache/artifactcache.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017-2018 Codethink Limited
#
diff --git a/buildstream/_cachekey.py b/buildstream/_cachekey.py
index 3d0c19b44..fe407e96f 100644
--- a/buildstream/_cachekey.py
+++ b/buildstream/_cachekey.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
diff --git a/buildstream/_context.py b/buildstream/_context.py
index bf7f49515..1a59af2b9 100644
--- a/buildstream/_context.py
+++ b/buildstream/_context.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016-2018 Codethink Limited
#
@@ -30,6 +29,7 @@ from ._exceptions import LoadError, LoadErrorReason, BstError
from ._message import Message, MessageType
from ._profile import Topics, profile_start, profile_end
from ._artifactcache import ArtifactCache
+from ._workspaces import Workspaces
# Context()
@@ -113,6 +113,7 @@ class Context():
self._message_depth = deque()
self._projects = []
self._project_overrides = {}
+ self._workspaces = None
# load()
#
@@ -161,6 +162,7 @@ class Context():
path = _yaml.node_get(defaults, str, directory)
path = os.path.expanduser(path)
path = os.path.expandvars(path)
+ path = os.path.normpath(path)
setattr(self, directory, path)
# Load artifact share configuration
@@ -218,6 +220,8 @@ class Context():
# project (Project): The project to add
#
def add_project(self, project):
+ if not self._projects:
+ self._workspaces = Workspaces(project)
self._projects.append(project)
# get_projects():
@@ -241,6 +245,9 @@ class Context():
def get_toplevel_project(self):
return self._projects[0]
+ def get_workspaces(self):
+ return self._workspaces
+
# get_overrides():
#
# Fetch the override dictionary for the active project. This returns
diff --git a/buildstream/_elementfactory.py b/buildstream/_elementfactory.py
index bc1d95082..9d5b258cb 100644
--- a/buildstream/_elementfactory.py
+++ b/buildstream/_elementfactory.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_exceptions.py b/buildstream/_exceptions.py
index bcea65a8d..34ce91081 100644
--- a/buildstream/_exceptions.py
+++ b/buildstream/_exceptions.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -89,6 +88,7 @@ class ErrorDomain(Enum):
ELEMENT = 11
APP = 12
STREAM = 13
+ VIRTUAL_FS = 14
# BstError is an internal base exception class for BuildSream
@@ -198,6 +198,9 @@ class LoadErrorReason(Enum):
# A project.conf file was missing
MISSING_PROJECT_CONF = 17
+ # Try to load a directory not a yaml file
+ LOADING_DIRECTORY = 18
+
# LoadError
#
diff --git a/buildstream/_frontend/__init__.py b/buildstream/_frontend/__init__.py
index b2e41301e..febd4979d 100644
--- a/buildstream/_frontend/__init__.py
+++ b/buildstream/_frontend/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_frontend/app.py b/buildstream/_frontend/app.py
index fa07a9a54..4675b0eb0 100644
--- a/buildstream/_frontend/app.py
+++ b/buildstream/_frontend/app.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016-2018 Codethink Limited
#
@@ -40,7 +39,6 @@ from .._exceptions import BstError, StreamError, LoadError, LoadErrorReason, App
from .._message import Message, MessageType, unconditional_messages
from .._stream import Stream
from .._versions import BST_FORMAT_VERSION
-from .. import __version__ as build_stream_version
from .. import _yaml
# Import frontend assets
diff --git a/buildstream/_frontend/cli.py b/buildstream/_frontend/cli.py
index 41e97cb0e..e59b1baec 100644
--- a/buildstream/_frontend/cli.py
+++ b/buildstream/_frontend/cli.py
@@ -12,6 +12,45 @@ from .complete import main_bashcomplete, complete_path, CompleteUnhandled
# Override of click's main entry point #
##################################################################
+# search_command()
+#
+# Helper function to get a command and context object
+# for a given command.
+#
+# Args:
+# commands (list): A list of command words following `bst` invocation
+# context (click.Context): An existing toplevel context, or None
+#
+# Returns:
+# context (click.Context): The context of the associated command, or None
+#
+def search_command(args, *, context=None):
+ if context is None:
+ context = cli.make_context('bst', args, resilient_parsing=True)
+
+ # Loop into the deepest command
+ command = cli
+ command_ctx = context
+ for cmd in args:
+ command = command_ctx.command.get_command(command_ctx, cmd)
+ if command is None:
+ return None
+ command_ctx = command.make_context(command.name, [command.name],
+ parent=command_ctx,
+ resilient_parsing=True)
+
+ return command_ctx
+
+
+# Completion for completing command names as help arguments
+def complete_commands(cmd, args, incomplete):
+ command_ctx = search_command(args[1:])
+ if command_ctx and command_ctx.command and isinstance(command_ctx.command, click.MultiCommand):
+ return [subcommand + " " for subcommand in command_ctx.command.list_commands(command_ctx)]
+
+ return []
+
+
# Special completion for completing the bst elements in a project dir
def complete_target(args, incomplete):
"""
@@ -20,6 +59,18 @@ def complete_target(args, incomplete):
:return: all the possible user-specified completions for the param
"""
+ project_conf = 'project.conf'
+
+ def ensure_project_dir(directory):
+ directory = os.path.abspath(directory)
+ while not os.path.isfile(os.path.join(directory, project_conf)):
+ parent_dir = os.path.dirname(directory)
+ if directory == parent_dir:
+ break
+ directory = parent_dir
+
+ return directory
+
# First resolve the directory, in case there is an
# active --directory/-C option
#
@@ -35,10 +86,14 @@ def complete_target(args, incomplete):
if idx >= 0 and len(args) > idx + 1:
base_directory = args[idx + 1]
+ else:
+ # Check if this directory or any of its parent directories
+ # contain a project config file
+ base_directory = ensure_project_dir(base_directory)
# Now parse the project.conf just to find the element path,
# this is unfortunately a bit heavy.
- project_file = os.path.join(base_directory, 'project.conf')
+ project_file = os.path.join(base_directory, project_conf)
try:
project = _yaml.load(project_file)
except LoadError:
@@ -57,7 +112,7 @@ def complete_target(args, incomplete):
return complete_path("File", incomplete, base_directory=base_directory)
-def override_completions(cmd_param, args, incomplete):
+def override_completions(cmd, cmd_param, args, incomplete):
"""
:param cmd_param: command definition
:param args: full list of args typed before the incomplete arg
@@ -65,6 +120,9 @@ def override_completions(cmd_param, args, incomplete):
:return: all the possible user-specified completions for the param
"""
+ if cmd.name == 'help':
+ return complete_commands(cmd, args, incomplete)
+
# We can't easily extend click's data structures without
# modifying click itself, so just do some weak special casing
# right here and select which parameters we want to handle specially.
@@ -175,6 +233,33 @@ def cli(context, **kwargs):
##################################################################
+# Help Command #
+##################################################################
+@cli.command(name="help", short_help="Print usage information",
+ context_settings={"help_option_names": []})
+@click.argument("command", nargs=-1, metavar='COMMAND')
+@click.pass_context
+def help_command(ctx, command):
+ """Print usage information about a given command
+ """
+ command_ctx = search_command(command, context=ctx.parent)
+ if not command_ctx:
+ click.echo("Not a valid command: '{} {}'"
+ .format(ctx.parent.info_name, " ".join(command)), err=True)
+ sys.exit(-1)
+
+ click.echo(command_ctx.command.get_help(command_ctx), err=True)
+
+ # Hint about available sub commands
+ if isinstance(command_ctx.command, click.MultiCommand):
+ detail = " "
+ if command:
+ detail = " {} ".format(" ".join(command))
+ click.echo("\nFor usage on a specific command: {} help{}COMMAND"
+ .format(ctx.parent.info_name, detail), err=True)
+
+
+##################################################################
# Init Command #
##################################################################
@cli.command(short_help="Initialize a new BuildStream project")
@@ -206,20 +291,20 @@ def init(app, project_name, format_version, element_path, force):
@click.option('--all', 'all_', default=False, is_flag=True,
help="Build elements that would not be needed for the current build plan")
@click.option('--track', 'track_', multiple=True,
- type=click.Path(dir_okay=False, readable=True),
+ type=click.Path(readable=False),
help="Specify elements to track during the build. Can be used "
"repeatedly to specify multiple elements")
@click.option('--track-all', default=False, is_flag=True,
help="Track all elements in the pipeline")
@click.option('--track-except', multiple=True,
- type=click.Path(dir_okay=False, readable=True),
+ type=click.Path(readable=False),
help="Except certain dependencies from tracking")
@click.option('--track-cross-junctions', '-J', default=False, is_flag=True,
help="Allow tracking to cross junction boundaries")
@click.option('--track-save', default=False, is_flag=True,
help="Deprecated: This is ignored")
@click.argument('elements', nargs=-1,
- type=click.Path(dir_okay=False, readable=True))
+ type=click.Path(readable=False))
@click.pass_obj
def build(app, elements, all_, track_, track_save, track_all, track_except, track_cross_junctions):
"""Build elements in a pipeline"""
@@ -248,7 +333,7 @@ def build(app, elements, all_, track_, track_save, track_all, track_except, trac
##################################################################
@cli.command(short_help="Fetch sources in a pipeline")
@click.option('--except', 'except_', multiple=True,
- type=click.Path(dir_okay=False, readable=True),
+ type=click.Path(readable=False),
help="Except certain dependencies from fetching")
@click.option('--deps', '-d', default='plan',
type=click.Choice(['none', 'plan', 'all']),
@@ -258,7 +343,7 @@ def build(app, elements, all_, track_, track_save, track_all, track_except, trac
@click.option('--track-cross-junctions', '-J', default=False, is_flag=True,
help="Allow tracking to cross junction boundaries")
@click.argument('elements', nargs=-1,
- type=click.Path(dir_okay=False, readable=True))
+ type=click.Path(readable=False))
@click.pass_obj
def fetch(app, elements, deps, track_, except_, track_cross_junctions):
"""Fetch sources required to build the pipeline
@@ -299,7 +384,7 @@ def fetch(app, elements, deps, track_, except_, track_cross_junctions):
##################################################################
@cli.command(short_help="Track new source references")
@click.option('--except', 'except_', multiple=True,
- type=click.Path(dir_okay=False, readable=True),
+ type=click.Path(readable=False),
help="Except certain dependencies from tracking")
@click.option('--deps', '-d', default='none',
type=click.Choice(['none', 'all']),
@@ -307,7 +392,7 @@ def fetch(app, elements, deps, track_, except_, track_cross_junctions):
@click.option('--cross-junctions', '-J', default=False, is_flag=True,
help="Allow crossing junction boundaries")
@click.argument('elements', nargs=-1,
- type=click.Path(dir_okay=False, readable=True))
+ type=click.Path(readable=False))
@click.pass_obj
def track(app, elements, deps, except_, cross_junctions):
"""Consults the specified tracking branches for new versions available
@@ -339,7 +424,7 @@ def track(app, elements, deps, except_, cross_junctions):
@click.option('--remote', '-r',
help="The URL of the remote cache (defaults to the first configured cache)")
@click.argument('elements', nargs=-1,
- type=click.Path(dir_okay=False, readable=True))
+ type=click.Path(readable=False))
@click.pass_obj
def pull(app, elements, deps, remote):
"""Pull a built artifact from the configured remote artifact cache.
@@ -368,7 +453,7 @@ def pull(app, elements, deps, remote):
@click.option('--remote', '-r', default=None,
help="The URL of the remote cache (defaults to the first configured cache)")
@click.argument('elements', nargs=-1,
- type=click.Path(dir_okay=False, readable=True))
+ type=click.Path(readable=False))
@click.pass_obj
def push(app, elements, deps, remote):
"""Push a built artifact to a remote artifact cache.
@@ -391,7 +476,7 @@ def push(app, elements, deps, remote):
##################################################################
@cli.command(short_help="Show elements in the pipeline")
@click.option('--except', 'except_', multiple=True,
- type=click.Path(dir_okay=False, readable=True),
+ type=click.Path(readable=False),
help="Except certain dependencies")
@click.option('--deps', '-d', default='all',
type=click.Choice(['none', 'plan', 'run', 'build', 'all']),
@@ -403,7 +488,7 @@ def push(app, elements, deps, remote):
type=click.STRING,
help='Format string for each element')
@click.argument('elements', nargs=-1,
- type=click.Path(dir_okay=False, readable=True))
+ type=click.Path(readable=False))
@click.pass_obj
def show(app, elements, deps, except_, order, format_):
"""Show elements in the pipeline
@@ -482,7 +567,7 @@ def show(app, elements, deps, except_, order, format_):
@click.option('--isolate', is_flag=True, default=False,
help='Create an isolated build sandbox')
@click.argument('element',
- type=click.Path(dir_okay=False, readable=True))
+ type=click.Path(readable=False))
@click.argument('command', type=click.STRING, nargs=-1)
@click.pass_obj
def shell(app, element, sysroot, mount, isolate, build_, command):
@@ -543,7 +628,7 @@ def shell(app, element, sysroot, mount, isolate, build_, command):
@click.option('--hardlinks', default=False, is_flag=True,
help="Checkout hardlinks instead of copies (handle with care)")
@click.argument('element',
- type=click.Path(dir_okay=False, readable=True))
+ type=click.Path(readable=False))
@click.argument('directory', type=click.Path(file_okay=False))
@click.pass_obj
def checkout(app, element, directory, force, integrate, hardlinks):
@@ -577,7 +662,7 @@ def workspace():
@click.option('--track', 'track_', default=False, is_flag=True,
help="Track and fetch new source references before checking out the workspace")
@click.argument('element',
- type=click.Path(dir_okay=False, readable=True))
+ type=click.Path(readable=False))
@click.argument('directory', type=click.Path(file_okay=False))
@click.pass_obj
def workspace_open(app, no_checkout, force, track_, element, directory):
@@ -609,7 +694,7 @@ def workspace_open(app, no_checkout, force, track_, element, directory):
@click.option('--all', '-a', 'all_', default=False, is_flag=True,
help="Close all open workspaces")
@click.argument('elements', nargs=-1,
- type=click.Path(dir_okay=False, readable=True))
+ type=click.Path(readable=False))
@click.pass_obj
def workspace_close(app, remove_dir, all_, elements):
"""Close a workspace"""
@@ -626,7 +711,7 @@ def workspace_close(app, remove_dir, all_, elements):
sys.exit(0)
if all_:
- elements = [element_name for element_name, _ in app.project.workspaces.list()]
+ elements = [element_name for element_name, _ in app.context.get_workspaces().list()]
elements = app.stream.redirect_element_names(elements)
@@ -658,7 +743,7 @@ def workspace_close(app, remove_dir, all_, elements):
@click.option('--all', '-a', 'all_', default=False, is_flag=True,
help="Reset all open workspaces")
@click.argument('elements', nargs=-1,
- type=click.Path(dir_okay=False, readable=True))
+ type=click.Path(readable=False))
@click.pass_obj
def workspace_reset(app, soft, track_, all_, elements):
"""Reset a workspace to its original state"""
@@ -678,7 +763,7 @@ def workspace_reset(app, soft, track_, all_, elements):
sys.exit(-1)
if all_:
- elements = tuple(element_name for element_name, _ in app.project.workspaces.list())
+ elements = tuple(element_name for element_name, _ in app.context.get_workspaces().list())
app.stream.workspace_reset(elements, soft=soft, track_first=track_)
@@ -700,7 +785,7 @@ def workspace_list(app):
##################################################################
@cli.command(name="source-bundle", short_help="Produce a build bundle to be manually executed")
@click.option('--except', 'except_', multiple=True,
- type=click.Path(dir_okay=False, readable=True),
+ type=click.Path(readable=False),
help="Elements to except from the tarball")
@click.option('--compression', default='gz',
type=click.Choice(['none', 'gz', 'bz2', 'xz']),
@@ -712,7 +797,7 @@ def workspace_list(app):
@click.option('--directory', default=os.getcwd(),
help="The directory to write the tarball to")
@click.argument('element',
- type=click.Path(dir_okay=False, readable=True))
+ type=click.Path(readable=False))
@click.pass_obj
def source_bundle(app, element, force, directory,
track_, compression, except_):
diff --git a/buildstream/_frontend/complete.py b/buildstream/_frontend/complete.py
index fa986ee6b..79bb92758 100644
--- a/buildstream/_frontend/complete.py
+++ b/buildstream/_frontend/complete.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -209,7 +208,7 @@ def is_incomplete_argument(current_params, cmd_param):
return False
-def get_user_autocompletions(args, incomplete, cmd_param, override):
+def get_user_autocompletions(args, incomplete, cmd, cmd_param, override):
"""
:param args: full list of args typed before the incomplete arg
:param incomplete: the incomplete text of the arg to autocomplete
@@ -222,7 +221,8 @@ def get_user_autocompletions(args, incomplete, cmd_param, override):
# Use the type specific default completions unless it was overridden
try:
- return override(cmd_param=cmd_param,
+ return override(cmd=cmd,
+ cmd_param=cmd_param,
args=args,
incomplete=incomplete)
except CompleteUnhandled:
@@ -268,14 +268,14 @@ def get_choices(cli, prog_name, args, incomplete, override):
# completion for option values by choices
for cmd_param in ctx.command.params:
if isinstance(cmd_param, Option) and is_incomplete_option(all_args, cmd_param):
- choices.extend(get_user_autocompletions(all_args, incomplete, cmd_param, override))
+ choices.extend(get_user_autocompletions(all_args, incomplete, ctx.command, cmd_param, override))
found_param = True
break
if not found_param:
# completion for argument values by choices
for cmd_param in ctx.command.params:
if isinstance(cmd_param, Argument) and is_incomplete_argument(ctx.params, cmd_param):
- choices.extend(get_user_autocompletions(all_args, incomplete, cmd_param, override))
+ choices.extend(get_user_autocompletions(all_args, incomplete, ctx.command, cmd_param, override))
found_param = True
break
diff --git a/buildstream/_frontend/linuxapp.py b/buildstream/_frontend/linuxapp.py
index 92586bc40..176c5d052 100644
--- a/buildstream/_frontend/linuxapp.py
+++ b/buildstream/_frontend/linuxapp.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
diff --git a/buildstream/_frontend/profile.py b/buildstream/_frontend/profile.py
index 00a5980d3..dda0f7ffe 100644
--- a/buildstream/_frontend/profile.py
+++ b/buildstream/_frontend/profile.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
diff --git a/buildstream/_frontend/status.py b/buildstream/_frontend/status.py
index 0e5855181..3f66e009a 100644
--- a/buildstream/_frontend/status.py
+++ b/buildstream/_frontend/status.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
diff --git a/buildstream/_frontend/widget.py b/buildstream/_frontend/widget.py
index fe7229e8a..dab8cab56 100644
--- a/buildstream/_frontend/widget.py
+++ b/buildstream/_frontend/widget.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_fuse/__init__.py b/buildstream/_fuse/__init__.py
index 3ef9d631f..a5e882634 100644
--- a/buildstream/_fuse/__init__.py
+++ b/buildstream/_fuse/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_fuse/hardlinks.py b/buildstream/_fuse/hardlinks.py
index d23f3fff6..4da51bb22 100644
--- a/buildstream/_fuse/hardlinks.py
+++ b/buildstream/_fuse/hardlinks.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Stavros Korokithakis
# Copyright (C) 2017 Codethink Limited
diff --git a/buildstream/_fuse/mount.py b/buildstream/_fuse/mount.py
index 3848ad305..0ab1ce715 100644
--- a/buildstream/_fuse/mount.py
+++ b/buildstream/_fuse/mount.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_loader/__init__.py b/buildstream/_loader/__init__.py
index dbc89ba83..a2c31796e 100644
--- a/buildstream/_loader/__init__.py
+++ b/buildstream/_loader/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
diff --git a/buildstream/_loader/loadelement.py b/buildstream/_loader/loadelement.py
index b270fbef8..065364a87 100644
--- a/buildstream/_loader/loadelement.py
+++ b/buildstream/_loader/loadelement.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_loader/loader.py b/buildstream/_loader/loader.py
index e0ceb4fb9..07b0de996 100644
--- a/buildstream/_loader/loader.py
+++ b/buildstream/_loader/loader.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
@@ -107,9 +106,13 @@ class Loader():
# First pass, recursively load files and populate our table of LoadElements
#
+ deps = []
+
for target in self._targets:
profile_start(Topics.LOAD_PROJECT, target)
- self._load_file(target, rewritable, ticker)
+ junction, name, loader = self._parse_name(target, rewritable, ticker)
+ loader._load_file(name, rewritable, ticker)
+ deps.append(Dependency(name, junction=junction))
profile_end(Topics.LOAD_PROJECT, target)
#
@@ -119,7 +122,8 @@ class Loader():
# Set up a dummy element that depends on all top-level targets
# to resolve potential circular dependencies between them
DummyTarget = namedtuple('DummyTarget', ['name', 'full_name', 'deps'])
- dummy = DummyTarget(name='', full_name='', deps=[Dependency(e) for e in self._targets])
+
+ dummy = DummyTarget(name='', full_name='', deps=deps)
self._elements[''] = dummy
profile_key = "_".join(t for t in self._targets)
@@ -127,17 +131,20 @@ class Loader():
self._check_circular_deps('')
profile_end(Topics.CIRCULAR_CHECK, profile_key)
+ ret = []
#
# Sort direct dependencies of elements by their dependency ordering
#
for target in self._targets:
profile_start(Topics.SORT_DEPENDENCIES, target)
- self._sort_dependencies(target)
+ junction, name, loader = self._parse_name(target, rewritable, ticker)
+ loader._sort_dependencies(name)
profile_end(Topics.SORT_DEPENDENCIES, target)
+ # Finally, wrap what we have into LoadElements and return the target
+ #
+ ret.append(loader._collect_element(name))
- # Finally, wrap what we have into LoadElements and return the target
- #
- return [self._collect_element(target) for target in self._targets]
+ return ret
# cleanup():
#
@@ -207,7 +214,33 @@ class Loader():
# Load the data and process any conditional statements therein
fullpath = os.path.join(self._basedir, filename)
- node = _yaml.load(fullpath, shortname=filename, copy_tree=rewritable)
+ try:
+ node = _yaml.load(fullpath, shortname=filename, copy_tree=rewritable)
+ except LoadError as e:
+ if e.reason == LoadErrorReason.MISSING_FILE:
+ # If we can't find the file, try to suggest plausible
+ # alternatives by stripping the element-path from the given
+ # filename, and verifying that it exists.
+ message = "Could not find element '{}' in elements directory '{}'".format(filename, self._basedir)
+ detail = None
+ elements_dir = os.path.relpath(self._basedir, self.project.directory)
+ element_relpath = os.path.relpath(filename, elements_dir)
+ if filename.startswith(elements_dir) and os.path.exists(os.path.join(self._basedir, element_relpath)):
+ detail = "Did you mean '{}'?".format(element_relpath)
+ raise LoadError(LoadErrorReason.MISSING_FILE,
+ message, detail=detail) from e
+ elif e.reason == LoadErrorReason.LOADING_DIRECTORY:
+ # If a <directory>.bst file exists in the element path,
+ # let's suggest this as a plausible alternative.
+ message = str(e)
+ detail = None
+ if os.path.exists(os.path.join(self._basedir, filename + '.bst')):
+ element_name = filename + '.bst'
+ detail = "Did you mean '{}'?\n".format(element_name)
+ raise LoadError(LoadErrorReason.LOADING_DIRECTORY,
+ message, detail=detail) from e
+ else:
+ raise
self._options.process_node(node)
element = LoadElement(node, filename, self)
@@ -538,3 +571,30 @@ class Loader():
return self._loaders[dep.junction]
else:
return self
+
+ # _parse_name():
+ #
+ # Get junction and base name of element along with loader for the sub-project
+ #
+ # Args:
+ # name (str): Name of target
+ # rewritable (bool): Whether the loaded files should be rewritable
+ # this is a bit more expensive due to deep copies
+ # ticker (callable): An optional function for tracking load progress
+ #
+ # Returns:
+ # (tuple): - (str): name of the junction element
+ # - (str): name of the element
+ # - (Loader): loader for sub-project
+ #
+ def _parse_name(self, name, rewritable, ticker):
+ # We allow to split only once since deep junctions names are forbidden.
+ # Users who want to refer to elements in sub-sub-projects are required
+ # to create junctions on the top level project.
+ junction_path = name.rsplit(':', 1)
+ if len(junction_path) == 1:
+ return None, junction_path[-1], self
+ else:
+ self._load_file(junction_path[-2], rewritable, ticker)
+ loader = self._get_loader(junction_path[-2], rewritable=rewritable, ticker=ticker)
+ return junction_path[-2], junction_path[-1], loader
diff --git a/buildstream/_loader/metaelement.py b/buildstream/_loader/metaelement.py
index 7ba6ed0ed..16788e92b 100644
--- a/buildstream/_loader/metaelement.py
+++ b/buildstream/_loader/metaelement.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_loader/metasource.py b/buildstream/_loader/metasource.py
index 75e191595..3bcc21ec6 100644
--- a/buildstream/_loader/metasource.py
+++ b/buildstream/_loader/metasource.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_loader/types.py b/buildstream/_loader/types.py
index 9d96894c0..000925a6e 100644
--- a/buildstream/_loader/types.py
+++ b/buildstream/_loader/types.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
diff --git a/buildstream/_message.py b/buildstream/_message.py
index 9073e3803..32650450a 100644
--- a/buildstream/_message.py
+++ b/buildstream/_message.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_options/__init__.py b/buildstream/_options/__init__.py
index 7b8f36553..70bbe35aa 100644
--- a/buildstream/_options/__init__.py
+++ b/buildstream/_options/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_options/option.py b/buildstream/_options/option.py
index 9501a2bde..ffdb4d272 100644
--- a/buildstream/_options/option.py
+++ b/buildstream/_options/option.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_options/optionarch.py b/buildstream/_options/optionarch.py
index 2ced60935..13a691643 100644
--- a/buildstream/_options/optionarch.py
+++ b/buildstream/_options/optionarch.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_options/optionbool.py b/buildstream/_options/optionbool.py
index e0e1474d9..ffef55ca1 100644
--- a/buildstream/_options/optionbool.py
+++ b/buildstream/_options/optionbool.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_options/optioneltmask.py b/buildstream/_options/optioneltmask.py
index 46c7fcd62..09c2ce8c2 100644
--- a/buildstream/_options/optioneltmask.py
+++ b/buildstream/_options/optioneltmask.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_options/optionenum.py b/buildstream/_options/optionenum.py
index bc21bd81c..095b9c356 100644
--- a/buildstream/_options/optionenum.py
+++ b/buildstream/_options/optionenum.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_options/optionflags.py b/buildstream/_options/optionflags.py
index 84ecc1360..0271208d9 100644
--- a/buildstream/_options/optionflags.py
+++ b/buildstream/_options/optionflags.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_options/optionpool.py b/buildstream/_options/optionpool.py
index 70acd268e..f90fd820c 100644
--- a/buildstream/_options/optionpool.py
+++ b/buildstream/_options/optionpool.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_ostree.py b/buildstream/_ostree.py
index 6fee37dc0..217790d84 100644
--- a/buildstream/_ostree.py
+++ b/buildstream/_ostree.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
@@ -150,6 +149,42 @@ def exists(repo, ref):
return has_object
+# remove():
+#
+# Removes the given commit or symbolic ref from the repo.
+#
+# Args:
+# repo (OSTree.Repo): The repo
+# ref (str): A commit checksum or symbolic ref
+# defer_prune (bool): Whether to defer pruning to the caller. NOTE:
+# The space won't be freed until you manually
+# call repo.prune.
+#
+# Returns:
+# (int|None) The amount of space pruned from the repository in
+# Bytes, or None if defer_prune is True
+#
+def remove(repo, ref, *, defer_prune=False):
+
+ # Get the commit checksum, this will:
+ #
+ # o Return a commit checksum if ref is a symbolic branch
+ # o Return the same commit checksum if ref is a valid commit checksum
+ # o Return None if the ostree repo doesnt know this ref.
+ #
+ check = checksum(repo, ref)
+ if check is None:
+ raise OSTreeError("Could not find artifact for ref '{}'".format(ref))
+
+ repo.set_ref_immediate(None, ref, None)
+
+ if not defer_prune:
+ _, _, _, pruned = repo.prune(OSTree.RepoPruneFlags.REFS_ONLY, -1)
+ return pruned
+
+ return None
+
+
# checksum():
#
# Returns the commit checksum for a given symbolic ref,
@@ -275,3 +310,47 @@ def configure_remote(repo, remote, url, key_url=None):
repo.remote_gpg_import(remote, stream, None, 0, None)
except GLib.GError as e:
raise OSTreeError("Failed to add gpg key from url '{}': {}".format(key_url, e.message)) from e
+
+
+# list_artifacts():
+#
+# List cached artifacts in Least Recently Modified (LRM) order.
+#
+# Returns:
+# (list) - A list of refs in LRM order
+#
+def list_artifacts(repo):
+ # string of: /path/to/repo/refs/heads
+ ref_heads = os.path.join(repo.get_path().get_path(), 'refs', 'heads')
+
+ # obtain list of <project>/<element>/<key>
+ refs = _list_all_refs(repo).keys()
+
+ mtimes = []
+ for ref in refs:
+ ref_path = os.path.join(ref_heads, ref)
+ if os.path.exists(ref_path):
+ # Obtain the mtime (the time a file was last modified)
+ mtimes.append(os.path.getmtime(ref_path))
+
+ # NOTE: Sorted will sort from earliest to latest, thus the
+ # first element of this list will be the file modified earliest.
+ return [ref for _, ref in sorted(zip(mtimes, refs))]
+
+
+# _list_all_refs():
+#
+# Create a list of all refs.
+#
+# Args:
+# repo (OSTree.Repo): The repo
+#
+# Returns:
+# (dict): A dict of refs to checksums.
+#
+def _list_all_refs(repo):
+ try:
+ _, refs = repo.list_refs(None)
+ return refs
+ except GLib.GError as e:
+ raise OSTreeError(message=e.message) from e
diff --git a/buildstream/_pipeline.py b/buildstream/_pipeline.py
index ba27ca6b6..9f4504d3f 100644
--- a/buildstream/_pipeline.py
+++ b/buildstream/_pipeline.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016-2018 Codethink Limited
#
@@ -346,6 +345,8 @@ class Pipeline():
# lists targetted at tracking.
#
# Args:
+ # project (Project): Project used for cross_junction filtering.
+ # All elements are expected to belong to that project.
# elements (list of Element): The list of elements to filter
# cross_junction_requested (bool): Whether the user requested
# cross junction tracking
@@ -353,12 +354,11 @@ class Pipeline():
# Returns:
# (list of Element): The filtered or asserted result
#
- def track_cross_junction_filter(self, elements, cross_junction_requested):
+ def track_cross_junction_filter(self, project, elements, cross_junction_requested):
# Filter out cross junctioned elements
- if cross_junction_requested:
- self._assert_junction_tracking(elements)
- else:
- elements = self._filter_cross_junctions(elements)
+ if not cross_junction_requested:
+ elements = self._filter_cross_junctions(project, elements)
+ self._assert_junction_tracking(elements)
return elements
@@ -403,16 +403,17 @@ class Pipeline():
# Filters out cross junction elements from the elements
#
# Args:
+ # project (Project): The project on which elements are allowed
# elements (list of Element): The list of elements to be tracked
#
# Returns:
# (list): A filtered list of `elements` which does
# not contain any cross junction elements.
#
- def _filter_cross_junctions(self, elements):
+ def _filter_cross_junctions(self, project, elements):
return [
element for element in elements
- if element._get_project() is self._project
+ if element._get_project() is project
]
# _assert_junction_tracking()
diff --git a/buildstream/_platform/__init__.py b/buildstream/_platform/__init__.py
index 49400c3f2..29a29894b 100644
--- a/buildstream/_platform/__init__.py
+++ b/buildstream/_platform/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_platform/linux.py b/buildstream/_platform/linux.py
index f620f25be..56ebb410e 100644
--- a/buildstream/_platform/linux.py
+++ b/buildstream/_platform/linux.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_platform/platform.py b/buildstream/_platform/platform.py
index fc6a74bdd..29da33563 100644
--- a/buildstream/_platform/platform.py
+++ b/buildstream/_platform/platform.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_platform/unix.py b/buildstream/_platform/unix.py
index e9c62a45b..be4c129d3 100644
--- a/buildstream/_platform/unix.py
+++ b/buildstream/_platform/unix.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_plugincontext.py b/buildstream/_plugincontext.py
index 0be3de1b1..38d2231ba 100644
--- a/buildstream/_plugincontext.py
+++ b/buildstream/_plugincontext.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_profile.py b/buildstream/_profile.py
index 4d39cfc5e..40cd2ab7e 100644
--- a/buildstream/_profile.py
+++ b/buildstream/_profile.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_project.py b/buildstream/_project.py
index 87f14ee0d..54ec9ee34 100644
--- a/buildstream/_project.py
+++ b/buildstream/_project.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016-2018 Codethink Limited
#
@@ -34,12 +33,14 @@ from ._elementfactory import ElementFactory
from ._sourcefactory import SourceFactory
from ._projectrefs import ProjectRefs, ProjectRefStorage
from ._versions import BST_FORMAT_VERSION
-from ._workspaces import Workspaces
# The separator we use for user specified aliases
_ALIAS_SEPARATOR = ':'
+# Project Configuration file
+_PROJECT_CONF_FILE = 'project.conf'
+
# HostMount()
#
@@ -75,7 +76,7 @@ class Project():
self.name = None
# The project directory
- self.directory = os.path.abspath(directory)
+ self.directory = self._ensure_project_dir(directory)
# Absolute path to where elements are loaded from within the project
self.element_path = None
@@ -84,7 +85,6 @@ class Project():
self.refs = ProjectRefs(self.directory, 'project.refs')
self.junction_refs = ProjectRefs(self.directory, 'junction.refs')
- self.workspaces = None # Workspaces
self.options = None # OptionPool
self.junction = junction # The junction Element object, if this is a subproject
self.fail_on_overlap = False # Whether overlaps are treated as errors
@@ -211,7 +211,7 @@ class Project():
def _load(self):
# Load builtin default
- projectfile = os.path.join(self.directory, "project.conf")
+ projectfile = os.path.join(self.directory, _PROJECT_CONF_FILE)
config = _yaml.load(_site.default_project_config)
# Load project local config and override the builtin
@@ -298,9 +298,6 @@ class Project():
# Load artifacts pull/push configuration for this project
self.artifact_cache_specs = ArtifactCache.specs_from_config_node(config, self.directory)
- # Workspace configurations
- self.workspaces = Workspaces(self)
-
# Plugin origins and versions
origins = _yaml.node_get(config, list, 'plugins', default_value=[])
for origin in origins:
@@ -458,3 +455,27 @@ class Project():
# paths are passed in relative to the project, but must be absolute
origin_dict['path'] = os.path.join(self.directory, origin_dict['path'])
destination.append(origin_dict)
+
+ # _ensure_project_dir()
+ #
+ # Returns path of the project directory, if a configuration file is found
+ # in given directory or any of its parent directories.
+ #
+ # Args:
+ # directory (str) - directory from where the command was invoked
+ #
+ # Raises:
+ # LoadError if project.conf is not found
+ #
+ def _ensure_project_dir(self, directory):
+ directory = os.path.abspath(directory)
+ while not os.path.isfile(os.path.join(directory, _PROJECT_CONF_FILE)):
+ parent_dir = os.path.dirname(directory)
+ if directory == parent_dir:
+ raise LoadError(
+ LoadErrorReason.MISSING_PROJECT_CONF,
+ '{} not found in current directory or any of its parent directories'
+ .format(_PROJECT_CONF_FILE))
+ directory = parent_dir
+
+ return directory
diff --git a/buildstream/_projectrefs.py b/buildstream/_projectrefs.py
index 83dd2619b..4009d7449 100644
--- a/buildstream/_projectrefs.py
+++ b/buildstream/_projectrefs.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
diff --git a/buildstream/_scheduler/__init__.py b/buildstream/_scheduler/__init__.py
index 14cdebf8e..80523db6f 100644
--- a/buildstream/_scheduler/__init__.py
+++ b/buildstream/_scheduler/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_scheduler/buildqueue.py b/buildstream/_scheduler/buildqueue.py
index 24a124b32..50ba312ff 100644
--- a/buildstream/_scheduler/buildqueue.py
+++ b/buildstream/_scheduler/buildqueue.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_scheduler/fetchqueue.py b/buildstream/_scheduler/fetchqueue.py
index 61055725d..24512bddb 100644
--- a/buildstream/_scheduler/fetchqueue.py
+++ b/buildstream/_scheduler/fetchqueue.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_scheduler/job.py b/buildstream/_scheduler/job.py
index b8b81f2a9..cc350649e 100644
--- a/buildstream/_scheduler/job.py
+++ b/buildstream/_scheduler/job.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -138,7 +137,28 @@ class Job():
with _signals.blocked([signal.SIGINT, signal.SIGTSTP, signal.SIGTERM], ignore=False):
self._process.start()
- # Wait for it to complete
+ # Wait for the child task to complete.
+ #
+ # This is a tricky part of python which doesnt seem to
+ # make it to the online docs:
+ #
+ # o asyncio.get_child_watcher() will return a SafeChildWatcher() instance
+ # which is the default type of watcher, and the instance belongs to the
+ # "event loop policy" in use (so there is only one in the main process).
+ #
+ # o SafeChildWatcher() will register a SIGCHLD handler with the asyncio
+ # loop, and will selectively reap any child pids which have been
+ # terminated.
+ #
+ # o At registration time, the process will immediately be checked with
+ # `os.waitpid()` and will be reaped immediately, before add_child_handler()
+ # returns.
+ #
+ # The self._parent_child_completed callback passed here will normally
+ # be called after the child task has been reaped with `os.waitpid()`, in
+ # an event loop callback. Otherwise, if the job completes too fast, then
+ # the callback is called immediately.
+ #
self._watcher = asyncio.get_child_watcher()
self._watcher.add_child_handler(self._process.pid, self._parent_child_completed)
diff --git a/buildstream/_scheduler/pullqueue.py b/buildstream/_scheduler/pullqueue.py
index f9928a342..b4f5b0d73 100644
--- a/buildstream/_scheduler/pullqueue.py
+++ b/buildstream/_scheduler/pullqueue.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_scheduler/pushqueue.py b/buildstream/_scheduler/pushqueue.py
index 8a68d5953..624eefd1d 100644
--- a/buildstream/_scheduler/pushqueue.py
+++ b/buildstream/_scheduler/pushqueue.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_scheduler/queue.py b/buildstream/_scheduler/queue.py
index 7c4ad6919..15caf8348 100644
--- a/buildstream/_scheduler/queue.py
+++ b/buildstream/_scheduler/queue.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -269,10 +268,11 @@ class Queue():
# Handle any workspace modifications now
#
if job.workspace_dict:
- project = element._get_project()
- if project.workspaces.update_workspace(element.name, job.workspace_dict):
+ context = element._get_context()
+ workspaces = context.get_workspaces()
+ if workspaces.update_workspace(element._get_full_name(), job.workspace_dict):
try:
- project.workspaces.save_config()
+ workspaces.save_config()
except BstError as e:
self._message(element, MessageType.ERROR, "Error saving workspaces", detail=str(e))
except Exception as e: # pylint: disable=broad-except
diff --git a/buildstream/_scheduler/scheduler.py b/buildstream/_scheduler/scheduler.py
index 25e1e6790..f8a66ae92 100644
--- a/buildstream/_scheduler/scheduler.py
+++ b/buildstream/_scheduler/scheduler.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_scheduler/trackqueue.py b/buildstream/_scheduler/trackqueue.py
index 2e7bc8b97..e48e1ae28 100644
--- a/buildstream/_scheduler/trackqueue.py
+++ b/buildstream/_scheduler/trackqueue.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_signals.py b/buildstream/_signals.py
index 06849c9f9..0035485a5 100644
--- a/buildstream/_signals.py
+++ b/buildstream/_signals.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/_site.py b/buildstream/_site.py
index f4780ef3d..ff169180f 100644
--- a/buildstream/_site.py
+++ b/buildstream/_site.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_sourcefactory.py b/buildstream/_sourcefactory.py
index dad3ddf68..88a130e10 100644
--- a/buildstream/_sourcefactory.py
+++ b/buildstream/_sourcefactory.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_stream.py b/buildstream/_stream.py
index f2806b4c8..5c0976bd7 100644
--- a/buildstream/_stream.py
+++ b/buildstream/_stream.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
@@ -388,13 +387,13 @@ class Stream():
with target._prepare_sandbox(Scope.RUN, None, integrate=integrate) as sandbox:
# Copy or move the sandbox to the target directory
- sandbox_root = sandbox.get_directory()
+ sandbox_vroot = sandbox.get_virtual_directory()
with target.timed_activity("Checking out files in {}".format(directory)):
try:
if hardlinks:
- self._checkout_hardlinks(sandbox_root, directory)
+ self._checkout_hardlinks(sandbox_vroot, directory)
else:
- utils.copy_files(sandbox_root, directory)
+ sandbox_vroot.export_files(directory)
except OSError as e:
raise StreamError("Failed to checkout files: {}".format(e)) from e
except BstError as e:
@@ -434,8 +433,10 @@ class Stream():
detail += " \n".join(build_depends)
raise StreamError("The given element has no sources", detail=detail)
+ workspaces = self._context.get_workspaces()
+
# Check for workspace config
- workspace = self._project.workspaces.get_workspace(target.name)
+ workspace = workspaces.get_workspace(target._get_full_name())
if workspace:
raise StreamError("Workspace '{}' is already defined at: {}"
.format(target.name, workspace.path))
@@ -460,13 +461,13 @@ class Stream():
except OSError as e:
raise StreamError("Failed to create workspace directory: {}".format(e)) from e
- self._project.workspaces.create_workspace(target.name, workdir)
+ workspaces.create_workspace(target._get_full_name(), workdir)
if not no_checkout:
with target.timed_activity("Staging sources to {}".format(directory)):
target._open_workspace()
- self._project.workspaces.save_config()
+ workspaces.save_config()
self._message(MessageType.INFO, "Saved workspace configuration")
# workspace_close
@@ -478,7 +479,8 @@ class Stream():
# remove_dir (bool): Whether to remove the associated directory
#
def workspace_close(self, element_name, *, remove_dir):
- workspace = self._project.workspaces.get_workspace(element_name)
+ workspaces = self._context.get_workspaces()
+ workspace = workspaces.get_workspace(element_name)
# Remove workspace directory if prompted
if remove_dir:
@@ -491,8 +493,8 @@ class Stream():
.format(workspace.path, e)) from e
# Delete the workspace and save the configuration
- self._project.workspaces.delete_workspace(element_name)
- self._project.workspaces.save_config()
+ workspaces.delete_workspace(element_name)
+ workspaces.save_config()
self._message(MessageType.INFO, "Closed workspace for {}".format(element_name))
# workspace_reset
@@ -525,8 +527,10 @@ class Stream():
if track_first:
self._fetch(elements, track_elements=track_elements)
+ workspaces = self._context.get_workspaces()
+
for element in elements:
- workspace = self._project.workspaces.get_workspace(element.name)
+ workspace = workspaces.get_workspace(element._get_full_name())
if soft:
workspace.prepared = False
@@ -542,15 +546,15 @@ class Stream():
raise StreamError("Could not remove '{}': {}"
.format(workspace.path, e)) from e
- self._project.workspaces.delete_workspace(element.name)
- self._project.workspaces.create_workspace(element.name, workspace.path)
+ workspaces.delete_workspace(element._get_full_name())
+ workspaces.create_workspace(element._get_full_name(), workspace.path)
with element.timed_activity("Staging sources to {}".format(workspace.path)):
element._open_workspace()
self._message(MessageType.INFO, "Reset workspace for {} at: {}".format(element.name, workspace.path))
- self._project.workspaces.save_config()
+ workspaces.save_config()
# workspace_exists
#
@@ -566,11 +570,12 @@ class Stream():
# True if there are any existing workspaces.
#
def workspace_exists(self, element_name=None):
+ workspaces = self._context.get_workspaces()
if element_name:
- workspace = self._project.workspaces.get_workspace(element_name)
+ workspace = workspaces.get_workspace(element_name)
if workspace:
return True
- elif any(self._project.workspaces.list()):
+ elif any(workspaces.list()):
return True
return False
@@ -581,7 +586,7 @@ class Stream():
#
def workspace_list(self):
workspaces = []
- for element_name, workspace_ in self._project.workspaces.list():
+ for element_name, workspace_ in self._context.get_workspaces().list():
workspace_detail = {
'element': element_name,
'directory': workspace_.path,
@@ -825,12 +830,30 @@ class Stream():
# done before resolving element states.
#
assert track_selection != PipelineSelection.PLAN
- track_selected = self._pipeline.get_selection(track_elements, track_selection)
+
+ # Tracked elements are split by owner projects in order to
+ # filter cross junctions tracking dependencies on their
+ # respective project.
+ track_projects = {}
+ for element in track_elements:
+ project = element._get_project()
+ if project not in track_projects:
+ track_projects[project] = [element]
+ else:
+ track_projects[project].append(element)
+
+ track_selected = []
+
+ for project, project_elements in track_projects.items():
+ selected = self._pipeline.get_selection(project_elements, track_selection)
+ selected = self._pipeline.track_cross_junction_filter(project,
+ selected,
+ track_cross_junctions)
+ track_selected.extend(selected)
+
track_selected = self._pipeline.except_elements(track_elements,
track_selected,
track_except_elements)
- track_selected = self._pipeline.track_cross_junction_filter(track_selected,
- track_cross_junctions)
for element in track_selected:
element._schedule_tracking()
@@ -967,22 +990,17 @@ class Stream():
# Helper function for checkout()
#
- def _checkout_hardlinks(self, sandbox_root, directory):
+ def _checkout_hardlinks(self, sandbox_vroot, directory):
try:
removed = utils.safe_remove(directory)
except OSError as e:
raise StreamError("Failed to remove checkout directory: {}".format(e)) from e
if removed:
- # Try a simple rename of the sandbox root; if that
- # doesnt cut it, then do the regular link files code path
- try:
- os.rename(sandbox_root, directory)
- except OSError:
- os.makedirs(directory, exist_ok=True)
- utils.link_files(sandbox_root, directory)
+ os.makedirs(directory, exist_ok=True)
+ sandbox_vroot.export_files(directory, can_link=True, can_destroy=True)
else:
- utils.link_files(sandbox_root, directory)
+ sandbox_vroot.export_files(directory, can_link=True, can_destroy=False)
# Write the element build script to the given directory
def _write_element_script(self, directory, element):
diff --git a/buildstream/_variables.py b/buildstream/_variables.py
index b4c920a71..8299f1c1e 100644
--- a/buildstream/_variables.py
+++ b/buildstream/_variables.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
diff --git a/buildstream/_versions.py b/buildstream/_versions.py
index 6b4e3bddb..4b1bc7ec2 100644
--- a/buildstream/_versions.py
+++ b/buildstream/_versions.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
@@ -24,7 +23,7 @@
# This version is bumped whenever enhancements are made
# to the `project.conf` format or the core element format.
#
-BST_FORMAT_VERSION = 8
+BST_FORMAT_VERSION = 9
# The base BuildStream artifact version
diff --git a/buildstream/_workspaces.py b/buildstream/_workspaces.py
index f6cdeb88b..3f474b8ca 100644
--- a/buildstream/_workspaces.py
+++ b/buildstream/_workspaces.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
@@ -46,7 +45,7 @@ _WORKSPACE_MEMBERS = [
# methods.
#
# Args:
-# project (Project): The project this workspace is part of
+# toplevel_project (Project): Top project. Will be used for resolving relative workspace paths.
# path (str): The path that should host this workspace
# last_successful (str): The key of the last successful build of this workspace
# running_files (dict): A dict mapping dependency elements to files
@@ -54,13 +53,13 @@ _WORKSPACE_MEMBERS = [
# made obsolete with failed build artifacts.
#
class Workspace():
- def __init__(self, project, *, last_successful=None, path=None, prepared=False, running_files=None):
+ def __init__(self, toplevel_project, *, last_successful=None, path=None, prepared=False, running_files=None):
self.prepared = prepared
self.last_successful = last_successful
self.path = path
self.running_files = running_files if running_files is not None else {}
- self._project = project
+ self._toplevel_project = toplevel_project
self._key = None
# to_dict()
@@ -81,17 +80,17 @@ class Workspace():
# when loading from a YAML file.
#
# Args:
- # project (Project): The Project to load this for
+ # toplevel_project (Project): Top project. Will be used for resolving relative workspace paths.
# dictionary: A simple dictionary object
#
# Returns:
# (Workspace): A newly instantiated Workspace
#
@classmethod
- def from_dict(cls, project, dictionary):
+ def from_dict(cls, toplevel_project, dictionary):
# Just pass the dictionary as kwargs
- return cls(project, **dictionary)
+ return cls(toplevel_project, **dictionary)
# differs()
#
@@ -201,7 +200,7 @@ class Workspace():
# Returns: The absolute path of the element's workspace.
#
def get_absolute_path(self):
- return os.path.join(self._project.directory, self.path)
+ return os.path.join(self._toplevel_project.directory, self.path)
# Workspaces()
@@ -209,11 +208,12 @@ class Workspace():
# A class to manage Workspaces for multiple elements.
#
# Args:
-# project (Project): The project the workspaces should be associated to
+# toplevel_project (Project): Top project used to resolve paths.
#
class Workspaces():
- def __init__(self, project):
- self._project = project
+ def __init__(self, toplevel_project):
+ self._toplevel_project = toplevel_project
+ self._bst_directory = os.path.join(toplevel_project.directory, ".bst")
self._workspaces = self._load_config()
# list()
@@ -236,7 +236,7 @@ class Workspaces():
# path (str) - The path in which the workspace should be kept
#
def create_workspace(self, element_name, path):
- self._workspaces[element_name] = Workspace(self._project, path=path)
+ self._workspaces[element_name] = Workspace(self._toplevel_project, path=path)
return self._workspaces[element_name]
@@ -270,7 +270,7 @@ class Workspaces():
def update_workspace(self, element_name, workspace_dict):
assert element_name in self._workspaces
- workspace = Workspace.from_dict(self._project, workspace_dict)
+ workspace = Workspace.from_dict(self._toplevel_project, workspace_dict)
if self._workspaces[element_name].differs(workspace):
self._workspaces[element_name] = workspace
return True
@@ -305,9 +305,9 @@ class Workspaces():
for element, workspace in _yaml.node_items(self._workspaces)
}
}
- os.makedirs(os.path.join(self._project.directory, ".bst"), exist_ok=True)
+ os.makedirs(self._bst_directory, exist_ok=True)
_yaml.dump(_yaml.node_sanitize(config),
- os.path.join(self._project.directory, ".bst", "workspaces.yml"))
+ self._get_filename())
# _load_config()
#
@@ -319,7 +319,7 @@ class Workspaces():
# Raises: LoadError if there was a problem with the workspace config
#
def _load_config(self):
- workspace_file = os.path.join(self._project.directory, ".bst", "workspaces.yml")
+ workspace_file = self._get_filename()
try:
node = _yaml.load(workspace_file)
except LoadError as e:
@@ -361,8 +361,7 @@ class Workspaces():
"This is not supported anymore.\n" + \
"Please remove this element from '{}'."
raise LoadError(LoadErrorReason.INVALID_DATA,
- detail.format(element,
- os.path.join(self._project.directory, ".bst", "workspaces.yml")))
+ detail.format(element, self._get_filename()))
workspaces[element] = sources[0][1]
@@ -371,13 +370,13 @@ class Workspaces():
"Workspace config is in unexpected format.")
res = {
- element: Workspace(self._project, path=config)
+ element: Workspace(self._toplevel_project, path=config)
for element, config in _yaml.node_items(workspaces)
}
elif version >= 1 and version <= BST_WORKSPACE_FORMAT_VERSION:
workspaces = _yaml.node_get(workspaces, dict, "workspaces", default_value={})
- res = {element: self._load_workspace(self._project, node)
+ res = {element: self._load_workspace(node)
for element, node in _yaml.node_items(workspaces)}
else:
@@ -394,16 +393,24 @@ class Workspaces():
#
# Args:
# node: A YAML Node
- # project (Project): The Project to load this for
#
# Returns:
# (Workspace): A newly instantiated Workspace
#
- def _load_workspace(self, project, node):
+ def _load_workspace(self, node):
dictionary = {
'prepared': _yaml.node_get(node, bool, 'prepared', default_value=False),
'path': _yaml.node_get(node, str, 'path'),
'last_successful': _yaml.node_get(node, str, 'last_successful', default_value=None),
'running_files': _yaml.node_get(node, dict, 'running_files', default_value=None),
}
- return Workspace.from_dict(self._project, dictionary)
+ return Workspace.from_dict(self._toplevel_project, dictionary)
+
+ # _get_filename():
+ #
+ # Get the workspaces.yml file path.
+ #
+ # Returns:
+ # (str): The path to workspaces.yml file.
+ def _get_filename(self):
+ return os.path.join(self._bst_directory, "workspaces.yml")
diff --git a/buildstream/_yaml.py b/buildstream/_yaml.py
index 8954c7da9..0e090e2e7 100644
--- a/buildstream/_yaml.py
+++ b/buildstream/_yaml.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -185,6 +184,10 @@ def load(filename, shortname=None, copy_tree=False):
except FileNotFoundError as e:
raise LoadError(LoadErrorReason.MISSING_FILE,
"Could not find file at {}".format(filename)) from e
+ except IsADirectoryError as e:
+ raise LoadError(LoadErrorReason.LOADING_DIRECTORY,
+ "{} is a directory. bst command expects a .bst file."
+ .format(filename)) from e
# Like load(), but doesnt require the data to be in a file
diff --git a/buildstream/buildelement.py b/buildstream/buildelement.py
index 5f9a856d1..ec05acbeb 100644
--- a/buildstream/buildelement.py
+++ b/buildstream/buildelement.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -18,8 +17,8 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
"""
-BuildElement
-============
+BuildElement - Abstract class for build elements
+================================================
The BuildElement class is a convenience element one can derive from for
implementing the most common case of element.
diff --git a/buildstream/element.py b/buildstream/element.py
index 832f0dd93..6f06cbb1c 100644
--- a/buildstream/element.py
+++ b/buildstream/element.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016-2018 Codethink Limited
#
@@ -19,8 +18,8 @@
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
"""
-Element
-=======
+Element - Base element class
+============================
.. _core_element_abstract_methods:
@@ -66,7 +65,7 @@ Miscellaneous abstract methods also exist:
* :func:`Element.generate_script() <buildstream.element.Element.generate_script>`
- For the purpose of ``bst source bundle``, an Element may optionally implmenent this.
+ For the purpose of ``bst source bundle``, an Element may optionally implement this.
Class Reference
@@ -81,7 +80,6 @@ from collections import Mapping, OrderedDict
from contextlib import contextmanager
from enum import Enum
import tempfile
-import time
import shutil
from . import _yaml
@@ -98,6 +96,9 @@ from . import _site
from ._platform import Platform
from .sandbox._config import SandboxConfig
+from .storage.directory import Directory
+from .storage._filebaseddirectory import FileBasedDirectory, VirtualDirectoryError
+
# _KeyStrength():
#
@@ -192,6 +193,13 @@ class Element(Plugin):
*Since: 1.2*
"""
+ BST_VIRTUAL_DIRECTORY = False
+ """Whether to raise exceptions if an element uses Sandbox.get_directory
+ instead of Sandbox.get_virtual_directory.
+
+ *Since: 1.2*
+ """
+
def __init__(self, context, project, artifacts, meta, plugin_conf):
super().__init__(meta.name, context, project, meta.provenance, "element")
@@ -620,10 +628,10 @@ class Element(Plugin):
# Hard link it into the staging area
#
- basedir = sandbox.get_directory()
- stagedir = basedir \
+ vbasedir = sandbox.get_virtual_directory()
+ vstagedir = vbasedir \
if path is None \
- else os.path.join(basedir, path.lstrip(os.sep))
+ else vbasedir.descend(path.lstrip(os.sep).split(os.sep))
files = list(self.__compute_splits(include, exclude, orphans))
@@ -635,15 +643,8 @@ class Element(Plugin):
link_files = files
copy_files = []
- link_result = utils.link_files(artifact, stagedir, files=link_files,
- report_written=True)
- copy_result = utils.copy_files(artifact, stagedir, files=copy_files,
- report_written=True)
-
- cur_time = time.time()
-
- for f in copy_result.files_written:
- os.utime(os.path.join(stagedir, f), times=(cur_time, cur_time))
+ link_result = vstagedir.import_files(artifact, files=link_files, report_written=True, can_link=True)
+ copy_result = vstagedir.import_files(artifact, files=copy_files, report_written=True, update_utimes=True)
return link_result.combine(copy_result)
@@ -673,7 +674,6 @@ class Element(Plugin):
overlaps = OrderedDict()
files_written = {}
old_dep_keys = {}
- project = self._get_project()
workspace = self._get_workspace()
if self.__can_build_incrementally() and workspace.last_successful:
@@ -702,7 +702,7 @@ class Element(Plugin):
# In case we are running `bst shell`, this happens in the
# main process and we need to update the workspace config
if utils._is_main_process():
- project.workspaces.save_config()
+ self._get_context().get_workspaces().save_config()
result = dep.stage_artifact(sandbox,
path=path,
@@ -1157,7 +1157,7 @@ class Element(Plugin):
def _preflight(self):
if self.BST_FORBID_RDEPENDS and self.BST_FORBID_BDEPENDS:
- if any(self.dependencies(Scope.RUN, recurse=False)) or any(self.dependencies(Scope.RUN, recurse=False)):
+ if any(self.dependencies(Scope.RUN, recurse=False)) or any(self.dependencies(Scope.BUILD, recurse=False)):
raise ElementError("{}: Dependencies are forbidden for '{}' elements"
.format(self, self.get_kind()), reason="element-forbidden-depends")
@@ -1288,8 +1288,8 @@ class Element(Plugin):
sandbox._set_mount_source(directory, workspace.get_absolute_path())
# Stage all sources that need to be copied
- sandbox_root = sandbox.get_directory()
- host_directory = os.path.join(sandbox_root, directory.lstrip(os.sep))
+ sandbox_vroot = sandbox.get_virtual_directory()
+ host_directory = sandbox_vroot.descend(directory.lstrip(os.sep).split(os.sep), create=True)
self._stage_sources_at(host_directory, mount_workspaces=mount_workspaces)
# _stage_sources_at():
@@ -1300,28 +1300,33 @@ class Element(Plugin):
# directory (str): An absolute path to stage the sources at
# mount_workspaces (bool): mount workspaces if True, copy otherwise
#
- def _stage_sources_at(self, directory, mount_workspaces=True):
+ def _stage_sources_at(self, vdirectory, mount_workspaces=True):
with self.timed_activity("Staging sources", silent_nested=True):
- if os.path.isdir(directory) and os.listdir(directory):
- raise ElementError("Staging directory '{}' is not empty".format(directory))
-
- workspace = self._get_workspace()
- if workspace:
- # If mount_workspaces is set and we're doing incremental builds,
- # the workspace is already mounted into the sandbox.
- if not (mount_workspaces and self.__can_build_incrementally()):
- with self.timed_activity("Staging local files at {}".format(workspace.path)):
- workspace.stage(directory)
- else:
- # No workspace, stage directly
- for source in self.sources():
- source._stage(directory)
-
+ if not isinstance(vdirectory, Directory):
+ vdirectory = FileBasedDirectory(vdirectory)
+ if not vdirectory.is_empty():
+ raise ElementError("Staging directory '{}' is not empty".format(vdirectory))
+
+ with tempfile.TemporaryDirectory() as temp_staging_directory:
+
+ workspace = self._get_workspace()
+ if workspace:
+ # If mount_workspaces is set and we're doing incremental builds,
+ # the workspace is already mounted into the sandbox.
+ if not (mount_workspaces and self.__can_build_incrementally()):
+ with self.timed_activity("Staging local files at {}".format(workspace.path)):
+ workspace.stage(temp_staging_directory)
+ else:
+ # No workspace, stage directly
+ for source in self.sources():
+ source._stage(temp_staging_directory)
+
+ vdirectory.import_files(temp_staging_directory, None)
# Ensure deterministic mtime of sources at build time
- utils._set_deterministic_mtime(directory)
+ vdirectory.set_deterministic_mtime()
# Ensure deterministic owners of sources at build time
- utils._set_deterministic_user(directory)
+ vdirectory.set_deterministic_user()
# _set_required():
#
@@ -1393,12 +1398,11 @@ class Element(Plugin):
# For this reason, it is safe to update and
# save the workspaces configuration
#
- project = self._get_project()
key = self._get_cache_key()
workspace = self._get_workspace()
workspace.last_successful = key
workspace.clear_running_files()
- project.workspaces.save_config()
+ self._get_context().get_workspaces().save_config()
# _assemble():
#
@@ -1428,7 +1432,7 @@ class Element(Plugin):
with _signals.terminator(cleanup_rootdir), \
self.__sandbox(rootdir, output_file, output_file, self.__sandbox_config) as sandbox: # nopep8
- sandbox_root = sandbox.get_directory()
+ sandbox_vroot = sandbox.get_virtual_directory()
# By default, the dynamic public data is the same as the static public data.
# The plugin's assemble() method may modify this, though.
@@ -1458,23 +1462,24 @@ class Element(Plugin):
#
workspace = self._get_workspace()
if workspace and self.__staged_sources_directory:
- sandbox_root = sandbox.get_directory()
- sandbox_path = os.path.join(sandbox_root,
- self.__staged_sources_directory.lstrip(os.sep))
+ sandbox_vroot = sandbox.get_virtual_directory()
+ path_components = self.__staged_sources_directory.lstrip(os.sep).split(os.sep)
+ sandbox_vpath = sandbox_vroot.descend(path_components)
try:
- utils.copy_files(workspace.path, sandbox_path)
+ sandbox_vpath.import_files(workspace.path)
except UtilError as e:
self.warn("Failed to preserve workspace state for failed build sysroot: {}"
.format(e))
raise
- collectdir = os.path.join(sandbox_root, collect.lstrip(os.sep))
- if not os.path.exists(collectdir):
+ try:
+ collectvdir = sandbox_vroot.descend(collect.lstrip(os.sep).split(os.sep))
+ except VirtualDirectoryError:
raise ElementError(
- "Directory '{}' was not found inside the sandbox, "
+ "Subdirectory '{}' of '{}' does not exist following assembly, "
"unable to collect artifact contents"
- .format(collect))
+ .format(collect, sandbox_vroot))
# At this point, we expect an exception was raised leading to
# an error message, or we have good output to collect.
@@ -1490,7 +1495,7 @@ class Element(Plugin):
os.mkdir(metadir)
# Hard link files from collect dir to files directory
- utils.link_files(collectdir, filesdir)
+ collectvdir.export_files(filesdir, can_link=True)
# Copy build log
if self.__log_path:
@@ -1763,8 +1768,8 @@ class Element(Plugin):
# (Workspace|None): A workspace associated with this element
#
def _get_workspace(self):
- project = self._get_project()
- return project.workspaces.get_workspace(self.name)
+ workspaces = self._get_context().get_workspaces()
+ return workspaces.get_workspace(self._get_full_name())
# _write_script():
#
@@ -1932,7 +1937,7 @@ class Element(Plugin):
'execution-environment': self.__sandbox_config.get_unique_key(),
'environment': cache_env,
'sources': [s._get_unique_key(workspace is None) for s in self.__sources],
- 'workspace': '' if workspace is None else workspace.get_key(),
+ 'workspace': '' if workspace is None else workspace.get_key(self._get_project()),
'public': self.__public,
'cache': type(self.__artifacts).__name__
}
@@ -2081,7 +2086,8 @@ class Element(Plugin):
directory,
stdout=stdout,
stderr=stderr,
- config=config)
+ config=config,
+ allow_real_directory=not self.BST_VIRTUAL_DIRECTORY)
yield sandbox
else:
diff --git a/buildstream/plugin.py b/buildstream/plugin.py
index b208e2d06..29fe2cb11 100644
--- a/buildstream/plugin.py
+++ b/buildstream/plugin.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
@@ -18,8 +17,8 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
"""
-Plugin
-======
+Plugin - Base plugin class
+==========================
BuildStream supports third party plugins to define additional kinds of
:mod:`Elements <buildstream.element>` and :mod:`Sources <buildstream.source>`.
diff --git a/buildstream/plugins/elements/autotools.py b/buildstream/plugins/elements/autotools.py
index 5f54c3953..14d04d9a3 100644
--- a/buildstream/plugins/elements/autotools.py
+++ b/buildstream/plugins/elements/autotools.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016, 2018 Codethink Limited
#
@@ -18,8 +17,9 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
-"""Autotools build element
-
+"""
+autotools - Autotools build element
+===================================
This is a :mod:`BuildElement <buildstream.buildelement>` implementation for
using Autotools build scripts (also known as the `GNU Build System
<https://en.wikipedia.org/wiki/GNU_Build_System>`_).
diff --git a/buildstream/plugins/elements/autotools.yaml b/buildstream/plugins/elements/autotools.yaml
index 97ab0664c..021d3815c 100644
--- a/buildstream/plugins/elements/autotools.yaml
+++ b/buildstream/plugins/elements/autotools.yaml
@@ -4,10 +4,12 @@ variables:
autogen: |
export NOCONFIGURE=1;
- if [ -e autogen ]; then ./autogen;
- elif [ -e autogen.sh ]; then ./autogen.sh;
- elif [ -e bootstrap ]; then ./bootstrap;
- elif [ -e bootstrap.sh ]; then ./bootstrap.sh;
+
+ if [ -x %{conf-cmd} ]; then true;
+ elif [ -x autogen ]; then ./autogen;
+ elif [ -x autogen.sh ]; then ./autogen.sh;
+ elif [ -x bootstrap ]; then ./bootstrap;
+ elif [ -x bootstrap.sh ]; then ./bootstrap.sh;
else autoreconf -ivf;
fi
diff --git a/buildstream/plugins/elements/cmake.py b/buildstream/plugins/elements/cmake.py
index 292785e81..8126a80ac 100644
--- a/buildstream/plugins/elements/cmake.py
+++ b/buildstream/plugins/elements/cmake.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016, 2018 Codethink Limited
#
@@ -18,8 +17,9 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
-"""CMake build element
-
+"""
+cmake - CMake build element
+===========================
This is a :mod:`BuildElement <buildstream.buildelement>` implementation for
using the `CMake <https://cmake.org/>`_ build system.
diff --git a/buildstream/plugins/elements/compose.py b/buildstream/plugins/elements/compose.py
index 0e666c6e5..2a5979828 100644
--- a/buildstream/plugins/elements/compose.py
+++ b/buildstream/plugins/elements/compose.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
@@ -18,8 +17,9 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
-"""Compose element
-
+"""
+compose - Compose the output of multiple elements
+=================================================
This element creates a selective composition of its dependencies.
This is normally used at near the end of a pipeline to prepare
@@ -34,7 +34,6 @@ The default configuration and possible options are as such:
"""
import os
-from buildstream import utils
from buildstream import Element, Scope
@@ -56,6 +55,9 @@ class ComposeElement(Element):
# added, to reduce the potential for confusion
BST_FORBID_SOURCES = True
+ # This plugin has been modified to avoid the use of Sandbox.get_directory
+ BST_VIRTUAL_DIRECTORY = True
+
def configure(self, node):
self.node_validate(node, [
'integrate', 'include', 'exclude', 'include-orphans'
@@ -104,7 +106,8 @@ class ComposeElement(Element):
orphans=self.include_orphans)
manifest.update(files)
- basedir = sandbox.get_directory()
+ # Make a snapshot of all the files.
+ vbasedir = sandbox.get_virtual_directory()
modified_files = set()
removed_files = set()
added_files = set()
@@ -116,38 +119,24 @@ class ComposeElement(Element):
if require_split:
# Make a snapshot of all the files before integration-commands are run.
- snapshot = {
- f: getmtime(os.path.join(basedir, f))
- for f in utils.list_relative_paths(basedir)
- }
+ snapshot = set(vbasedir.list_relative_paths())
+ vbasedir.mark_unmodified()
for dep in self.dependencies(Scope.BUILD):
dep.integrate(sandbox)
if require_split:
-
# Calculate added, modified and removed files
- basedir_contents = set(utils.list_relative_paths(basedir))
+ post_integration_snapshot = vbasedir.list_relative_paths()
+ modified_files = set(vbasedir.list_modified_paths())
+ basedir_contents = set(post_integration_snapshot)
for path in manifest:
- if path in basedir_contents:
- if path in snapshot:
- preintegration_mtime = snapshot[path]
- if preintegration_mtime != getmtime(os.path.join(basedir, path)):
- modified_files.add(path)
- else:
- # If the path appears in the manifest but not the initial snapshot,
- # it may be a file staged inside a directory symlink. In this case
- # the path we got from the manifest won't show up in the snapshot
- # because utils.list_relative_paths() doesn't recurse into symlink
- # directories.
- pass
- elif path in snapshot:
+ if path in snapshot and path not in basedir_contents:
removed_files.add(path)
for path in basedir_contents:
if path not in snapshot:
added_files.add(path)
-
self.info("Integration modified {}, added {} and removed {} files"
.format(len(modified_files), len(added_files), len(removed_files)))
@@ -166,8 +155,7 @@ class ComposeElement(Element):
# instead of into a subdir. The element assemble() method should
# support this in some way.
#
- installdir = os.path.join(basedir, 'buildstream', 'install')
- os.makedirs(installdir, exist_ok=True)
+ installdir = vbasedir.descend(['buildstream', 'install'], create=True)
# We already saved the manifest for created files in the integration phase,
# now collect the rest of the manifest.
@@ -191,7 +179,7 @@ class ComposeElement(Element):
with self.timed_activity("Creating composition", detail=detail, silent_nested=True):
self.info("Composing {} files".format(len(manifest)))
- utils.link_files(basedir, installdir, files=manifest)
+ installdir.import_files(vbasedir, files=manifest, can_link=True)
# And we're done
return os.path.join(os.sep, 'buildstream', 'install')
diff --git a/buildstream/plugins/elements/distutils.py b/buildstream/plugins/elements/distutils.py
index 948e08b62..5201013c1 100644
--- a/buildstream/plugins/elements/distutils.py
+++ b/buildstream/plugins/elements/distutils.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -18,8 +17,9 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
-"""Python Distutils element
-
+"""
+distutils - Python distutils element
+====================================
A :mod:`BuildElement <buildstream.buildelement>` implementation for using
python distutils
diff --git a/buildstream/plugins/elements/filter.py b/buildstream/plugins/elements/filter.py
index 8ce16ff9f..22fddd14f 100644
--- a/buildstream/plugins/elements/filter.py
+++ b/buildstream/plugins/elements/filter.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
@@ -18,8 +17,9 @@
# Authors:
# Jonathan Maw <jonathan.maw@codethink.co.uk>
-"""Filter element
-
+"""
+filter - Extract a subset of files from another element
+=======================================================
This filters another element by producing an output that is a subset of
the filtered element.
diff --git a/buildstream/plugins/elements/import.py b/buildstream/plugins/elements/import.py
index 747455d70..11c3f9a6a 100644
--- a/buildstream/plugins/elements/import.py
+++ b/buildstream/plugins/elements/import.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -18,8 +17,9 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
-"""Import element
-
+"""
+import - Import sources directly
+================================
Import elements produce artifacts directly from its sources
without any kind of processing. These are typically used to
import an SDK to build on top of or to overlay your build with
@@ -31,7 +31,6 @@ The empty configuration is as such:
"""
import os
-import shutil
from buildstream import Element, BuildElement, ElementError
@@ -68,27 +67,22 @@ class ImportElement(BuildElement):
# Do not mount workspaces as the files are copied from outside the sandbox
self._stage_sources_in_sandbox(sandbox, 'input', mount_workspaces=False)
- rootdir = sandbox.get_directory()
- inputdir = os.path.join(rootdir, 'input')
- outputdir = os.path.join(rootdir, 'output')
+ rootdir = sandbox.get_virtual_directory()
+ inputdir = rootdir.descend(['input'])
+ outputdir = rootdir.descend(['output'], create=True)
# The directory to grab
- inputdir = os.path.join(inputdir, self.source.lstrip(os.sep))
- inputdir = inputdir.rstrip(os.sep)
+ inputdir = inputdir.descend(self.source.strip(os.sep).split(os.sep))
# The output target directory
- outputdir = os.path.join(outputdir, self.target.lstrip(os.sep))
- outputdir = outputdir.rstrip(os.sep)
-
- # Ensure target directory parent
- os.makedirs(os.path.dirname(outputdir), exist_ok=True)
+ outputdir = outputdir.descend(self.target.strip(os.sep).split(os.sep), create=True)
- if not os.path.exists(inputdir):
+ if inputdir.is_empty():
raise ElementError("{}: No files were found inside directory '{}'"
.format(self, self.source))
# Move it over
- shutil.move(inputdir, outputdir)
+ outputdir.import_files(inputdir)
# And we're done
return '/output'
diff --git a/buildstream/plugins/elements/junction.py b/buildstream/plugins/elements/junction.py
index 81fd57445..ee5ed24d5 100644
--- a/buildstream/plugins/elements/junction.py
+++ b/buildstream/plugins/elements/junction.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
@@ -18,8 +17,9 @@
# Authors:
# Jürg Billeter <juerg.billeter@codethink.co.uk>
-"""Junction element
-
+"""
+junction - Integrate subprojects
+================================
This element is a link to another BuildStream project. It allows integration
of multiple projects into a single pipeline.
diff --git a/buildstream/plugins/elements/make.py b/buildstream/plugins/elements/make.py
new file mode 100644
index 000000000..1f37cb412
--- /dev/null
+++ b/buildstream/plugins/elements/make.py
@@ -0,0 +1,46 @@
+#
+# Copyright Bloomberg Finance LP
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see <http://www.gnu.org/licenses/>.
+#
+# Authors:
+# Ed Baunton <ebaunton1@bloomberg.net>
+
+"""
+make - Make build element
+=========================
+This is a :mod:`BuildElement <buildstream.buildelement>` implementation for
+using GNU make based build.
+
+.. note::
+
+ The ``make`` element is available since :ref:`format version 9 <project_format_version>`
+
+Here is the default configuration for the ``make`` element in full:
+
+ .. literalinclude:: ../../../buildstream/plugins/elements/make.yaml
+ :language: yaml
+"""
+
+from buildstream import BuildElement
+
+
+# Element implementation for the 'make' kind.
+class MakeElement(BuildElement):
+ pass
+
+
+# Plugin entry point
+def setup():
+ return MakeElement
diff --git a/buildstream/plugins/elements/make.yaml b/buildstream/plugins/elements/make.yaml
new file mode 100644
index 000000000..1438bb52b
--- /dev/null
+++ b/buildstream/plugins/elements/make.yaml
@@ -0,0 +1,42 @@
+# make default configurations
+
+variables:
+ make: make PREFIX="%{prefix}"
+ make-install: make -j1 PREFIX="%{prefix}" DESTDIR="%{install-root}" install
+
+ # Set this if the sources cannot handle parallelization.
+ #
+ # notparallel: True
+
+config:
+
+ # Commands for building the software
+ #
+ build-commands:
+ - |
+ %{make}
+
+ # Commands for installing the software into a
+ # destination folder
+ #
+ install-commands:
+ - |
+ %{make-install}
+
+ # Commands for stripping debugging information out of
+ # installed binaries
+ #
+ strip-commands:
+ - |
+ %{strip-binaries}
+
+# Use max-jobs CPUs for building and enable verbosity
+environment:
+ MAKEFLAGS: -j%{max-jobs}
+ V: 1
+
+# And dont consider MAKEFLAGS or V as something which may
+# effect build output.
+environment-nocache:
+- MAKEFLAGS
+- V
diff --git a/buildstream/plugins/elements/makemaker.py b/buildstream/plugins/elements/makemaker.py
index 94d459f93..fccfaadab 100644
--- a/buildstream/plugins/elements/makemaker.py
+++ b/buildstream/plugins/elements/makemaker.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -18,8 +17,9 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
-"""Perl MakeMaker build element
-
+"""
+makemaker - Perl MakeMaker build element
+========================================
A :mod:`BuildElement <buildstream.buildelement>` implementation for using
the Perl ExtUtil::MakeMaker build system
diff --git a/buildstream/plugins/elements/manual.py b/buildstream/plugins/elements/manual.py
index 998394b05..c7bdba95f 100644
--- a/buildstream/plugins/elements/manual.py
+++ b/buildstream/plugins/elements/manual.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -18,8 +17,9 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
-"""Manual build element
-
+"""
+manual - Manual build element
+=============================
The most basic build element does nothing but allows users to
add custom build commands to the array understood by the :mod:`BuildElement <buildstream.buildelement>`
diff --git a/buildstream/plugins/elements/meson.py b/buildstream/plugins/elements/meson.py
index 2b7b7831a..228e90ad1 100644
--- a/buildstream/plugins/elements/meson.py
+++ b/buildstream/plugins/elements/meson.py
@@ -14,8 +14,9 @@
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
-"""Meson build element
-
+"""
+meson - Meson build element
+===========================
This is a :mod:`BuildElement <buildstream.buildelement>` implementation for
using `Meson <http://mesonbuild.com/>`_ build scripts.
diff --git a/buildstream/plugins/elements/modulebuild.py b/buildstream/plugins/elements/modulebuild.py
index c790cafb3..5189af1a6 100644
--- a/buildstream/plugins/elements/modulebuild.py
+++ b/buildstream/plugins/elements/modulebuild.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -18,8 +17,9 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
-"""Perl Module::Build build element
-
+"""
+modulebuild - Perl Module::Build build element
+==============================================
A :mod:`BuildElement <buildstream.buildelement>` implementation for using
the Perl Module::Build build system
diff --git a/buildstream/plugins/elements/pip.py b/buildstream/plugins/elements/pip.py
index b979a6d21..e62f713a6 100644
--- a/buildstream/plugins/elements/pip.py
+++ b/buildstream/plugins/elements/pip.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Mathieu Bridon
#
@@ -18,8 +17,9 @@
# Authors:
# Mathieu Bridon <bochecha@daitauha.fr>
-"""Pip build element
-
+"""
+pip - Pip build element
+=======================
A :mod:`BuildElement <buildstream.buildelement>` implementation for installing
Python modules with pip
diff --git a/buildstream/plugins/elements/qmake.py b/buildstream/plugins/elements/qmake.py
index ab5843d8b..7896692a6 100644
--- a/buildstream/plugins/elements/qmake.py
+++ b/buildstream/plugins/elements/qmake.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -18,8 +17,9 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
-"""CMake build element
-
+"""
+qmake - QMake build element
+===========================
A :mod:`BuildElement <buildstream.buildelement>` implementation for using
the qmake build system
diff --git a/buildstream/plugins/elements/script.py b/buildstream/plugins/elements/script.py
index 6778b3fac..4e422c5db 100644
--- a/buildstream/plugins/elements/script.py
+++ b/buildstream/plugins/elements/script.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
@@ -19,8 +18,9 @@
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
# Jonathan Maw <jonathan.maw@codethink.co.uk>
-"""Script element
-
+"""
+script - Run scripts to create output
+=====================================
This element allows one to run some commands to mutate the
input and create some output.
diff --git a/buildstream/plugins/elements/stack.py b/buildstream/plugins/elements/stack.py
index 45c49c514..d062b23bf 100644
--- a/buildstream/plugins/elements/stack.py
+++ b/buildstream/plugins/elements/stack.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -18,13 +17,13 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
-"""Stack element
-
+"""
+stack - Symbolic Element for dependency grouping
+================================================
Stack elements are simply a symbolic element used for representing
a logical group of elements.
"""
-import os
from buildstream import Element
@@ -52,7 +51,7 @@ class StackElement(Element):
# Just create a dummy empty artifact, its existence is a statement
# that all this stack's dependencies are built.
- rootdir = sandbox.get_directory()
+ vrootdir = sandbox.get_virtual_directory()
# XXX FIXME: This is currently needed because the artifact
# cache wont let us commit an empty artifact.
@@ -61,10 +60,7 @@ class StackElement(Element):
# the actual artifact data in a subdirectory, then we
# will be able to store some additional state in the
# artifact cache, and we can also remove this hack.
- outputdir = os.path.join(rootdir, 'output', 'bst')
-
- # Ensure target directory parent
- os.makedirs(os.path.dirname(outputdir), exist_ok=True)
+ vrootdir.descend(['output', 'bst'], create=True)
# And we're done
return '/output'
diff --git a/buildstream/plugins/sources/bzr.py b/buildstream/plugins/sources/bzr.py
index 3732304fb..21121428c 100644
--- a/buildstream/plugins/sources/bzr.py
+++ b/buildstream/plugins/sources/bzr.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
# Copyright (C) 2017 Codethink Limited
#
# This program is free software; you can redistribute it and/or
@@ -17,7 +16,13 @@
# Authors:
# Jonathan Maw <jonathan.maw@codethink.co.uk>
-"""A source implementation for staging bazaar branches
+"""
+bzr - stage files from a bazaar repository
+==========================================
+
+**Host dependencies:**
+
+ * bzr
**Usage:**
diff --git a/buildstream/plugins/sources/deb.py b/buildstream/plugins/sources/deb.py
index daf6f94c7..1cf8beb22 100644
--- a/buildstream/plugins/sources/deb.py
+++ b/buildstream/plugins/sources/deb.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
# Copyright (C) 2017 Codethink Limited
#
# This program is free software; you can redistribute it and/or
@@ -19,7 +18,13 @@
# Jonathan Maw <jonathan.maw@codethink.co.uk>
# Richard Maw <richard.maw@codethink.co.uk>
-"""A source implementation for staging deb files
+"""
+deb - stage files from .deb packages
+====================================
+
+**Host dependencies:**
+
+ * arpy (python package)
**Usage:**
diff --git a/buildstream/plugins/sources/git.py b/buildstream/plugins/sources/git.py
index f178656b0..d079d8747 100644
--- a/buildstream/plugins/sources/git.py
+++ b/buildstream/plugins/sources/git.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -18,7 +17,13 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
-"""A Source implementation for staging git checkouts
+"""
+git - stage files from a git repository
+=======================================
+
+**Host dependencies:**
+
+ * git
**Usage:**
diff --git a/buildstream/plugins/sources/local.py b/buildstream/plugins/sources/local.py
index 3193d101d..e3b019f1a 100644
--- a/buildstream/plugins/sources/local.py
+++ b/buildstream/plugins/sources/local.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -18,7 +17,9 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
-"""A Source implementation for staging local project files
+"""
+local - stage local files and directories
+=========================================
**Usage:**
diff --git a/buildstream/plugins/sources/ostree.py b/buildstream/plugins/sources/ostree.py
index b311e24bf..94fe5093f 100644
--- a/buildstream/plugins/sources/ostree.py
+++ b/buildstream/plugins/sources/ostree.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -18,7 +17,9 @@
# Authors:
# Andrew Leeming <andrew.leeming@codethink.co.uk>
-"""A Source implementation for importing/staging of OSTree checkouts.
+"""
+ostree - stage files from an OSTree repository
+==============================================
**Usage:**
diff --git a/buildstream/plugins/sources/patch.py b/buildstream/plugins/sources/patch.py
index c9e40b1e6..11b66b3ea 100644
--- a/buildstream/plugins/sources/patch.py
+++ b/buildstream/plugins/sources/patch.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright Bloomberg Finance LP
#
@@ -18,7 +17,13 @@
# Authors:
# Chandan Singh <csingh43@bloomberg.net>
-"""A Source implementation for applying local patches
+"""
+patch - apply locally stored patches
+====================================
+
+**Host dependencies:**
+
+ * patch
**Usage:**
diff --git a/buildstream/plugins/sources/tar.py b/buildstream/plugins/sources/tar.py
index e41824505..e32cc3dc8 100644
--- a/buildstream/plugins/sources/tar.py
+++ b/buildstream/plugins/sources/tar.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python3
+#
# Copyright (C) 2017 Codethink Limited
#
# This program is free software; you can redistribute it and/or
@@ -17,7 +17,13 @@
# Authors:
# Jonathan Maw <jonathan.maw@codethink.co.uk>
-"""A source implementation for staging tar files
+"""
+tar - stage files from tar archives
+===================================
+
+**Host dependencies:**
+
+ * lzip (for .tar.lz files)
**Usage:**
diff --git a/buildstream/plugins/sources/zip.py b/buildstream/plugins/sources/zip.py
index fdf8947ec..9b47d7f78 100644
--- a/buildstream/plugins/sources/zip.py
+++ b/buildstream/plugins/sources/zip.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Mathieu Bridon
#
@@ -18,7 +17,9 @@
# Authors:
# Mathieu Bridon <bochecha@daitauha.fr>
-"""A source implementation for staging zip files
+"""
+zip - stage files from zip archives
+===================================
**Usage:**
diff --git a/buildstream/sandbox/__init__.py b/buildstream/sandbox/__init__.py
index 7ee871cab..53e170fbd 100644
--- a/buildstream/sandbox/__init__.py
+++ b/buildstream/sandbox/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/sandbox/_config.py b/buildstream/sandbox/_config.py
index 8893e3faa..5debe24b2 100644
--- a/buildstream/sandbox/_config.py
+++ b/buildstream/sandbox/_config.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
diff --git a/buildstream/sandbox/_mount.py b/buildstream/sandbox/_mount.py
index 84ab30ada..0f96a92b7 100644
--- a/buildstream/sandbox/_mount.py
+++ b/buildstream/sandbox/_mount.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
@@ -33,7 +32,8 @@ from .._fuse import SafeHardlinks
class Mount():
def __init__(self, sandbox, mount_point, safe_hardlinks):
scratch_directory = sandbox._get_scratch_directory()
- root_directory = sandbox.get_directory()
+ # Getting external_directory here is acceptable as we're part of the sandbox code.
+ root_directory = sandbox.get_virtual_directory().external_directory
self.mount_point = mount_point
self.safe_hardlinks = safe_hardlinks
diff --git a/buildstream/sandbox/_mounter.py b/buildstream/sandbox/_mounter.py
index c039b31df..921d06bb6 100644
--- a/buildstream/sandbox/_mounter.py
+++ b/buildstream/sandbox/_mounter.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
diff --git a/buildstream/sandbox/_sandboxbwrap.py b/buildstream/sandbox/_sandboxbwrap.py
index d18cb9ec0..010e4791d 100644
--- a/buildstream/sandbox/_sandboxbwrap.py
+++ b/buildstream/sandbox/_sandboxbwrap.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -29,6 +28,7 @@ from contextlib import ExitStack
import psutil
+from .._exceptions import SandboxError
from .. import utils, _signals
from ._mount import MountMap
from . import Sandbox, SandboxFlags
@@ -56,7 +56,9 @@ class SandboxBwrap(Sandbox):
def run(self, command, flags, *, cwd=None, env=None):
stdout, stderr = self._get_output()
- root_directory = self.get_directory()
+
+ # Allowable access to underlying storage as we're part of the sandbox
+ root_directory = self.get_virtual_directory().external_directory
# Fallback to the sandbox default settings for
# the cwd and env.
@@ -67,6 +69,11 @@ class SandboxBwrap(Sandbox):
if env is None:
env = self._get_environment()
+ if not self._has_command(command[0], env):
+ raise SandboxError("Staged artifacts do not provide command "
+ "'{}'".format(command[0]),
+ reason='missing-command')
+
# We want command args as a list of strings
if isinstance(command, str):
command = [command]
@@ -207,7 +214,7 @@ class SandboxBwrap(Sandbox):
# Skip removal of directories which already existed before
# launching bwrap
- if not existing_basedirs[basedir]:
+ if existing_basedirs[basedir]:
continue
base_directory = os.path.join(root_mount_source, basedir)
diff --git a/buildstream/sandbox/_sandboxchroot.py b/buildstream/sandbox/_sandboxchroot.py
index 7f27f50d0..de4eb46e2 100644
--- a/buildstream/sandbox/_sandboxchroot.py
+++ b/buildstream/sandbox/_sandboxchroot.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
@@ -59,6 +58,11 @@ class SandboxChroot(Sandbox):
if env is None:
env = self._get_environment()
+ if not self._has_command(command[0], env):
+ raise SandboxError("Staged artifacts do not provide command "
+ "'{}'".format(command[0]),
+ reason='missing-command')
+
# Command must be a list
if isinstance(command, str):
command = [command]
@@ -86,7 +90,7 @@ class SandboxChroot(Sandbox):
# Nonetheless a better solution could perhaps be found.
rootfs = stack.enter_context(utils._tempdir(dir='/var/run/buildstream'))
- stack.enter_context(self.create_devices(self.get_directory(), flags))
+ stack.enter_context(self.create_devices(self._root, flags))
stack.enter_context(self.mount_dirs(rootfs, flags, stdout, stderr))
if flags & SandboxFlags.INTERACTIVE:
diff --git a/buildstream/sandbox/sandbox.py b/buildstream/sandbox/sandbox.py
index 3ab75f1a8..f3cab41ec 100644
--- a/buildstream/sandbox/sandbox.py
+++ b/buildstream/sandbox/sandbox.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
@@ -19,9 +18,8 @@
# Andrew Leeming <andrew.leeming@codethink.co.uk>
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
"""
-Sandbox
-=======
-
+Sandbox - The build sandbox
+===========================
:class:`.Element` plugins which want to interface with the sandbox
need only understand this interface, while it may be given a different
sandbox implementation, any sandbox implementation it is given will
@@ -31,7 +29,8 @@ See also: :ref:`sandboxing`.
"""
import os
-from .._exceptions import ImplError
+from .._exceptions import ImplError, BstError
+from ..storage._filebaseddirectory import FileBasedDirectory
class SandboxFlags():
@@ -92,28 +91,63 @@ class Sandbox():
self.__cwd = None
self.__env = None
self.__mount_sources = {}
+ self.__allow_real_directory = kwargs['allow_real_directory']
+
# Configuration from kwargs common to all subclasses
self.__config = kwargs['config']
self.__stdout = kwargs['stdout']
self.__stderr = kwargs['stderr']
- # Setup the directories
+ # Setup the directories. Root should be available to subclasses, hence
+ # being single-underscore. The others are private to this class.
+ self._root = os.path.join(directory, 'root')
self.__directory = directory
- self.__root = os.path.join(self.__directory, 'root')
self.__scratch = os.path.join(self.__directory, 'scratch')
- for directory_ in [self.__root, self.__scratch]:
+ for directory_ in [self._root, self.__scratch]:
os.makedirs(directory_, exist_ok=True)
def get_directory(self):
"""Fetches the sandbox root directory
The root directory is where artifacts for the base
- runtime environment should be staged.
+ runtime environment should be staged. Only works if
+ BST_VIRTUAL_DIRECTORY is not set.
Returns:
(str): The sandbox root directory
+
"""
- return self.__root
+ if self.__allow_real_directory:
+ return self._root
+ else:
+ raise BstError("You can't use get_directory")
+
+ def get_virtual_directory(self):
+ """Fetches the sandbox root directory
+
+ The root directory is where artifacts for the base
+ runtime environment should be staged. Only works if
+ BST_VIRTUAL_DIRECTORY is not set.
+
+ Returns:
+ (str): The sandbox root directory
+
+ """
+ # For now, just create a new Directory every time we're asked
+ return FileBasedDirectory(self._root)
+
+ def get_virtual_toplevel_directory(self):
+ """Fetches the sandbox's toplevel directory
+
+ The toplevel directory contains 'root', 'scratch' and later
+ 'artifact' where output is copied to.
+
+ Returns:
+ (str): The sandbox toplevel directory
+
+ """
+ # For now, just create a new Directory every time we're asked
+ return FileBasedDirectory(self.__directory)
def set_environment(self, environment):
"""Sets the environment variables for the sandbox
@@ -281,3 +315,25 @@ class Sandbox():
# data passed in during construction.
def _get_config(self):
return self.__config
+
+ # _has_command()
+ #
+ # Tests whether a command exists inside the sandbox
+ #
+ # Args:
+ # command (list): The command to test.
+ # env (dict): A dictionary of string key, value pairs to set as environment
+ # variables inside the sandbox environment.
+ # Returns:
+ # (bool): Whether a command exists inside the sandbox.
+ def _has_command(self, command, env=None):
+ if os.path.isabs(command):
+ return os.path.exists(os.path.join(
+ self.get_directory(), command.lstrip(os.sep)))
+
+ for path in env.get('PATH').split(':'):
+ if os.path.exists(os.path.join(
+ self.get_directory(), path.lstrip(os.sep), command)):
+ return True
+
+ return False
diff --git a/buildstream/scriptelement.py b/buildstream/scriptelement.py
index 95e6928ee..645381a40 100644
--- a/buildstream/scriptelement.py
+++ b/buildstream/scriptelement.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2017 Codethink Limited
#
@@ -19,9 +18,8 @@
# Jonathan Maw <jonathan.maw@codethink.co.uk>
"""
-ScriptElement
-=============
-
+ScriptElement - Abstract class for scripting elements
+=====================================================
The ScriptElement class is a convenience class one can derive for
implementing elements that stage elements and run command-lines on them.
@@ -245,9 +243,8 @@ class ScriptElement(Element):
with self.timed_activity("Staging {} at {}"
.format(element.name, item['destination']),
silent_nested=True):
- real_dstdir = os.path.join(sandbox.get_directory(),
- item['destination'].lstrip(os.sep))
- os.makedirs(os.path.dirname(real_dstdir), exist_ok=True)
+ virtual_dstdir = sandbox.get_virtual_directory()
+ virtual_dstdir.descend(item['destination'].lstrip(os.sep).split(os.sep), create=True)
element.stage_dependency_artifacts(sandbox, Scope.RUN, path=item['destination'])
for item in self.__layout:
@@ -265,8 +262,8 @@ class ScriptElement(Element):
for dep in element.dependencies(Scope.RUN):
dep.integrate(sandbox)
- os.makedirs(os.path.join(sandbox.get_directory(), self.__install_root.lstrip(os.sep)),
- exist_ok=True)
+ install_root_path_components = self.__install_root.lstrip(os.sep).split(os.sep)
+ sandbox.get_virtual_directory().descend(install_root_path_components, create=True)
def assemble(self, sandbox):
diff --git a/buildstream/source.py b/buildstream/source.py
index fa547d641..ec38ae8f2 100644
--- a/buildstream/source.py
+++ b/buildstream/source.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
@@ -18,8 +17,8 @@
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
"""
-Source
-======
+Source - Base source class
+==========================
.. _core_source_abstract_methods:
diff --git a/buildstream/storage/__init__.py b/buildstream/storage/__init__.py
new file mode 100644
index 000000000..49364bb86
--- /dev/null
+++ b/buildstream/storage/__init__.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2017 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see <http://www.gnu.org/licenses/>.
+#
+# Authors:
+# Jim MacArthur <jim.macarthur@codethink.co.uk>
+
+from ._filebaseddirectory import FileBasedDirectory
+from .directory import Directory
diff --git a/buildstream/storage/_filebaseddirectory.py b/buildstream/storage/_filebaseddirectory.py
new file mode 100644
index 000000000..60379eaed
--- /dev/null
+++ b/buildstream/storage/_filebaseddirectory.py
@@ -0,0 +1,253 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2018 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see <http://www.gnu.org/licenses/>.
+#
+# Authors:
+# Jim MacArthur <jim.macarthur@codethink.co.uk>
+
+"""
+FileBasedDirectory
+=========
+
+Implementation of the Directory class which backs onto a normal POSIX filing system.
+
+See also: :ref:`sandboxing`.
+"""
+
+from typing import List
+from collections import OrderedDict
+
+import calendar
+import os
+import time
+from .._exceptions import BstError, ErrorDomain
+from .directory import Directory
+from ..utils import link_files, copy_files, FileListResult, list_relative_paths
+from ..utils import _set_deterministic_user, _set_deterministic_mtime
+
+
+class VirtualDirectoryError(BstError):
+ """Raised by Directory functions when system calls fail.
+ This will be handled internally by the BuildStream core,
+ if you need to handle this error, then it should be reraised,
+ or either of the :class:`.ElementError` or :class:`.SourceError`
+ exceptions should be raised from this error.
+ """
+ def __init__(self, message, reason=None):
+ super().__init__(message, domain=ErrorDomain.VIRTUAL_FS, reason=reason)
+
+
+# Like os.path.getmtime(), but doesnt explode on symlinks
+# Copy/pasted from compose.py
+def getmtime(path):
+ stat = os.lstat(path)
+ return stat.st_mtime
+
+# FileBasedDirectory intentionally doesn't call its superclass constuctor,
+# which is mean to be unimplemented.
+# pylint: disable=super-init-not-called
+
+
+class _FileObject():
+ """A description of a file in a virtual directory. The contents of
+ this class are never used, but there needs to be something present
+ for files so is_empty() works correctly.
+
+ """
+ def __init__(self, virtual_directory: Directory, filename: str):
+ self.directory = virtual_directory
+ self.filename = filename
+
+
+class FileBasedDirectory(Directory):
+ def __init__(self, external_directory=None):
+ self.external_directory = external_directory
+ self.index = OrderedDict()
+ self._directory_read = False
+
+ def _populate_index(self) -> None:
+ if self._directory_read:
+ return
+ for entry in os.listdir(self.external_directory):
+ if os.path.isdir(os.path.join(self.external_directory, entry)):
+ self.index[entry] = FileBasedDirectory(os.path.join(self.external_directory, entry))
+ else:
+ self.index[entry] = _FileObject(self, entry)
+ self._directory_read = True
+
+ def descend(self, subdirectory_spec: List[str], create: bool = False) -> Directory:
+ """ Descend one or more levels of directory hierarchy and return a new
+ Directory object for that directory.
+
+ Arguments:
+ * subdirectory_spec (list of strings): A list of strings which are all directory
+ names.
+ * create (boolean): If this is true, the directories will be created if
+ they don't already exist.
+ """
+
+ # It's very common to send a directory name instead of a list and this causes
+ # bizarre errors, so check for it here
+ if not isinstance(subdirectory_spec, list):
+ subdirectory_spec = [subdirectory_spec]
+ if not subdirectory_spec:
+ return self
+
+ # Because of the way split works, it's common to get a list which begins with
+ # an empty string. Detect these and remove them, then start again.
+ if subdirectory_spec[0] == "":
+ return self.descend(subdirectory_spec[1:], create)
+
+ self._populate_index()
+ if subdirectory_spec[0] in self.index:
+ entry = self.index[subdirectory_spec[0]]
+ if isinstance(entry, FileBasedDirectory):
+ new_path = os.path.join(self.external_directory, subdirectory_spec[0])
+ return FileBasedDirectory(new_path).descend(subdirectory_spec[1:], create)
+ else:
+ error = "Cannot descend into {}, which is a '{}' in the directory {}"
+ raise VirtualDirectoryError(error.format(subdirectory_spec[0],
+ type(entry).__name__,
+ self.external_directory))
+ else:
+ if create:
+ new_path = os.path.join(self.external_directory, subdirectory_spec[0])
+ os.makedirs(new_path, exist_ok=True)
+ return FileBasedDirectory(new_path).descend(subdirectory_spec[1:], create)
+ else:
+ error = "No entry called '{}' found in the directory rooted at {}"
+ raise VirtualDirectoryError(error.format(subdirectory_spec[0], self.external_directory))
+ return None
+
+ def import_files(self, external_pathspec: any, files: List[str] = None,
+ report_written: bool = True, update_utimes: bool = False,
+ can_link: bool = False) -> FileListResult:
+ """Imports some or all files from external_path into this directory.
+
+ Keyword arguments: external_pathspec: Either a string
+ containing a pathname, or a Directory object, to use as the
+ source.
+
+ files (list of strings): A list of all the files relative to
+ the external_pathspec to copy. If 'None' is supplied, all
+ files are copied.
+
+ report_written (bool): Return the full list of files
+ written. Defaults to true. If false, only a list of
+ overwritten files is returned.
+
+ update_utimes (bool): Update the access and modification time
+ of each file copied to the current time.
+
+ can_link (bool): Whether it's OK to create a hard link to the
+ original content, meaning the stored copy will change when the
+ original files change. Setting this doesn't guarantee hard
+ links will be made. can_link will never be used if
+ update_utimes is set.
+ """
+
+ if isinstance(external_pathspec, Directory):
+ source_directory = external_pathspec.external_directory
+ else:
+ source_directory = external_pathspec
+
+ if can_link and not update_utimes:
+ import_result = link_files(source_directory, self.external_directory, files=files,
+ ignore_missing=False, report_written=report_written)
+ else:
+ import_result = copy_files(source_directory, self.external_directory, files=files,
+ ignore_missing=False, report_written=report_written)
+ if update_utimes:
+ cur_time = time.time()
+
+ for f in import_result.files_written:
+ os.utime(os.path.join(self.external_directory, f), times=(cur_time, cur_time))
+ return import_result
+
+ def set_deterministic_mtime(self) -> None:
+ """ Sets a static modification time for all regular files in this directory.
+ The magic number for timestamps: 2011-11-11 11:11:11
+ """
+ _set_deterministic_mtime(self.external_directory)
+
+ def set_deterministic_user(self) -> None:
+ """ Sets all files in this directory to the current user's euid/egid.
+ """
+ _set_deterministic_user(self.external_directory)
+
+ def export_files(self, to_directory: str, can_link: bool = False, can_destroy: bool = False) -> None:
+ """Copies everything from this into to_directory.
+
+ Arguments:
+
+ to_directory (string): a path outside this directory object
+ where the contents will be copied to.
+
+ can_link (bool): Whether we can create hard links in to_directory
+ instead of copying.
+
+ """
+
+ if can_destroy:
+ # Try a simple rename of the sandbox root; if that
+ # doesnt cut it, then do the regular link files code path
+ try:
+ os.rename(self.external_directory, to_directory)
+ return
+ except OSError:
+ # Proceed using normal link/copy
+ pass
+
+ if can_link:
+ link_files(self.external_directory, to_directory)
+ else:
+ copy_files(self.external_directory, to_directory)
+
+ def is_empty(self) -> bool:
+ """ Return true if this directory has no files, subdirectories or links in it.
+ """
+ self._populate_index()
+ return len(self.index) == 0
+
+ def mark_unmodified(self) -> None:
+ """ Marks all files in this directory (recursively) as unmodified.
+ """
+ _set_deterministic_mtime(self.external_directory)
+
+ def list_modified_paths(self) -> List[str]:
+ """Provide a list of relative paths which have been modified since the
+ last call to mark_unmodified.
+
+ Return value: List(str) - list of modified paths
+ """
+ magic_timestamp = calendar.timegm([2011, 11, 11, 11, 11, 11])
+
+ return [f for f in list_relative_paths(self.external_directory)
+ if getmtime(os.path.join(self.external_directory, f)) != magic_timestamp]
+
+ def list_relative_paths(self) -> List[str]:
+ """Provide a list of all relative paths.
+
+ Return value: List(str) - list of all paths
+ """
+
+ return list_relative_paths(self.external_directory)
+
+ def __str__(self) -> str:
+ # This returns the whole path (since we don't know where the directory started)
+ # which exposes the sandbox directory; we will have to assume for the time being
+ # that people will not abuse __str__.
+ return self.external_directory
diff --git a/buildstream/storage/directory.py b/buildstream/storage/directory.py
new file mode 100644
index 000000000..f37fb98ad
--- /dev/null
+++ b/buildstream/storage/directory.py
@@ -0,0 +1,134 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2018 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see <http://www.gnu.org/licenses/>.
+#
+# Authors:
+# Jim MacArthur <jim.macarthur@codethink.co.uk>
+
+"""
+Directory
+=========
+
+Virtual Directory class to isolate the rest of BuildStream from the backing store implementation.
+Sandboxes are allowed to read from and write to the underlying storage, but all others must use this
+Directory class to access files and directories in the sandbox.
+
+See also: :ref:`sandboxing`.
+"""
+
+from typing import List
+from ..utils import FileListResult
+
+
+class Directory():
+ def __init__(self, external_directory=None):
+ raise NotImplementedError()
+
+ def descend(self, subdirectory_spec: List[str]) -> 'Directory':
+ """
+ Descend one or more levels of directory hierarchy and return a new
+ Directory object for that directory.
+
+ Arguments:
+ subdirectory_spec (list of strings): A list of strings which are all directory
+ names.
+ create (boolean): If this is true, the directories will be created if
+ they don't already exist.
+ """
+ raise NotImplementedError()
+
+ # Import and export of files and links
+ def import_files(self, external_pathspec: any, files: List[str] = None,
+ report_written: bool = True, update_utimes: bool = False,
+ can_link: bool = False) -> FileListResult:
+ """Imports some or all files from external_path into this directory.
+
+ Keyword arguments: external_pathspec: Either a string
+ containing a pathname, or a Directory object, to use as the
+ source.
+
+ files (list of strings): A list of all the files relative to
+ the external_pathspec to copy. If 'None' is supplied, all
+ files are copied.
+
+ report_written (bool): Return the full list of files
+ written. Defaults to true. If false, only a list of
+ overwritten files is returned.
+
+ update_utimes (bool): Update the access and modification time
+ of each file copied to the current time.
+
+ can_link (bool): Whether it's OK to create a hard link to the
+ original content, meaning the stored copy will change when the
+ original files change. Setting this doesn't guarantee hard
+ links will be made. can_link will never be used if
+ update_utimes is set.
+ """
+
+ raise NotImplementedError()
+
+ def export_files(self, to_directory: str, can_link: bool = False, can_destroy: bool = False) -> None:
+ """Copies everything from this into to_directory.
+
+ Arguments:
+
+ to_directory (string): a path outside this directory object
+ where the contents will be copied to.
+
+ can_link (bool): Whether we can create hard links in to_directory
+ instead of copying. Setting this does not guarantee hard links will be used.
+
+ can_destroy (bool): Can we destroy the data already in this
+ directory when exporting? If set, this may allow data to be
+ moved rather than copied which will be quicker.
+ """
+
+ raise NotImplementedError()
+
+ # Convenience functions
+ def is_empty(self) -> bool:
+ raise NotImplementedError()
+
+ def set_deterministic_mtime(self) -> None:
+ """ Sets a static modification time for all regular files in this directory.
+ The magic number for timestamps: 2011-11-11 11:11:11
+ """
+ raise NotImplementedError()
+
+ def set_deterministic_user(self) -> None:
+ """ Sets all files in this directory to the current user's euid/egid.
+ """
+ raise NotImplementedError()
+
+ def mark_unmodified(self) -> None:
+ """ Marks all files in this directory (recursively) as unmodified.
+ """
+ raise NotImplementedError()
+
+ def list_modified_paths(self) -> List[str]:
+ """Provide a list of relative paths which have been modified since the
+ last call to mark_unmodified.
+
+ Return value: List(str) - dictionary with all paths
+ """
+ raise NotImplementedError()
+
+ def list_relative_paths(self) -> List[str]:
+ """Provide a list of all relative paths in this directory.
+
+ Return value: List(str) - dictionary with all paths
+ """
+ raise NotImplementedError()
diff --git a/buildstream/utils.py b/buildstream/utils.py
index 8e7219631..b81a6c852 100644
--- a/buildstream/utils.py
+++ b/buildstream/utils.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016-2018 Codethink Limited
#
@@ -307,7 +306,7 @@ def safe_remove(path):
"""Removes a file or directory
This will remove a file if it exists, and will
- remove a directory if the directory is not empty.
+ remove a directory if the directory is empty.
Args:
path (str): The path to remove
@@ -472,6 +471,10 @@ def get_bst_version():
from . import __version__
versions = __version__.split('.')[:2]
+ if versions[0] == '0+untagged':
+ raise UtilError("Your git repository has no tags - BuildStream can't "
+ "determine its version. Please run `git fetch --tags`.")
+
return (int(versions[0]), int(versions[1]))
diff --git a/contrib/bst-here b/contrib/bst-here
index 8816147bd..037788e3a 100755
--- a/contrib/bst-here
+++ b/contrib/bst-here
@@ -25,7 +25,7 @@
usage() {
cat <<EOF
-USAGE: $(basename "$0") [-i BST_HERE_IMAGE] [-p] [-t] [-T] [-v VOLUME ...] [-h] [COMMAND] [ARG..]
+USAGE: $(basename "$0") [-i BST_HERE_IMAGE] [-p] [-t] [-T] [-v VOLUME ...] [-h] [COMMAND [ARG..]]
Run a bst command in a new BuildStream container.
@@ -86,16 +86,9 @@ done
test "$OPTIND" -gt 1 &&
shift $(( OPTIND - 1 ))
-create_volume_if_not_exists () {
- if ! docker volume inspect "$1" >/dev/null 2>&1
- then
- docker volume create --name "$1"
- fi
-}
-
for vol in buildstream-cache buildstream-config
do
- create_volume_if_not_exists "$vol"
+ docker volume create "$vol" >/dev/null
done
BST_HERE_PS1="\[\033[01;34m\]\w\[\033[00m\]> "
diff --git a/doc/Makefile b/doc/Makefile
index 557dc5543..eaef15a61 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -24,7 +24,15 @@ ALLSPHINXOPTS = -W -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS)
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
-.PHONY: all templates html devhelp
+# Set BST_FORCE_SESSION_REBUILD to force rebuild the docs
+BST2HTML = $(CURDIR)/bst2html.py
+BST2HTMLOPTS =
+ifneq ($(strip $(BST_FORCE_SESSION_REBUILD)),)
+BST2HTMLOPTS = --force
+endif
+
+
+.PHONY: all clean templates templates-clean sessions sessions-prep sessions-clean html devhelp
# Canned recipe for generating plugin api skeletons
# $1 = the plugin directory
@@ -43,13 +51,12 @@ I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
# from plugin documentation.
#
define plugin-doc-skeleton
- @for file in $$(find ${1} -name "*.py" ! -name "__init__.py"); do \
+ @for file in $$(find ${1} -name "*.py" ! -name "_*.py"); do \
base=$$(basename $$file); \
module=${2}.$${base%.py}; \
modname=$${base%.py}; \
echo -n "Generating source/${2}/$${modname}.rst... "; \
- sed -e "s|@@MODULENAME@@|$${modname}|g" \
- -e "s|@@MODULE@@|$${module}|g" \
+ sed -e "s|@@MODULE@@|$${module}|g" \
source/plugin.rsttemplate > \
source/${2}/$${modname}.rst.tmp && \
mv source/${2}/$${modname}.rst.tmp source/${2}/$${modname}.rst || exit 1; \
@@ -57,31 +64,62 @@ define plugin-doc-skeleton
done
endef
+
# We set PYTHONPATH here because source/conf.py sys.modules hacks dont seem to help sphinx-build import the plugins
all: html devhelp
+clean: templates-clean sessions-clean
+ rm -rf build
+
# Generate rst templates for the docs using a mix of sphinx-apidoc and
# our 'plugin-doc-skeleton' routine for plugin pages.
templates:
mkdir -p source/elements
mkdir -p source/sources
- $(SPHINXAPIDOC) --force --separate --module-first --no-headings -o source $(CURDIR)/../buildstream $(CURDIR)/../buildstream/*_pb2*.py
+ $(SPHINXAPIDOC) --force --separate --module-first --no-headings --no-toc -o source $(CURDIR)/../buildstream
$(call plugin-doc-skeleton,$(CURDIR)/../buildstream/plugins/elements,elements)
$(call plugin-doc-skeleton,$(CURDIR)/../buildstream/plugins/sources,sources)
+templates-clean:
+ rm -rf source/elements
+ rm -rf source/sources
+
+# Stage the stored sessions into the place where they will
+# be used in the build.
+#
+# This is separated so that the git tree does not become
+# dirty as a result of a documentation build process - which
+# messes up the docs version number and the version number
+# printed in some command line output.
+#
+sessions-prep:
+ mkdir -p source/sessions
+ cp source/sessions-stored/*.html source/sessions
+
+# By default, this will generate the html fragments of colorized BuildStream terminal
+# output only if they don't yet exist.
+#
+# Specify BST_FORCE_SESSION_REBUILD=1 to force rebuild all session html files.
+#
+sessions: sessions-prep
+ for file in $(wildcard sessions/*.run); do \
+ $(BST2HTML) $(BST2HTMLOPTS) --description $$file; \
+ done
+
+sessions-clean:
+ rm -rf source/sessions
+
# Targets which generate docs with sphinx build
#
#
-html devhelp: templates
+html devhelp: templates sessions
@echo "Building $@..."
PYTHONPATH=$(CURDIR)/../buildstream/plugins \
$(SPHINXBUILD) -b $@ $(ALLSPHINXOPTS) "$(BUILDDIR)/$@" \
$(wildcard source/*.rst) \
+ $(wildcard source/tutorial/*.rst) \
+ $(wildcard source/examples/*.rst) \
$(wildcard source/elements/*.rst) \
$(wildcard source/sources/*.rst)
@echo
@echo "Build of $@ finished, output: $(CURDIR)/$(BUILDDIR)/$@"
-
-testy:
- @echo "Using $(SPHINXBUILD)"
- @echo "Py is $(PYV)"
diff --git a/doc/bst2html.py b/doc/bst2html.py
new file mode 100755
index 000000000..c9e98bb36
--- /dev/null
+++ b/doc/bst2html.py
@@ -0,0 +1,480 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2013 German M. Bravo (Kronuz)
+# Copyright (c) 2018 Codethink Limited
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+# This file is substantially based on German's work, obtained at:
+# https://github.com/Kronuz/ansi2html.git
+#
+import os
+import sys
+import re
+import shlex
+import subprocess
+from collections import Mapping
+from contextlib import contextmanager
+from tempfile import TemporaryDirectory
+
+import click
+
+from buildstream import _yaml
+from buildstream import utils
+from buildstream._exceptions import BstError
+
+
+_ANSI2HTML_STYLES = {}
+ANSI2HTML_CODES_RE = re.compile('(?:\033\\[(\d+(?:;\d+)*)?([cnRhlABCDfsurgKJipm]))')
+ANSI2HTML_PALETTE = {
+ # See http://ethanschoonover.com/solarized
+ 'solarized': ['#073642', '#D30102', '#859900', '#B58900', '#268BD2', '#D33682', '#2AA198', '#EEE8D5',
+ '#002B36', '#CB4B16', '#586E75', '#657B83', '#839496', '#6C71C4', '#93A1A1', '#FDF6E3'],
+ # Above mapped onto the xterm 256 color palette
+ 'solarized-xterm': ['#262626', '#AF0000', '#5F8700', '#AF8700', '#0087FF', '#AF005F', '#00AFAF', '#E4E4E4',
+ '#1C1C1C', '#D75F00', '#585858', '#626262', '#808080', '#5F5FAF', '#8A8A8A', '#FFFFD7'],
+ # Gnome default:
+ 'tango': ['#000000', '#CC0000', '#4E9A06', '#C4A000', '#3465A4', '#75507B', '#06989A', '#D3D7CF',
+ '#555753', '#EF2929', '#8AE234', '#FCE94F', '#729FCF', '#AD7FA8', '#34E2E2', '#EEEEEC'],
+ # xterm:
+ 'xterm': ['#000000', '#CD0000', '#00CD00', '#CDCD00', '#0000EE', '#CD00CD', '#00CDCD', '#E5E5E5',
+ '#7F7F7F', '#FF0000', '#00FF00', '#FFFF00', '#5C5CFF', '#FF00FF', '#00FFFF', '#FFFFFF'],
+ 'console': ['#000000', '#AA0000', '#00AA00', '#AA5500', '#0000AA', '#AA00AA', '#00AAAA', '#AAAAAA',
+ '#555555', '#FF5555', '#55FF55', '#FFFF55', '#5555FF', '#FF55FF', '#55FFFF', '#FFFFFF'],
+}
+
+
+def _ansi2html_get_styles(palette):
+ if palette not in _ANSI2HTML_STYLES:
+ p = ANSI2HTML_PALETTE.get(palette, ANSI2HTML_PALETTE['console'])
+
+ regular_style = {
+ '1': '', # bold
+ '2': 'opacity:0.5',
+ '4': 'text-decoration:underline',
+ '5': 'font-weight:bold',
+ '7': '',
+ '8': 'display:none',
+ }
+ bold_style = regular_style.copy()
+ for i in range(8):
+ regular_style['3%s' % i] = 'color:%s' % p[i]
+ regular_style['4%s' % i] = 'background-color:%s' % p[i]
+
+ bold_style['3%s' % i] = 'color:%s' % p[i + 8]
+ bold_style['4%s' % i] = 'background-color:%s' % p[i + 8]
+
+ # The default xterm 256 colour p:
+ indexed_style = {}
+ for i in range(16):
+ indexed_style['%s' % i] = p[i]
+
+ for rr in range(6):
+ for gg in range(6):
+ for bb in range(6):
+ i = 16 + rr * 36 + gg * 6 + bb
+ r = (rr * 40 + 55) if rr else 0
+ g = (gg * 40 + 55) if gg else 0
+ b = (bb * 40 + 55) if bb else 0
+ indexed_style['%s' % i] = ''.join('%02X' % c if 0 <= c <= 255 else None for c in (r, g, b))
+
+ for g in range(24):
+ i = g + 232
+ l = g * 10 + 8
+ indexed_style['%s' % i] = ''.join('%02X' % c if 0 <= c <= 255 else None for c in (l, l, l))
+
+ _ANSI2HTML_STYLES[palette] = (regular_style, bold_style, indexed_style)
+ return _ANSI2HTML_STYLES[palette]
+
+
+def ansi2html(text, palette='solarized'):
+ def _ansi2html(m):
+ if m.group(2) != 'm':
+ return ''
+ import sys
+ state = None
+ sub = ''
+ cs = m.group(1)
+ cs = cs.strip() if cs else ''
+ for c in cs.split(';'):
+ c = c.strip().lstrip('0') or '0'
+ if c == '0':
+ while stack:
+ sub += '</span>'
+ stack.pop()
+ elif c in ('38', '48'):
+ extra = [c]
+ state = 'extra'
+ elif state == 'extra':
+ if c == '5':
+ state = 'idx'
+ elif c == '2':
+ state = 'r'
+ elif state:
+ if state == 'idx':
+ extra.append(c)
+ state = None
+ # 256 colors
+ color = indexed_style.get(c) # TODO: convert index to RGB!
+ if color is not None:
+ sub += '<span style="%s:%s">' % ('color' if extra[0] == '38' else 'background-color', color)
+ stack.append(extra)
+ elif state in ('r', 'g', 'b'):
+ extra.append(c)
+ if state == 'r':
+ state = 'g'
+ elif state == 'g':
+ state = 'b'
+ else:
+ state = None
+ try:
+ color = '#' + ''.join(
+ '%02X' % c if 0 <= c <= 255 else None
+ for x in extra for c in [int(x)]
+ )
+ except (ValueError, TypeError):
+ pass
+ else:
+ sub += '<span style="{}:{}">'.format(
+ 'color' if extra[0] == '38' else 'background-color',
+ color)
+ stack.append(extra)
+ else:
+ if '1' in stack:
+ style = bold_style.get(c)
+ else:
+ style = regular_style.get(c)
+ if style is not None:
+ sub += '<span style="%s">' % style
+ # Still needs to be added to the stack even if style is empty
+ # (so it can check '1' in stack above, for example)
+ stack.append(c)
+ return sub
+ stack = []
+ regular_style, bold_style, indexed_style = _ansi2html_get_styles(palette)
+ sub = ANSI2HTML_CODES_RE.sub(_ansi2html, text)
+ while stack:
+ sub += '</span>'
+ stack.pop()
+ return sub
+
+
+# workdir()
+#
+# Sets up a new temp directory with a config file
+#
+# Args:
+# work_directory (str): The directory where to create a tempdir first
+# source_cache (str): The directory of a source cache to share with, or None
+#
+# Yields:
+# The buildstream.conf full path
+#
+@contextmanager
+def workdir(source_cache=None):
+ with TemporaryDirectory(prefix='run-bst-', dir=os.getcwd()) as tempdir:
+ if not source_cache:
+ source_cache = os.path.join(tempdir, 'sources')
+
+ bst_config_file = os.path.join(tempdir, 'buildstream.conf')
+ config = {
+ 'sourcedir': source_cache,
+ 'artifactdir': os.path.join(tempdir, 'artifacts'),
+ 'logdir': os.path.join(tempdir, 'logs'),
+ 'builddir': os.path.join(tempdir, 'build'),
+ }
+ _yaml.dump(config, bst_config_file)
+
+ yield (tempdir, bst_config_file, source_cache)
+
+
+# run_command()
+#
+# Runs a command
+#
+# Args:
+# config_file (str): The path to the config file to use
+# directory (str): The project directory
+# command (str): A command string
+#
+# Returns:
+# (str): The colorized combined stdout/stderr of BuildStream
+#
+def run_command(config_file, directory, command):
+ click.echo("Running command in directory '{}': bst {}".format(directory, command), err=True)
+
+ argv = ['bst', '--colors', '--config', config_file] + shlex.split(command)
+ p = subprocess.Popen(argv, cwd=directory, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ out, _ = p.communicate()
+ return out.decode('utf-8').strip()
+
+
+# generate_html
+#
+# Generate html based on the output
+#
+# Args:
+# output (str): The output of the BuildStream command
+# directory (str): The project directory
+# config_file (str): The config file
+# source_cache (str): The source cache
+# tempdir (str): The base work directory
+# palette (str): The rendering color style
+# command (str): The command
+# fake_output (bool): Whether the provided output is faked or not
+#
+# Returns:
+# (str): The html formatted output
+#
+def generate_html(output, directory, config_file, source_cache, tempdir, palette, command, fake_output):
+
+ test_base_name = os.path.basename(directory)
+ if fake_output:
+ show_command = command
+ else:
+ show_command = 'bst ' + command
+
+ # Substitute some things we want normalized for the docs
+ output = re.sub(os.environ.get('HOME'), '/home/user', output)
+ output = re.sub(config_file, '/home/user/.config/buildstream.conf', output)
+ output = re.sub(source_cache, '/home/user/.cache/buildstream/sources', output)
+ output = re.sub(tempdir, '/home/user/.cache/buildstream', output)
+ output = re.sub(directory, '/home/user/{}'.format(test_base_name), output)
+
+ # Now convert to HTML and add some surrounding sugar
+ output = ansi2html(output, palette=palette)
+
+ # Finally format it nicely into a <div>
+ final_output = '<!--\n' + \
+ ' WARNING: This file was generated with bst2html.py\n' + \
+ '-->\n' + \
+ '<div class="highlight" style="font-size:x-small">' + \
+ '<pre>\n' + \
+ '<span style="color:#C4A000;font-weight:bold">user@host</span>:' + \
+ '<span style="color:#3456A4;font-weight:bold">~/{}</span>$ '.format(test_base_name) + \
+ show_command + '\n'
+
+ if output:
+ final_output += '\n' + output + '\n'
+
+ final_output += '</pre></div>\n'
+
+ return final_output
+
+
+# check_needs_build()
+#
+# Checks whether filename, specified relative to basedir,
+# needs to be built (based on whether it exists).
+#
+# Args:
+# basedir (str): The base directory to check relative of, or None for CWD
+# filename (str): The basedir relative path to the file
+# force (bool): Whether force rebuilding of existing things is enabled
+#
+# Returns:
+# (bool): Whether the file needs to be built
+#
+def check_needs_build(basedir, filename, force=False):
+ if force:
+ return True
+
+ if basedir is None:
+ basedir = os.getcwd()
+
+ filename = os.path.join(basedir, filename)
+ filename = os.path.realpath(filename)
+ if not os.path.exists(filename):
+ return True
+
+ return False
+
+
+def run_session(description, tempdir, source_cache, palette, config_file, force):
+ desc = _yaml.load(description, shortname=os.path.basename(description))
+ desc_dir = os.path.dirname(description)
+
+ # Preflight commands and check if we can skip this session
+ #
+ if not force:
+ needs_build = False
+ commands = _yaml.node_get(desc, list, 'commands')
+ for command in commands:
+ output = _yaml.node_get(command, str, 'output', default_value=None)
+ if output is not None and check_needs_build(desc_dir, output, force=False):
+ needs_build = True
+ break
+ if not needs_build:
+ click.echo("Skipping '{}' as no files need to be built".format(description), err=True)
+ return
+
+ # FIXME: Workaround a setuptools bug where the symlinks
+ # we store in git dont get carried into a release
+ # tarball. This workaround lets us build docs from
+ # a source distribution tarball.
+ #
+ symlinks = _yaml.node_get(desc, Mapping, 'workaround-symlinks', default_value={})
+ for symlink, target in _yaml.node_items(symlinks):
+
+ # Resolve real path to where symlink should be
+ symlink = os.path.join(desc_dir, symlink)
+
+ # Ensure dir exists
+ symlink_dir = os.path.dirname(symlink)
+ os.makedirs(symlink_dir, exist_ok=True)
+
+ click.echo("Generating symlink at: {} (target: {})".format(symlink, target), err=True)
+
+ # Generate a symlink
+ try:
+ os.symlink(target, symlink)
+ except FileExistsError:
+ # If the files exist, we're running from a git checkout and
+ # not a source distribution, no need to complain
+ pass
+
+ remove_files = _yaml.node_get(desc, list, 'remove-files', default_value=[])
+ for remove_file in remove_files:
+ remove_file = os.path.join(desc_dir, remove_file)
+ remove_file = os.path.realpath(remove_file)
+
+ if os.path.isdir(remove_file):
+ utils._force_rmtree(remove_file)
+ else:
+ utils.safe_remove(remove_file)
+
+ # Run commands
+ #
+ commands = _yaml.node_get(desc, list, 'commands')
+ for c in commands:
+ command = _yaml.node_get(desc, Mapping, 'commands', indices=[commands.index(c)])
+
+ # Get the directory where this command should be run
+ directory = _yaml.node_get(command, str, 'directory')
+ directory = os.path.join(desc_dir, directory)
+ directory = os.path.realpath(directory)
+
+ # Get the command string
+ command_str = _yaml.node_get(command, str, 'command')
+
+ # Check if there is fake output
+ command_fake_output = _yaml.node_get(command, str, 'fake-output', default_value=None)
+
+ # Run the command, or just use the fake output
+ if command_fake_output is None:
+ command_out = run_command(config_file, directory, command_str)
+ else:
+ command_out = command_fake_output
+
+ # Encode and save the output if that was asked for
+ output = _yaml.node_get(command, str, 'output', default_value=None)
+ if output is not None:
+
+ # Convert / Generate a nice <div>
+ converted = generate_html(command_out, directory, config_file,
+ source_cache, tempdir, palette,
+ command_str, command_fake_output is not None)
+
+ # Save it
+ filename = os.path.join(desc_dir, output)
+ filename = os.path.realpath(filename)
+ output_dir = os.path.dirname(filename)
+ os.makedirs(output_dir, exist_ok=True)
+ with open(filename, 'wb') as f:
+ f.write(converted.encode('utf-8'))
+
+ click.echo("Saved session at '{}'".format(filename), err=True)
+
+
+@click.command(short_help="Run a bst command and capture stdout/stderr in html")
+@click.option('--directory', '-C',
+ type=click.Path(file_okay=False, dir_okay=True),
+ help="The project directory where to run the command")
+@click.option('--force', is_flag=True, default=False,
+ help="Force rebuild, even if the file exists")
+@click.option('--source-cache',
+ type=click.Path(file_okay=False, dir_okay=True),
+ help="A shared source cache")
+@click.option('--palette', '-p', default='tango',
+ type=click.Choice(['solarized', 'solarized-xterm', 'tango', 'xterm', 'console']),
+ help="Selects a palette for the output style")
+@click.option('--output', '-o',
+ type=click.Path(file_okay=True, dir_okay=False, writable=True),
+ help="A file to store the output")
+@click.option('--description', '-d',
+ type=click.Path(file_okay=True, dir_okay=False, readable=True),
+ help="A file describing what to do")
+@click.argument('command', type=click.STRING, nargs=-1)
+def run_bst(directory, force, source_cache, description, palette, output, command):
+ """Run a bst command and capture stdout/stderr in html
+
+ This command normally takes a description yaml file, see the HACKING
+ file for information on it's format.
+ """
+ if not source_cache and os.environ.get('BST_SOURCE_CACHE'):
+ source_cache = os.environ['BST_SOURCE_CACHE']
+
+ if output is not None and not check_needs_build(None, output, force=force):
+ click.echo("No need to rebuild {}".format(output))
+ return 0
+
+ with workdir(source_cache=source_cache) as (tempdir, config_file, source_cache):
+
+ if description:
+ run_session(description, tempdir, source_cache, palette, config_file, force)
+ return 0
+
+ # Run a command specified on the CLI
+ #
+ if not directory:
+ directory = os.getcwd()
+ else:
+ directory = os.path.abspath(directory)
+ directory = os.path.realpath(directory)
+
+ if not command:
+ command = []
+ command_str = " ".join(command)
+
+ # Run the command
+ #
+ command_out = run_command(config_file, directory, command_str)
+
+ # Generate a nice html div for this output
+ #
+ converted = generate_html(command_out, directory, config_file,
+ source_cache, tempdir, palette,
+ command_str)
+
+ if output is None:
+ click.echo(converted)
+ else:
+ outdir = os.path.dirname(output)
+ os.makedirs(outdir, exist_ok=True)
+ with open(output, 'wb') as f:
+ f.write(converted.encode('utf-8'))
+
+ return 0
+
+if __name__ == '__main__':
+ try:
+ run_bst()
+ except BstError as e:
+ click.echo("Error: {}".format(e), err=True)
+ sys.exit(-1)
diff --git a/doc/examples/autotools/elements/base.bst b/doc/examples/autotools/elements/base.bst
new file mode 100644
index 000000000..1b85a9e8c
--- /dev/null
+++ b/doc/examples/autotools/elements/base.bst
@@ -0,0 +1,5 @@
+kind: stack
+description: Base stack
+
+depends:
+- base/alpine.bst
diff --git a/doc/examples/autotools/elements/base/alpine.bst b/doc/examples/autotools/elements/base/alpine.bst
new file mode 100644
index 000000000..cf85df5bf
--- /dev/null
+++ b/doc/examples/autotools/elements/base/alpine.bst
@@ -0,0 +1,13 @@
+kind: import
+description: |
+
+ Alpine Linux base runtime
+
+sources:
+- kind: tar
+
+ # This is a post doctored, trimmed down system image
+ # of the Alpine linux distribution.
+ #
+ url: alpine:integration-tests-base.v1.x86_64.tar.xz
+ ref: 3eb559250ba82b64a68d86d0636a6b127aa5f6d25d3601a79f79214dc9703639
diff --git a/doc/examples/autotools/elements/hello.bst b/doc/examples/autotools/elements/hello.bst
new file mode 100644
index 000000000..510f5b975
--- /dev/null
+++ b/doc/examples/autotools/elements/hello.bst
@@ -0,0 +1,21 @@
+kind: autotools
+description: |
+
+ Hello world example from automake
+
+variables:
+
+ # The hello world example lives in the doc/amhello folder.
+ #
+ # Set the %{command-subdir} variable to that location
+ # and just have the autotools element run it's commands there.
+ #
+ command-subdir: doc/amhello
+
+sources:
+- kind: tar
+ url: gnu:automake-1.16.tar.gz
+ ref: 80da43bb5665596ee389e6d8b64b4f122ea4b92a685b1dbd813cd1f0e0c2d83f
+
+depends:
+- base.bst
diff --git a/doc/examples/autotools/project.conf b/doc/examples/autotools/project.conf
new file mode 100644
index 000000000..7ee58b589
--- /dev/null
+++ b/doc/examples/autotools/project.conf
@@ -0,0 +1,13 @@
+# Unique project name
+name: autotools
+
+# Required BuildStream format version
+format-version: 9
+
+# Subdirectory where elements are stored
+element-path: elements
+
+# Define some aliases for the tarballs we download
+aliases:
+ alpine: https://gnome7.codethink.co.uk/tarballs/
+ gnu: https://ftp.gnu.org/gnu/automake/
diff --git a/doc/examples/first-project/elements/hello.bst b/doc/examples/first-project/elements/hello.bst
new file mode 100644
index 000000000..d23ebc7b6
--- /dev/null
+++ b/doc/examples/first-project/elements/hello.bst
@@ -0,0 +1,13 @@
+kind: import
+
+# Use a local source to stage our file
+sources:
+- kind: local
+ path: hello.world
+
+# Configure the import element
+config:
+
+ # Place the content staged by sources at the
+ # root of the output artifact
+ target: /
diff --git a/doc/examples/first-project/hello.world b/doc/examples/first-project/hello.world
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/doc/examples/first-project/hello.world
diff --git a/doc/examples/first-project/project.conf b/doc/examples/first-project/project.conf
new file mode 100644
index 000000000..2182d35a1
--- /dev/null
+++ b/doc/examples/first-project/project.conf
@@ -0,0 +1,8 @@
+# Unique project name
+name: first-project
+
+# Required BuildStream format version
+format-version: 9
+
+# Subdirectory where elements are stored
+element-path: elements
diff --git a/doc/examples/flatpak-autotools/project.conf b/doc/examples/flatpak-autotools/project.conf
index 4cdc55171..0296b22f6 100644
--- a/doc/examples/flatpak-autotools/project.conf
+++ b/doc/examples/flatpak-autotools/project.conf
@@ -1,4 +1,4 @@
-name: autotools-flatpak
+name: flatpak-autotools
aliases:
gnomesdk: https://sdk.gnome.org/
diff --git a/doc/examples/integration-commands/elements/base.bst b/doc/examples/integration-commands/elements/base.bst
new file mode 100644
index 000000000..1b85a9e8c
--- /dev/null
+++ b/doc/examples/integration-commands/elements/base.bst
@@ -0,0 +1,5 @@
+kind: stack
+description: Base stack
+
+depends:
+- base/alpine.bst
diff --git a/doc/examples/integration-commands/elements/base/alpine.bst b/doc/examples/integration-commands/elements/base/alpine.bst
new file mode 100644
index 000000000..433f4773a
--- /dev/null
+++ b/doc/examples/integration-commands/elements/base/alpine.bst
@@ -0,0 +1,17 @@
+kind: import
+description: |
+
+ Alpine Linux base runtime
+
+sources:
+- kind: tar
+ url: alpine:integration-tests-base.v1.x86_64.tar.xz
+ ref: 3eb559250ba82b64a68d86d0636a6b127aa5f6d25d3601a79f79214dc9703639
+
+#
+# Run ldconfig in the libdir before running anything
+#
+public:
+ bst:
+ integration-commands:
+ - ldconfig "%{libdir}"
diff --git a/doc/examples/integration-commands/elements/hello.bst b/doc/examples/integration-commands/elements/hello.bst
new file mode 100644
index 000000000..c90254f10
--- /dev/null
+++ b/doc/examples/integration-commands/elements/hello.bst
@@ -0,0 +1,22 @@
+kind: manual
+description: |
+
+ The hello application
+
+# Depend on the hello library
+depends:
+- libhello.bst
+
+# Stage the files/hello directory for building
+sources:
+ - kind: local
+ path: files/hello
+
+# Now configure the commands to run
+config:
+
+ build-commands:
+ - make PREFIX="%{prefix}"
+
+ install-commands:
+ - make -j1 PREFIX="%{prefix}" DESTDIR="%{install-root}" install
diff --git a/doc/examples/integration-commands/elements/libhello.bst b/doc/examples/integration-commands/elements/libhello.bst
new file mode 100644
index 000000000..53496c84c
--- /dev/null
+++ b/doc/examples/integration-commands/elements/libhello.bst
@@ -0,0 +1,22 @@
+kind: manual
+description: |
+
+ The libhello library
+
+# Depend on the base system
+depends:
+- base.bst
+
+# Stage the files/libhello directory for building
+sources:
+ - kind: local
+ path: files/libhello
+
+# Now configure the commands to run
+config:
+
+ build-commands:
+ - make PREFIX="%{prefix}"
+
+ install-commands:
+ - make -j1 PREFIX="%{prefix}" DESTDIR="%{install-root}" install
diff --git a/doc/examples/integration-commands/files/hello/Makefile b/doc/examples/integration-commands/files/hello/Makefile
new file mode 100644
index 000000000..21471d40f
--- /dev/null
+++ b/doc/examples/integration-commands/files/hello/Makefile
@@ -0,0 +1,12 @@
+# Sample makefile for hello.c
+#
+.PHONY: all install
+
+all: hello
+
+install:
+ install -d ${DESTDIR}${PREFIX}/bin
+ install -m 755 hello ${DESTDIR}${PREFIX}/bin
+
+hello: hello.c
+ $(CC) $< -o $@ -Wall -lhello
diff --git a/doc/examples/integration-commands/files/hello/hello.c b/doc/examples/integration-commands/files/hello/hello.c
new file mode 100644
index 000000000..83e762c29
--- /dev/null
+++ b/doc/examples/integration-commands/files/hello/hello.c
@@ -0,0 +1,20 @@
+/*
+ * hello.c - Simple hello program
+ */
+#include <stdio.h>
+#include <libhello.h>
+
+int main(int argc, char *argv[])
+{
+ const char *person = NULL;
+
+ if (argc > 1)
+ person = argv[1];
+
+ if (person)
+ hello(person);
+ else
+ hello("stranger");
+
+ return 0;
+}
diff --git a/doc/examples/integration-commands/files/libhello/Makefile b/doc/examples/integration-commands/files/libhello/Makefile
new file mode 100644
index 000000000..63ee11069
--- /dev/null
+++ b/doc/examples/integration-commands/files/libhello/Makefile
@@ -0,0 +1,17 @@
+# Sample makefile for hello library
+#
+.PHONY: all install
+
+all: libhello.so
+
+install:
+ install -d ${DESTDIR}${PREFIX}/lib
+ install -d ${DESTDIR}${PREFIX}/include
+ install -m 644 libhello.so ${DESTDIR}${PREFIX}/lib
+ install -m 644 libhello.h ${DESTDIR}${PREFIX}/include
+
+%.o: %.c %.h
+ $(CC) -c $< -o $@ -Wall
+
+libhello.so: libhello.o
+ $(CC) -shared -o $@ $<
diff --git a/doc/examples/integration-commands/files/libhello/libhello.c b/doc/examples/integration-commands/files/libhello/libhello.c
new file mode 100644
index 000000000..759b33926
--- /dev/null
+++ b/doc/examples/integration-commands/files/libhello/libhello.c
@@ -0,0 +1,9 @@
+/*
+ * libhello.c - The hello library
+ */
+#include <stdio.h>
+
+void hello(const char *person)
+{
+ printf("Hello %s\n", person);
+}
diff --git a/doc/examples/integration-commands/files/libhello/libhello.h b/doc/examples/integration-commands/files/libhello/libhello.h
new file mode 100644
index 000000000..f714f3659
--- /dev/null
+++ b/doc/examples/integration-commands/files/libhello/libhello.h
@@ -0,0 +1,8 @@
+/*
+ * libhello.h - The hello library
+ */
+
+/*
+ * A function to say hello to @person
+ */
+void hello(const char *person);
diff --git a/doc/examples/integration-commands/project.conf b/doc/examples/integration-commands/project.conf
new file mode 100644
index 000000000..b33267005
--- /dev/null
+++ b/doc/examples/integration-commands/project.conf
@@ -0,0 +1,12 @@
+# Unique project name
+name: integration-commands
+
+# Required BuildStream format version
+format-version: 9
+
+# Subdirectory where elements are stored
+element-path: elements
+
+# Define an alias for our alpine tarball
+aliases:
+ alpine: https://gnome7.codethink.co.uk/tarballs/
diff --git a/doc/examples/running-commands/elements/base.bst b/doc/examples/running-commands/elements/base.bst
new file mode 100644
index 000000000..1b85a9e8c
--- /dev/null
+++ b/doc/examples/running-commands/elements/base.bst
@@ -0,0 +1,5 @@
+kind: stack
+description: Base stack
+
+depends:
+- base/alpine.bst
diff --git a/doc/examples/running-commands/elements/base/alpine.bst b/doc/examples/running-commands/elements/base/alpine.bst
new file mode 100644
index 000000000..cf85df5bf
--- /dev/null
+++ b/doc/examples/running-commands/elements/base/alpine.bst
@@ -0,0 +1,13 @@
+kind: import
+description: |
+
+ Alpine Linux base runtime
+
+sources:
+- kind: tar
+
+ # This is a post doctored, trimmed down system image
+ # of the Alpine linux distribution.
+ #
+ url: alpine:integration-tests-base.v1.x86_64.tar.xz
+ ref: 3eb559250ba82b64a68d86d0636a6b127aa5f6d25d3601a79f79214dc9703639
diff --git a/doc/examples/running-commands/elements/hello.bst b/doc/examples/running-commands/elements/hello.bst
new file mode 100644
index 000000000..f7f21e01e
--- /dev/null
+++ b/doc/examples/running-commands/elements/hello.bst
@@ -0,0 +1,22 @@
+kind: manual
+description: |
+
+ Building manually
+
+# Depend on the base system
+depends:
+- base.bst
+
+# Stage the files/src directory for building
+sources:
+ - kind: local
+ path: files/src
+
+# Now configure the commands to run
+config:
+
+ build-commands:
+ - make PREFIX="%{prefix}"
+
+ install-commands:
+ - make -j1 PREFIX="%{prefix}" DESTDIR="%{install-root}" install
diff --git a/doc/examples/running-commands/files/src/Makefile b/doc/examples/running-commands/files/src/Makefile
new file mode 100644
index 000000000..8c8425116
--- /dev/null
+++ b/doc/examples/running-commands/files/src/Makefile
@@ -0,0 +1,12 @@
+# Sample makefile for hello.c
+#
+.PHONY: all install
+
+all: hello
+
+install:
+ install -d ${DESTDIR}${PREFIX}/bin
+ install -m 755 hello ${DESTDIR}${PREFIX}/bin
+
+hello: hello.c
+ $(CC) -Wall -o $@ $<
diff --git a/doc/examples/running-commands/files/src/hello.c b/doc/examples/running-commands/files/src/hello.c
new file mode 100644
index 000000000..b53408209
--- /dev/null
+++ b/doc/examples/running-commands/files/src/hello.c
@@ -0,0 +1,10 @@
+/*
+ * hello.c - Simple hello world program
+ */
+#include <stdio.h>
+
+int main(int argc, char *argv[])
+{
+ printf("Hello World\n");
+ return 0;
+}
diff --git a/doc/examples/running-commands/project.conf b/doc/examples/running-commands/project.conf
new file mode 100644
index 000000000..de266178e
--- /dev/null
+++ b/doc/examples/running-commands/project.conf
@@ -0,0 +1,12 @@
+# Unique project name
+name: running-commands
+
+# Required BuildStream format version
+format-version: 9
+
+# Subdirectory where elements are stored
+element-path: elements
+
+# Define an alias for our alpine tarball
+aliases:
+ alpine: https://gnome7.codethink.co.uk/tarballs/
diff --git a/doc/sessions/autotools.run b/doc/sessions/autotools.run
new file mode 100644
index 000000000..d6263acb7
--- /dev/null
+++ b/doc/sessions/autotools.run
@@ -0,0 +1,20 @@
+
+commands:
+# Make it fetch first
+- directory: ../examples/autotools
+ command: fetch hello.bst
+
+# Capture a `bst show` of the variables
+- directory: ../examples/autotools
+ output: ../source/sessions/autotools-show-variables.html
+ command: show --deps none --format "%{vars}" hello.bst
+
+# Capture a `bst build`
+- directory: ../examples/autotools
+ output: ../source/sessions/autotools-build.html
+ command: build hello.bst
+
+# Capture a shell output
+- directory: ../examples/autotools
+ output: ../source/sessions/autotools-shell.html
+ command: shell hello.bst -- hello
diff --git a/doc/sessions/first-project.run b/doc/sessions/first-project.run
new file mode 100644
index 000000000..f2500a9d0
--- /dev/null
+++ b/doc/sessions/first-project.run
@@ -0,0 +1,37 @@
+# Re-create project.conf using `bst init`
+remove-files:
+ - ../examples/first-project/project.conf
+ - ../examples/first-project/here
+
+commands:
+# Use bst init to create the project.conf
+- directory: ../examples/first-project
+ output: ../source/sessions/first-project-init.html
+ command: init --project-name first-project
+
+# Use bst init to create the project.conf
+- directory: ../examples/first-project
+ output: ../source/sessions/first-project-touch.html
+ command: touch hello.world
+ fake-output: ''
+
+# Capture a build output
+- directory: ../examples/first-project
+ output: ../source/sessions/first-project-build.html
+ command: build hello.bst
+
+# Capture a show output
+- directory: ../examples/first-project
+ output: ../source/sessions/first-project-show.html
+ command: show hello.bst
+
+# Checkout the output
+- directory: ../examples/first-project
+ output: ../source/sessions/first-project-checkout.html
+ command: checkout hello.bst here
+
+# Checkout the output
+- directory: ../examples/first-project
+ output: ../source/sessions/first-project-ls.html
+ command: ls ./here
+ fake-output: hello.world
diff --git a/doc/sessions/flatpak-autotools.run b/doc/sessions/flatpak-autotools.run
new file mode 100644
index 000000000..be4451a9a
--- /dev/null
+++ b/doc/sessions/flatpak-autotools.run
@@ -0,0 +1,21 @@
+# Workaround setuptools bug for our symlinks here
+#
+workaround-symlinks:
+ ../examples/flatpak-autotools/files/links/bin: usr/bin
+ ../examples/flatpak-autotools/files/links/etc: usr/etc
+ ../examples/flatpak-autotools/files/links/lib: usr/lib
+
+commands:
+# Make it fetch first
+- directory: ../examples/flatpak-autotools
+ command: fetch hello.bst
+
+# Capture a build output
+- directory: ../examples/flatpak-autotools
+ output: ../source/sessions/flatpak-autotools-build.html
+ command: build hello.bst
+
+# Capture a shell output
+- directory: ../examples/flatpak-autotools
+ output: ../source/sessions/flatpak-autotools-shell.html
+ command: shell hello.bst -- hello
diff --git a/doc/sessions/integration-commands.run b/doc/sessions/integration-commands.run
new file mode 100644
index 000000000..35d2433e1
--- /dev/null
+++ b/doc/sessions/integration-commands.run
@@ -0,0 +1,15 @@
+
+commands:
+# Make it fetch first
+- directory: ../examples/integration-commands
+ command: fetch hello.bst
+
+# Capture a build output
+- directory: ../examples/integration-commands
+ output: ../source/sessions/integration-commands-build.html
+ command: build hello.bst
+
+# Capture a shell output
+- directory: ../examples/integration-commands
+ output: ../source/sessions/integration-commands-shell.html
+ command: shell hello.bst -- hello pony
diff --git a/doc/sessions/running-commands.run b/doc/sessions/running-commands.run
new file mode 100644
index 000000000..ce8eccd2f
--- /dev/null
+++ b/doc/sessions/running-commands.run
@@ -0,0 +1,25 @@
+
+commands:
+# Make it fetch first
+- directory: ../examples/running-commands
+ command: fetch hello.bst
+
+# Capture a show output
+- directory: ../examples/running-commands
+ output: ../source/sessions/running-commands-show-before.html
+ command: show hello.bst
+
+# Capture a build output
+- directory: ../examples/running-commands
+ output: ../source/sessions/running-commands-build.html
+ command: build hello.bst
+
+# Capture another show output
+- directory: ../examples/running-commands
+ output: ../source/sessions/running-commands-show-after.html
+ command: show hello.bst
+
+# Capture a shell output
+- directory: ../examples/running-commands
+ output: ../source/sessions/running-commands-shell.html
+ command: shell hello.bst -- hello
diff --git a/doc/source/cachekeys.rst b/doc/source/additional_cachekeys.rst
index f0df796c5..f0df796c5 100644
--- a/doc/source/cachekeys.rst
+++ b/doc/source/additional_cachekeys.rst
diff --git a/doc/source/sandboxing.rst b/doc/source/additional_sandboxing.rst
index 531a3e5d5..531a3e5d5 100644
--- a/doc/source/sandboxing.rst
+++ b/doc/source/additional_sandboxing.rst
diff --git a/doc/source/authoring.rst b/doc/source/authoring.rst
deleted file mode 100644
index 0ce1d9930..000000000
--- a/doc/source/authoring.rst
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
-.. _authoring:
-
-Authoring projects
-==================
-This section details how to use the BuildStream YAML format to
-create your own project or modify existing projects.
-
-
-.. toctree::
- :maxdepth: 2
- :caption: Project format
-
- formatintro
- projectconf
- format
- public
- projectrefs
-
-
-Plugins
--------
-Plugins provide their own individual plugin specific YAML configurations,
-The element ``.bst`` files can specify plugin specific configuration in
-the :ref:`config section <format_config>`, while sources declared on a
-given element specify their plugin specific configuration directly
-:ref:`in their source declarations <format_sources>`.
-
-
-Elements
-~~~~~~~~
-The following element types are provided with BuildStream:
-
-
-General elements
-''''''''''''''''
-
-* :mod:`stack <elements.stack>` - Symbolic Element for dependency grouping
-* :mod:`import <elements.import>` - Import sources directly
-* :mod:`compose <elements.compose>` - Compose the output of multiple elements
-* :mod:`script <elements.script>` - Run scripts to create output
-* :mod:`junction <elements.junction>` - Integrate subprojects
-* :mod:`filter <elements.filter>` - Extract a subset of files from another element
-
-
-Build elements
-''''''''''''''
-
-* :mod:`manual <elements.manual>` - Manual Build Element
-* :mod:`autotools <elements.autotools>` - Autotools Build Element
-* :mod:`cmake <elements.cmake>` - CMake Build Element
-* :mod:`qmake <elements.qmake>` - QMake Build Element
-* :mod:`distutils <elements.distutils>` - Python Distutils Build Element
-* :mod:`makemaker <elements.makemaker>` - Perl MakeMaker Build Element
-* :mod:`modulebuild <elements.modulebuild>` - Perl Module::Build Build Element
-* :mod:`meson <elements.meson>` - Meson Build Element
-* :mod:`pip <elements.pip>` - Pip build element
-
-
-Sources
-~~~~~~~
-The following source types are provided with BuildStream:
-
-* :mod:`local <sources.local>` - A Source implementation for local files and directories
-* :mod:`tar <sources.tar>` - A Source implementation for tarballs
-* :mod:`zip <sources.zip>` - A Source implementation for zip archives
-* :mod:`git <sources.git>` - A Source implementation for git
-* :mod:`bzr <sources.bzr>` - A Source implementation for bazaar
-* :mod:`ostree <sources.ostree>` - A Source implementation for ostree
-* :mod:`patch <sources.patch>` - A Source implementation for applying local patches
-* :mod:`deb <sources.deb>` - A Source implementation for deb packages
-
-
-External plugins
-----------------
-External plugins need to be installed separately, here is
-a list of BuildStream plugin projects known to us at this time:
-
-* `bst-external <http://buildstream.gitlab.io/bst-external/>`_
diff --git a/doc/source/core_additional.rst b/doc/source/core_additional.rst
new file mode 100644
index 000000000..76e523ee8
--- /dev/null
+++ b/doc/source/core_additional.rst
@@ -0,0 +1,10 @@
+
+
+Additional writings
+===================
+
+.. toctree::
+ :maxdepth: 2
+
+ additional_cachekeys
+ additional_sandboxing
diff --git a/doc/source/core_format.rst b/doc/source/core_format.rst
new file mode 100644
index 000000000..294867f27
--- /dev/null
+++ b/doc/source/core_format.rst
@@ -0,0 +1,17 @@
+
+
+Project format
+==============
+This section details how to use the BuildStream YAML format to
+create your own project or modify existing projects.
+
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Project format
+
+ format_intro
+ format_project
+ format_declaring
+ format_public
+ format_project_refs
diff --git a/doc/source/core_framework.rst b/doc/source/core_framework.rst
index 8caae1f3f..c3b84a9b1 100644
--- a/doc/source/core_framework.rst
+++ b/doc/source/core_framework.rst
@@ -2,17 +2,20 @@
.. _core_framework:
-Core framework
---------------
+Plugin API reference
+====================
The core public APIs are of interest to anyone who wishes to
implement custom :mod:`Element <buildstream.element>` or
:mod:`Source <buildstream.source>` plugins, and can also be
useful for working on BuildStream itself.
-* :mod:`Plugin <buildstream.plugin>` - Base Class for all plugins
-* :mod:`Source <buildstream.source>` - Base Source Class
-* :mod:`Element <buildstream.element>` - Base Element Class
-* :mod:`BuildElement <buildstream.buildelement>` - Build Element Class
-* :mod:`ScriptElement <buildstream.scriptelement>` - Script Element Class
-* :mod:`Sandbox <buildstream.sandbox.sandbox>` - Build Sandbox
-* :mod:`Utilities <buildstream.utils>` - Utilities for Plugins
+.. toctree::
+ :maxdepth: 1
+
+ buildstream.plugin
+ buildstream.source
+ buildstream.element
+ buildstream.buildelement
+ buildstream.scriptelement
+ buildstream.sandbox.sandbox
+ buildstream.utils
diff --git a/doc/source/core_plugins.rst b/doc/source/core_plugins.rst
new file mode 100644
index 000000000..2951e00cf
--- /dev/null
+++ b/doc/source/core_plugins.rst
@@ -0,0 +1,67 @@
+
+.. _plugins:
+
+Plugin specific documentation
+=============================
+Plugins provide their own individual plugin specific YAML configurations,
+The element ``.bst`` files can specify plugin specific configuration in
+the :ref:`config section <format_config>`, while sources declared on a
+given element specify their plugin specific configuration directly
+:ref:`in their source declarations <format_sources>`.
+
+
+General elements
+----------------
+.. toctree::
+ :maxdepth: 1
+
+ elements/stack
+ elements/import
+ elements/compose
+ elements/script
+ elements/junction
+ elements/filter
+
+
+.. _plugins_build_elements:
+
+Build elements
+--------------
+.. toctree::
+ :maxdepth: 1
+
+ elements/manual
+ elements/make
+ elements/autotools
+ elements/cmake
+ elements/qmake
+ elements/distutils
+ elements/makemaker
+ elements/modulebuild
+ elements/meson
+ elements/pip
+
+
+.. _plugins_sources:
+
+Sources
+-------
+.. toctree::
+ :maxdepth: 1
+
+ sources/local
+ sources/tar
+ sources/zip
+ sources/git
+ sources/bzr
+ sources/ostree
+ sources/patch
+ sources/deb
+
+
+External plugins
+----------------
+External plugins need to be installed separately, here is
+a list of BuildStream plugin projects known to us at this time:
+
+* `bst-external <http://buildstream.gitlab.io/bst-external/>`_
diff --git a/doc/source/examples_flatpak_autotools.rst b/doc/source/examples/flatpak-autotools.rst
index 2c03fa621..cba3973ed 100644
--- a/doc/source/examples_flatpak_autotools.rst
+++ b/doc/source/examples/flatpak-autotools.rst
@@ -6,16 +6,23 @@ Building on a Flatpak SDK
Here we demonstrate how to build and run software using
a Flatpak SDK for the base runtime.
+.. note::
+
+ This example is distributed with BuildStream
+ in the `doc/examples/flatpak-autotools
+ <https://gitlab.com/BuildStream/buildstream/tree/master/doc/examples/flatpak-autotools>`_
+ subdirectory.
+
Project structure
-----------------
-
-project.conf
-~~~~~~~~~~~~
The following is a simple :ref:`project <projectconf>` definition:
-.. literalinclude:: ../examples/flatpak-autotools/project.conf
+``project.conf``
+~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/flatpak-autotools/project.conf
:language: yaml
Here we use an :ref:`arch option <project_options_arch>` to allow
@@ -27,15 +34,16 @@ Note that we've added a :ref:`source alias <project_source_aliases>` for
the ``https://sdk.gnome.org/`` repository to download the SDK from.
-base/sdk.bst
-~~~~~~~~~~~~
+``elements/base/sdk.bst``
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/flatpak-autotools/elements/base/sdk.bst
+ :language: yaml
+
This is the :mod:`import <elements.import>` element used to import the
actual Flatpak SDK, it uses an :mod:`ostree <sources.ostree>` source to
download the Flatpak since these are hosted in OSTree repositories.
-.. literalinclude:: ../examples/flatpak-autotools/elements/base/sdk.bst
- :language: yaml
-
While declaring the :mod:`ostree <sources.ostree>` source, we specify a GPG
public key to verify the OSTree download. This configuration is optional
but recommended for OSTree repositories. The key is stored in the project directory
@@ -59,15 +67,16 @@ it's important to note two things:
with the appropriate symlinks setup from ``/``.
-base/usrmerge.bst
-~~~~~~~~~~~~~~~~~
+``elements/base/usrmerge.bst``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/flatpak-autotools/elements/base/usrmerge.bst
+ :language: yaml
+
This is another :mod:`import <elements.import>` element, and it uses
the :mod:`local <sources.local>` source type so that we can stage files
literally stored in the same repository as the project.
-.. literalinclude:: ../examples/flatpak-autotools/elements/base/usrmerge.bst
- :language: yaml
-
The purpose of this element is simply to add the symlinks for
``/lib -> /usr/lib``, ``/bin -> /usr/bin`` and ``/etc -> /usr/etc``, we
have it depend on the ``base/sdk.bst`` element only to ensure that
@@ -77,27 +86,29 @@ As suggested by the ``.bst`` file, the symlinks themselves are a part
of the project and they are stored in the ``files/links`` directory.
-base.bst
-~~~~~~~~
-This is just a :mod:`stack <elements.stack>` element for convenience sake.
+``elements/base.bst``
+~~~~~~~~~~~~~~~~~~~~~
-.. literalinclude:: ../examples/flatpak-autotools/elements/base.bst
+.. literalinclude:: ../../examples/flatpak-autotools/elements/base.bst
:language: yaml
+This is just a :mod:`stack <elements.stack>` element for convenience sake.
+
Often times you will have a more complex base to build things on, and it
is convenient to just use a :mod:`stack <elements.stack>` element for
your elements to depend on without needing to know about the inner workings
of the base system build.
-hello.bst
-~~~~~~~~~
-Finally, we show an example of an :mod:`autotools <elements.autotools>` element
-to build our sample "Hello World" program.
+``elements/hello.bst``
+~~~~~~~~~~~~~~~~~~~~~~
-.. literalinclude:: ../examples/flatpak-autotools/elements/hello.bst
+.. literalinclude:: ../../examples/flatpak-autotools/elements/hello.bst
:language: yaml
+Finally, we show an example of an :mod:`autotools <elements.autotools>` element
+to build our sample "Hello World" program.
+
We use another :mod:`local <sources.local>` source to obtain the sample
autotools project, but normally you would probably use a :mod:`git <sources.git>`
or other source to obtain source code from another repository.
@@ -108,22 +119,20 @@ Using the project
Now that we've explained the basic layout of the project, here are
just a few things you can try to do with the project.
-
.. note::
The following examples assume that you have first changed your working
- directory to the project root.
-
- This example is a part of the BuildStream source repository in
- the doc/examples/flatpak-autotools subdirectory.
+ directory to the
+ `project root <https://gitlab.com/BuildStream/buildstream/tree/master/doc/examples/flatpak-autotools>`_.
Build the hello.bst element
~~~~~~~~~~~~~~~~~~~~~~~~~~~
To build the project, run :ref:`bst build <invoking_build>` in the
-following way::
+following way:
- bst build hello.bst
+.. raw:: html
+ :file: ../sessions/flatpak-autotools-build.html
Run the hello world program
@@ -133,6 +142,7 @@ and will automatically be in the default ``PATH`` for running things
in a :ref:`bst shell <invoking_shell>`.
To just run the program, run :ref:`bst shell <invoking_shell>` in the
-following way::
+following way:
- bst shell hello.bst -- hello
+.. raw:: html
+ :file: ../sessions/flatpak-autotools-shell.html
diff --git a/doc/source/format.rst b/doc/source/format_declaring.rst
index 04c458d01..4631ee3e8 100644
--- a/doc/source/format.rst
+++ b/doc/source/format_declaring.rst
@@ -1,7 +1,6 @@
-.. _format:
-Element constructs
+Declaring elements
==================
@@ -198,7 +197,7 @@ building sources which use autotools. Element default configurations can be over
in the ``project.conf`` file and additionally overridden in the declaration of an element.
For meaningful documentation on what can be specified in the ``config`` section for a given
-element ``kind``, refer to the element specific documentation.
+element ``kind``, refer to the :ref:`element specific documentation <plugins>`.
.. _format_public:
@@ -224,6 +223,9 @@ An element is allowed to read domain data from any element it depends on, and us
may specify additional domains to be understood and processed by their own element
plugins.
+The public data keys which are recognized under the ``bst`` domain
+can be viewed in detail in the :ref:`builtin public data <public_builtin>` section.
+
.. _format_sandbox:
diff --git a/doc/source/formatintro.rst b/doc/source/format_intro.rst
index 9bc1051c4..b1780f9dc 100644
--- a/doc/source/formatintro.rst
+++ b/doc/source/format_intro.rst
@@ -1,6 +1,4 @@
-.. _formatintro:
-
Introduction
============
diff --git a/doc/source/projectconf.rst b/doc/source/format_project.rst
index 6174ee728..6174ee728 100644
--- a/doc/source/projectconf.rst
+++ b/doc/source/format_project.rst
diff --git a/doc/source/projectrefs.rst b/doc/source/format_project_refs.rst
index 799b5e761..799b5e761 100644
--- a/doc/source/projectrefs.rst
+++ b/doc/source/format_project_refs.rst
diff --git a/doc/source/public.rst b/doc/source/format_public.rst
index beae53e66..d596ea753 100644
--- a/doc/source/public.rst
+++ b/doc/source/format_public.rst
@@ -1,10 +1,9 @@
-.. _public:
+.. _public_builtin:
Builtin public data
===================
-
Elements can provide public data which can be read by other elements
later in the pipeline, the format for exposing public data on a given
element is :ref:`described here <format_public>`.
diff --git a/doc/source/index.rst b/doc/source/index.rst
index db9d07648..ac4587f10 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -11,15 +11,22 @@ using BuildStream.
They begin with a basic introduction to BuildStream, background
information on basic concepts, and a guide to the BuildStream command line interface.
-Later sections provide detailed information on BuilStream internals.
+Later sections provide detailed information on BuildStream internals.
.. toctree::
- :maxdepth: 2
+ :maxdepth: 1
- about
+ main_about
main_install
main_using
main_core
- resources
HACKING
+
+
+Resources
+---------
+* GitLab repository: https://gitlab.com/BuildStream/buildstream
+* Bug Tracking: https://gitlab.com/BuildStream/buildstream/issues
+* Mailing list: https://mail.gnome.org/mailman/listinfo/buildstream-list
+* IRC Channel: irc://irc.gnome.org/#buildstream
diff --git a/doc/source/artifacts.rst b/doc/source/install_artifacts.rst
index e96ca972c..e96ca972c 100644
--- a/doc/source/artifacts.rst
+++ b/doc/source/install_artifacts.rst
diff --git a/doc/source/docker.rst b/doc/source/install_docker.rst
index 9b0f8aa73..9b0f8aa73 100644
--- a/doc/source/docker.rst
+++ b/doc/source/install_docker.rst
diff --git a/doc/source/install.rst b/doc/source/install_main.rst
index 500c94ac2..abe85eed4 100644
--- a/doc/source/install.rst
+++ b/doc/source/install_main.rst
@@ -13,6 +13,10 @@ BuildStream requires the following base system requirements:
* PyGObject introspection bindings
* psutil python library (so you don't have to install GCC and python-devel to build it yourself)
+BuildStream also depends on the host tools for the :mod:`Source <buildstream.source>` plugins.
+Refer to the respective :ref:`source plugin <plugins_sources>` documentation for host tool
+requirements of specific plugins.
+
If you intend to push built artifacts to a remote artifact server,
which requires special permissions, you will also need:
diff --git a/doc/source/about.rst b/doc/source/main_about.rst
index a6210d3d8..a6210d3d8 100644
--- a/doc/source/about.rst
+++ b/doc/source/main_about.rst
diff --git a/doc/source/main_core.rst b/doc/source/main_core.rst
index c7be299ba..c0757b7fa 100644
--- a/doc/source/main_core.rst
+++ b/doc/source/main_core.rst
@@ -1,9 +1,7 @@
-.. _main_core:
-
-Reference documentation
-=======================
+Reference
+=========
This section details the core API reference along with
other more elaborate details about BuildStream internals.
@@ -11,8 +9,18 @@ other more elaborate details about BuildStream internals.
.. toctree::
:maxdepth: 2
- authoring
- cachekeys
- sandboxing
+ core_format
+ core_plugins
core_framework
- modules
+ core_additional
+
+
+..
+ This is a hidden toctree so that the autogenerated
+ modules index is not orphaned, sort of a cheat because
+ we would rather present a manual toctree for this part.
+
+.. toctree::
+ :hidden:
+
+ buildstream
diff --git a/doc/source/main_install.rst b/doc/source/main_install.rst
index 240157e00..c65e7ca96 100644
--- a/doc/source/main_install.rst
+++ b/doc/source/main_install.rst
@@ -1,15 +1,12 @@
-
-.. _main_install:
-
-Installing
-==========
+Install
+=======
This section covers how to install BuildStream onto your machine, how to run BuildStream inside a docker image and also how to configure an artifact server.
.. toctree::
:maxdepth: 2
- install
- docker
- artifacts
+ install_main
+ install_docker
+ install_artifacts
diff --git a/doc/source/main_using.rst b/doc/source/main_using.rst
index 092f59199..9781e79ae 100644
--- a/doc/source/main_using.rst
+++ b/doc/source/main_using.rst
@@ -1,15 +1,15 @@
-.. _main_using:
-
-Using BuildStream
-=================
-This section details how to use the BuildStream command line interface and work with existing BuildStream projects.
+Using
+=====
+This section includes user facing documentation including tutorials,
+guides and information on user preferences and configuration.
.. toctree::
:maxdepth: 2
- commands
- user_config
- examples
+ using_tutorial
+ using_examples
+ using_config
+ using_commands
diff --git a/doc/source/plugin.rsttemplate b/doc/source/plugin.rsttemplate
index 4b252b647..d6ee9488f 100644
--- a/doc/source/plugin.rsttemplate
+++ b/doc/source/plugin.rsttemplate
@@ -1,6 +1 @@
-:orphan:
-
-@@MODULENAME@@ plugin
-============================================
-
.. automodule:: @@MODULE@@
diff --git a/doc/source/resources.rst b/doc/source/resources.rst
deleted file mode 100644
index f9197ef2c..000000000
--- a/doc/source/resources.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-.. _resources:
-
-
-Resources
-=========
-
-* GitLab repository: https://gitlab.com/BuildStream/buildstream
-* Bug Tracking: https://gitlab.com/BuildStream/buildstream/issues
-* Mailing list: https://mail.gnome.org/mailman/listinfo/buildstream-list
-* IRC Channel: irc://irc.gnome.org/#buildstream
diff --git a/doc/source/sessions-stored/autotools-build.html b/doc/source/sessions-stored/autotools-build.html
new file mode 100644
index 000000000..0036110b4
--- /dev/null
+++ b/doc/source/sessions-stored/autotools-build.html
@@ -0,0 +1,135 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/autotools</span>$ bst build hello.bst
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Build
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Checking sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Checking sources
+
+<span style="color:#C4A000"><span style="">BuildStream Version 1.1.3+143.g73b93002.dirty
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Session Start: </span></span><span style="color:#C4A000">Monday, 18-06-2018 at 14:51:01</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Project: </span></span><span style="color:#C4A000">running-commands (/home/user/autotools)</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Targets: </span></span><span style="color:#C4A000">hello.bst</span>
+
+<span style="color:#C4A000"><span style="">User Configuration
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Configuration File: </span></span><span style="color:#C4A000">/home/user/.config/buildstream.conf</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Log Files: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/logs</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Source Mirrors: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/sources</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Build Area: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/build</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Artifact Cache: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/artifacts</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Strict Build Plan: </span></span><span style="color:#C4A000">Yes</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Fetch Tasks: </span></span><span style="color:#C4A000">10</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Build Tasks: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Push Tasks: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Network Retries: </span></span><span style="color:#C4A000">2</span>
+
+<span style="color:#C4A000"><span style="">Pipeline
+</span></span><span style="color:#4E9A06"> buildable</span> <span style="color:#C4A000">a352c93edfc55a41868b4f482758ad3ea1c21571532373542cd20b9135f0718d</span> <span style="color:#3465A4"><span style="">base/alpine.bst</span></span>
+<span style="color:#3465A4"> waiting</span> <span style="color:#C4A000">a8eeb045115a4a71c18d09fe14b7b4fc3f3e838414a7d23d7c6d4c3027f28743</span> <span style="color:#3465A4"><span style="">base.bst</span></span>
+<span style="color:#3465A4"> waiting</span> <span style="color:#C4A000">3f7f32d9cab049f2664b1299c07f0afdd16e8db5f8e9c6e4f6460439bad91013</span> <span style="color:#3465A4"><span style="">hello.bst</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">===============================================================================
+</span></span><span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a352c93e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">running-commands/base-alpine/a352c93e-build.31006.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a352c93e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">04</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a352c93e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a352c93e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">09</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a352c93e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">14</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a352c93e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">running-commands/base-alpine/a352c93e-build.31006.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a8eeb045</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">running-commands/base/a8eeb045-build.31014.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a8eeb045</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a8eeb045</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a8eeb045</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">running-commands/base/a8eeb045-build.31014.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">running-commands/hello/3f7f32d9-build.31017.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running configure-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running configure-commands
+
+<span style="opacity:0.5"> export NOCONFIGURE=1;
+
+ if [ -x ./configure ]; then true;
+ elif [ -x autogen ]; then ./autogen;
+ elif [ -x autogen.sh ]; then ./autogen.sh;
+ elif [ -x bootstrap ]; then ./bootstrap;
+ elif [ -x bootstrap.sh ]; then ./bootstrap.sh;
+ else autoreconf -ivf;
+ fi</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">02</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running configure-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running configure-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running configure-commands
+
+<span style="opacity:0.5"> ./configure --prefix=/usr \
+ --exec-prefix=/usr \
+ --bindir=/usr/bin \
+ --sbindir=/usr/sbin \
+ --sysconfdir=/etc \
+ --datadir=/usr/share \
+ --includedir=/usr/include \
+ --libdir=/usr/lib \
+ --libexecdir=/usr/libexec \
+ --localstatedir=/var \
+ --sharedstatedir=/usr/com \
+ --mandir=/usr/share/man \
+ --infodir=/usr/share/info</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">01</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running configure-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+
+<span style="opacity:0.5"> make</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+
+<span style="opacity:0.5"> make -j1 DESTDIR="/buildstream-install" install</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+
+<span style="opacity:0.5"> find "/buildstream-install" -type f \
+ '(' -perm -111 -o -name '*.so*' \
+ -o -name '*.cmxs' -o -name '*.node' ')' \
+ -exec sh -ec \
+ 'read -n4 hdr <"$1" # check for elf header
+ if [ "$hdr" != "$(printf \\x7fELF)" ]; then
+ exit 0
+ fi
+ debugfile="/buildstream-install/usr/lib/debug/$(basename "$1")"
+ mkdir -p "$(dirname "$debugfile")"
+ objcopy --only-keep-debug --compress-debug-sections "$1" "$debugfile"
+ chmod 644 "$debugfile"
+ strip --remove-section=.comment --remove-section=.note --strip-unneeded "$1"
+ objcopy --add-gnu-debuglink "$debugfile" "$1"' - {} ';'</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">04</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">running-commands/hello/3f7f32d9-build.31017.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">20</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Build
+
+<span style="color:#C4A000"><span style="">Pipeline Summary
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Total: </span></span><span style="color:#C4A000">3</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Session: </span></span><span style="color:#C4A000">3</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Fetch Queue: </span></span><span style="color:#C4A000">processed </span><span style="color:#4E9A06">0</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">skipped </span><span style="color:#C4A000">3</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">failed </span><span style="color:#CC0000"><span style="opacity:0.5">0</span></span>
+<span style="color:#06989A"><span style="opacity:0.5"> Build Queue: </span></span><span style="color:#C4A000">processed </span><span style="color:#4E9A06">3</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">skipped </span><span style="color:#C4A000">0</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">failed </span><span style="color:#CC0000"><span style="opacity:0.5">0</span></span>
+</pre></div>
diff --git a/doc/source/sessions-stored/autotools-shell.html b/doc/source/sessions-stored/autotools-shell.html
new file mode 100644
index 000000000..c9038e376
--- /dev/null
+++ b/doc/source/sessions-stored/autotools-shell.html
@@ -0,0 +1,23 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/autotools</span>$ bst shell hello.bst -- hello
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">3f7f32d9</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000"> main</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running command
+
+<span style="opacity:0.5"> hello</span>
+
+Hello World!
+This is amhello 1.0.
+</pre></div>
diff --git a/doc/source/sessions-stored/autotools-show-variables.html b/doc/source/sessions-stored/autotools-show-variables.html
new file mode 100644
index 000000000..91fc40015
--- /dev/null
+++ b/doc/source/sessions-stored/autotools-show-variables.html
@@ -0,0 +1,67 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/autotools</span>$ bst show --deps none --format "%{vars}" hello.bst
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+autogen: "export NOCONFIGURE=1;\n\nif [ -x ./configure ]; then true;\nelif [ -x autogen\
+ \ ]; then ./autogen;\nelif [ -x autogen.sh ]; then ./autogen.sh;\nelif [ -x bootstrap\
+ \ ]; then ./bootstrap;\nelif [ -x bootstrap.sh ]; then ./bootstrap.sh;\nelse autoreconf\
+ \ -ivf;\nfi"
+bindir: /usr/bin
+build-root: /buildstream/running-commands/hello.bst
+command-subdir: doc/amhello
+conf-args: "--prefix=/usr \\\n--exec-prefix=/usr \\\n--bindir=/usr/bin \\\n--sbindir=/usr/sbin\
+ \ \\\n--sysconfdir=/etc \\\n--datadir=/usr/share \\\n--includedir=/usr/include \\\
+ \n--libdir=/usr/lib \\\n--libexecdir=/usr/libexec \\\n--localstatedir=/var \\\n\
+ --sharedstatedir=/usr/com \\\n--mandir=/usr/share/man \\\n--infodir=/usr/share/info"
+conf-cmd: ./configure
+conf-extra: ''
+conf-global: ''
+conf-local: ''
+configure: "./configure --prefix=/usr \\\n--exec-prefix=/usr \\\n--bindir=/usr/bin\
+ \ \\\n--sbindir=/usr/sbin \\\n--sysconfdir=/etc \\\n--datadir=/usr/share \\\n--includedir=/usr/include\
+ \ \\\n--libdir=/usr/lib \\\n--libexecdir=/usr/libexec \\\n--localstatedir=/var \\\
+ \n--sharedstatedir=/usr/com \\\n--mandir=/usr/share/man \\\n--infodir=/usr/share/info"
+datadir: /usr/share
+debugdir: /usr/lib/debug
+docdir: /usr/share/doc
+element-name: hello.bst
+exec_prefix: /usr
+fix-pyc-timestamps: "find \"/buildstream-install\" -name '*.pyc' -exec \\\n dd if=/dev/zero\
+ \ of={} bs=1 count=4 seek=4 conv=notrunc ';'"
+includedir: /usr/include
+infodir: /usr/share/info
+install-root: /buildstream-install
+lib: lib
+libdir: /usr/lib
+libexecdir: /usr/libexec
+localstatedir: /var
+make: make
+make-install: make -j1 DESTDIR="/buildstream-install" install
+mandir: /usr/share/man
+max-jobs: '8'
+objcopy-extract-args: --only-keep-debug --compress-debug-sections
+objcopy-link-args: --add-gnu-debuglink
+prefix: /usr
+project-name: running-commands
+sbindir: /usr/sbin
+sharedstatedir: /usr/com
+strip-args: --remove-section=.comment --remove-section=.note --strip-unneeded
+strip-binaries: "find \"/buildstream-install\" -type f \\\n '(' -perm -111 -o -name\
+ \ '*.so*' \\\n -o -name '*.cmxs' -o -name '*.node' ')' \\\n -exec sh -ec \\\
+ \n 'read -n4 hdr <\"$1\" # check for elf header\n if [ \"$hdr\" != \"$(printf\
+ \ \\\\x7fELF)\" ]; then\n exit 0\n fi\n debugfile=\"/buildstream-install/usr/lib/debug/$(basename\
+ \ \"$1\")\"\n mkdir -p \"$(dirname \"$debugfile\")\"\n objcopy --only-keep-debug\
+ \ --compress-debug-sections \"$1\" \"$debugfile\"\n chmod 644 \"$debugfile\"\n\
+ \ strip --remove-section=.comment --remove-section=.note --strip-unneeded \"$1\"\
+ \n objcopy --add-gnu-debuglink \"$debugfile\" \"$1\"' - {} ';'"
+sysconfdir: /etc
+
+</pre></div>
diff --git a/doc/source/sessions-stored/first-project-build.html b/doc/source/sessions-stored/first-project-build.html
new file mode 100644
index 000000000..e3766a73b
--- /dev/null
+++ b/doc/source/sessions-stored/first-project-build.html
@@ -0,0 +1,50 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/first-project</span>$ bst build hello.bst
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Build
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Checking sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Checking sources
+
+<span style="color:#C4A000"><span style="">BuildStream Version 1.1.3+140.g182d7d0f.dirty
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Session Start: </span></span><span style="color:#C4A000">Saturday, 16-06-2018 at 13:03:19</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Project: </span></span><span style="color:#C4A000">first-project (/home/user/first-project)</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Targets: </span></span><span style="color:#C4A000">hello.bst</span>
+
+<span style="color:#C4A000"><span style="">User Configuration
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Configuration File: </span></span><span style="color:#C4A000">/home/user/.config/buildstream.conf</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Log Files: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/logs</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Source Mirrors: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/sources</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Build Area: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/build</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Artifact Cache: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/artifacts</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Strict Build Plan: </span></span><span style="color:#C4A000">Yes</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Fetch Tasks: </span></span><span style="color:#C4A000">10</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Build Tasks: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Push Tasks: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Network Retries: </span></span><span style="color:#C4A000">2</span>
+
+<span style="color:#C4A000"><span style="">Pipeline
+</span></span><span style="color:#4E9A06"> buildable</span> <span style="color:#C4A000">838d7c13baadb04d5a95ac8c4623480ec8bb70e8b5cf6c9f7e94c9bbc60ca182</span> <span style="color:#3465A4"><span style="">hello.bst</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">===============================================================================
+</span></span><span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">838d7c13</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">first-project/hello/838d7c13-build.769.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">838d7c13</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">838d7c13</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">838d7c13</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">838d7c13</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">838d7c13</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">first-project/hello/838d7c13-build.769.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Build
+
+<span style="color:#C4A000"><span style="">Pipeline Summary
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Total: </span></span><span style="color:#C4A000">1</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Session: </span></span><span style="color:#C4A000">1</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Fetch Queue: </span></span><span style="color:#C4A000">processed </span><span style="color:#4E9A06">0</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">skipped </span><span style="color:#C4A000">1</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">failed </span><span style="color:#CC0000"><span style="opacity:0.5">0</span></span>
+<span style="color:#06989A"><span style="opacity:0.5"> Build Queue: </span></span><span style="color:#C4A000">processed </span><span style="color:#4E9A06">1</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">skipped </span><span style="color:#C4A000">0</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">failed </span><span style="color:#CC0000"><span style="opacity:0.5">0</span></span>
+</pre></div>
diff --git a/doc/source/sessions-stored/first-project-checkout.html b/doc/source/sessions-stored/first-project-checkout.html
new file mode 100644
index 000000000..2b994e0c2
--- /dev/null
+++ b/doc/source/sessions-stored/first-project-checkout.html
@@ -0,0 +1,19 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/first-project</span>$ bst checkout hello.bst here
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Checking out files in here
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Checking out files in here
+</pre></div>
diff --git a/doc/source/sessions-stored/first-project-init.html b/doc/source/sessions-stored/first-project-init.html
new file mode 100644
index 000000000..ba29791fa
--- /dev/null
+++ b/doc/source/sessions-stored/first-project-init.html
@@ -0,0 +1,8 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/first-project</span>$ bst init --project-name first-project
+
+Created project.conf at: /home/user/first-project/project.conf
+</pre></div>
diff --git a/doc/source/sessions-stored/first-project-ls.html b/doc/source/sessions-stored/first-project-ls.html
new file mode 100644
index 000000000..97e7f16dc
--- /dev/null
+++ b/doc/source/sessions-stored/first-project-ls.html
@@ -0,0 +1,8 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/first-project</span>$ ls ./here
+
+hello.world
+</pre></div>
diff --git a/doc/source/sessions-stored/first-project-show.html b/doc/source/sessions-stored/first-project-show.html
new file mode 100644
index 000000000..aa3c8b8f7
--- /dev/null
+++ b/doc/source/sessions-stored/first-project-show.html
@@ -0,0 +1,14 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/first-project</span>$ bst show hello.bst
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#75507B"> cached</span> <span style="color:#C4A000">838d7c13baadb04d5a95ac8c4623480ec8bb70e8b5cf6c9f7e94c9bbc60ca182</span> <span style="color:#3465A4"><span style="">hello.bst</span></span>
+</pre></div>
diff --git a/doc/source/sessions-stored/first-project-touch.html b/doc/source/sessions-stored/first-project-touch.html
new file mode 100644
index 000000000..a7e0338d6
--- /dev/null
+++ b/doc/source/sessions-stored/first-project-touch.html
@@ -0,0 +1,6 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/first-project</span>$ touch hello.world
+</pre></div>
diff --git a/doc/source/sessions-stored/flatpak-autotools-build.html b/doc/source/sessions-stored/flatpak-autotools-build.html
new file mode 100644
index 000000000..147e728b5
--- /dev/null
+++ b/doc/source/sessions-stored/flatpak-autotools-build.html
@@ -0,0 +1,145 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/flatpak-autotools</span>$ bst build hello.bst
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Build
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Checking sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Checking sources
+
+<span style="color:#C4A000"><span style="">BuildStream Version 1.1.3+135.gfa73abe4.dirty
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Session Start: </span></span><span style="color:#C4A000">Wednesday, 13-06-2018 at 23:09:58</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Project: </span></span><span style="color:#C4A000">flatpak-autotools (/home/user/flatpak-autotools)</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Targets: </span></span><span style="color:#C4A000">hello.bst</span>
+
+<span style="color:#C4A000"><span style="">User Configuration
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Configuration File: </span></span><span style="color:#C4A000">/home/user/.config/buildstream.conf</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Log Files: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/logs</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Source Mirrors: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/sources</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Build Area: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/build</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Artifact Cache: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/artifacts</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Strict Build Plan: </span></span><span style="color:#C4A000">Yes</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Fetch Tasks: </span></span><span style="color:#C4A000">10</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Build Tasks: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Push Tasks: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Network Retries: </span></span><span style="color:#C4A000">2</span>
+
+<span style="color:#C4A000"><span style="">Project Options
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> arch: </span></span><span style="color:#C4A000">x86_64</span>
+
+<span style="color:#C4A000"><span style="">Pipeline
+</span></span><span style="color:#4E9A06"> buildable</span> <span style="color:#C4A000">9ad74bd1a5383d1dba0c04375de427520b2b0cf1f87a1816a178c7d5f211f8b3</span> <span style="color:#3465A4"><span style="">base/sdk.bst</span></span>
+<span style="color:#3465A4"> waiting</span> <span style="color:#C4A000">68ac6ea7b00f9b906b5d0f76ab8c757d343956f6c9001b9db28e22f9bfa9ddcd</span> <span style="color:#3465A4"><span style="">base/usrmerge.bst</span></span>
+<span style="color:#3465A4"> waiting</span> <span style="color:#C4A000">998d2c331d5ba6fbec6c6542ec0b00d396fa73b9c67ab17441525d3a68941c8f</span> <span style="color:#3465A4"><span style="">base.bst</span></span>
+<span style="color:#3465A4"> waiting</span> <span style="color:#C4A000">c6da929e6df823f3a09d2129b6785198d0fede01f5ef87d87f0edcdbfc850c1b</span> <span style="color:#3465A4"><span style="">hello.bst</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">===============================================================================
+</span></span><span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">9ad74bd1</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/sdk.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">flatpak-autotools/base-sdk/9ad74bd1-build.32403.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">9ad74bd1</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/sdk.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">23</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">9ad74bd1</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/sdk.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">9ad74bd1</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/sdk.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">35</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">9ad74bd1</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/sdk.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">01</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">02</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">9ad74bd1</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/sdk.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">flatpak-autotools/base-sdk/9ad74bd1-build.32403.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">68ac6ea7</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/usrmerge.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">flatpak-autotools/base-usrmerge/68ac6ea7-build.32421.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">68ac6ea7</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/usrmerge.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">68ac6ea7</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/usrmerge.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">68ac6ea7</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/usrmerge.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">68ac6ea7</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/usrmerge.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">68ac6ea7</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/usrmerge.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">flatpak-autotools/base-usrmerge/68ac6ea7-build.32421.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">998d2c33</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">flatpak-autotools/base/998d2c33-build.32423.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">998d2c33</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">998d2c33</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">998d2c33</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">flatpak-autotools/base/998d2c33-build.32423.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">flatpak-autotools/hello/c6da929e-build.32425.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">02</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running configure-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running configure-commands
+
+<span style="opacity:0.5"> export NOCONFIGURE=1;
+
+ if [ -x ./configure ]; then true;
+ elif [ -x autogen ]; then ./autogen;
+ elif [ -x autogen.sh ]; then ./autogen.sh;
+ elif [ -x bootstrap ]; then ./bootstrap;
+ elif [ -x bootstrap.sh ]; then ./bootstrap.sh;
+ else autoreconf -ivf;
+ fi</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">02</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running configure-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running configure-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running configure-commands
+
+<span style="opacity:0.5"> ./configure --prefix=/usr \
+ --exec-prefix=/usr \
+ --bindir=/usr/bin \
+ --sbindir=/usr/sbin \
+ --sysconfdir=/etc \
+ --datadir=/usr/share \
+ --includedir=/usr/include \
+ --libdir=/usr/lib \
+ --libexecdir=/usr/libexec \
+ --localstatedir=/var \
+ --sharedstatedir=/usr/com \
+ --mandir=/usr/share/man \
+ --infodir=/usr/share/info</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">01</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running configure-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+
+<span style="opacity:0.5"> make</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+
+<span style="opacity:0.5"> make -j1 DESTDIR="/buildstream-install" install</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+
+<span style="opacity:0.5"> find "/buildstream-install" -type f \
+ '(' -perm -111 -o -name '*.so*' \
+ -o -name '*.cmxs' -o -name '*.node' ')' \
+ -exec sh -ec \
+ 'read -n4 hdr <"$1" # check for elf header
+ if [ "$hdr" != "$(printf \\x7fELF)" ]; then
+ exit 0
+ fi
+ debugfile="/buildstream-install/usr/lib/debug/$(basename "$1")"
+ mkdir -p "$(dirname "$debugfile")"
+ objcopy --only-keep-debug --compress-debug-sections "$1" "$debugfile"
+ chmod 644 "$debugfile"
+ strip --remove-section=.comment --remove-section=.note --strip-unneeded "$1"
+ objcopy --add-gnu-debuglink "$debugfile" "$1"' - {} ';'</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">07</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">flatpak-autotools/hello/c6da929e-build.32425.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">01</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">12</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Build
+
+<span style="color:#C4A000"><span style="">Pipeline Summary
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Total: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Session: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Fetch Queue: </span></span><span style="color:#C4A000">processed </span><span style="color:#4E9A06">0</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">skipped </span><span style="color:#C4A000">4</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">failed </span><span style="color:#CC0000"><span style="opacity:0.5">0</span></span>
+<span style="color:#06989A"><span style="opacity:0.5"> Build Queue: </span></span><span style="color:#C4A000">processed </span><span style="color:#4E9A06">4</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">skipped </span><span style="color:#C4A000">0</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">failed </span><span style="color:#CC0000"><span style="opacity:0.5">0</span></span>
+</pre></div>
diff --git a/doc/source/sessions-stored/flatpak-autotools-shell.html b/doc/source/sessions-stored/flatpak-autotools-shell.html
new file mode 100644
index 000000000..b9943ca2d
--- /dev/null
+++ b/doc/source/sessions-stored/flatpak-autotools-shell.html
@@ -0,0 +1,23 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/flatpak-autotools</span>$ bst shell hello.bst -- hello
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">01</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c6da929e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000"> main</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running command
+
+<span style="opacity:0.5"> hello</span>
+
+Hello World!
+This is amhello 1.0.
+</pre></div>
diff --git a/doc/source/sessions-stored/integration-commands-build.html b/doc/source/sessions-stored/integration-commands-build.html
new file mode 100644
index 000000000..4695b5da4
--- /dev/null
+++ b/doc/source/sessions-stored/integration-commands-build.html
@@ -0,0 +1,159 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/integration-commands</span>$ bst build hello.bst
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Build
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Checking sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Checking sources
+
+<span style="color:#C4A000"><span style="">BuildStream Version 1.1.3+162.gb77323a5.dirty
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Session Start: </span></span><span style="color:#C4A000">Monday, 25-06-2018 at 01:40:34</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Project: </span></span><span style="color:#C4A000">integration-commands (/home/user/integration-commands)</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Targets: </span></span><span style="color:#C4A000">hello.bst</span>
+
+<span style="color:#C4A000"><span style="">User Configuration
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Configuration File: </span></span><span style="color:#C4A000">/home/user/.config/buildstream.conf</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Log Files: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/logs</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Source Mirrors: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/sources</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Build Area: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/build</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Artifact Cache: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/artifacts</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Strict Build Plan: </span></span><span style="color:#C4A000">Yes</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Fetch Tasks: </span></span><span style="color:#C4A000">10</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Build Tasks: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Push Tasks: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Network Retries: </span></span><span style="color:#C4A000">2</span>
+
+<span style="color:#C4A000"><span style="">Pipeline
+</span></span><span style="color:#4E9A06"> buildable</span> <span style="color:#C4A000">f3a052f53373c1d9008c9581600e4b78fd0549b1d914fcb62fd4310fbe356515</span> <span style="color:#3465A4"><span style="">base/alpine.bst</span></span>
+<span style="color:#3465A4"> waiting</span> <span style="color:#C4A000">63215ac6b90b0f64ab031f5e8d190d30873c4649e1f016be19bd368d4d74b1bc</span> <span style="color:#3465A4"><span style="">base.bst</span></span>
+<span style="color:#3465A4"> waiting</span> <span style="color:#C4A000">fe98698f332e669187ea281124b037e0d195cdb5068a1f72d8645d3862e78efa</span> <span style="color:#3465A4"><span style="">libhello.bst</span></span>
+<span style="color:#3465A4"> waiting</span> <span style="color:#C4A000">18c81214a58b3432abe4899ec4973a271d9aa3729e6440b793b865b3702a251c</span> <span style="color:#3465A4"><span style="">hello.bst</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">===============================================================================
+</span></span><span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">f3a052f5</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">integration-commands/base-alpine/f3a052f5-build.357.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">f3a052f5</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">04</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">f3a052f5</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">f3a052f5</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">07</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">f3a052f5</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">13</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">f3a052f5</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">integration-commands/base-alpine/f3a052f5-build.357.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">63215ac6</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">integration-commands/base/63215ac6-build.366.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">63215ac6</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">63215ac6</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">63215ac6</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">integration-commands/base/63215ac6-build.366.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">integration-commands/libhello/fe98698f-build.368.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running integration command
+
+<span style="opacity:0.5"> ldconfig "/usr/lib"</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+
+<span style="opacity:0.5"> make PREFIX="/usr"</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+
+<span style="opacity:0.5"> make -j1 PREFIX="/usr" DESTDIR="/buildstream-install" install</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+
+<span style="opacity:0.5"> find "/buildstream-install" -type f \
+ '(' -perm -111 -o -name '*.so*' \
+ -o -name '*.cmxs' -o -name '*.node' ')' \
+ -exec sh -ec \
+ 'read -n4 hdr <"$1" # check for elf header
+ if [ "$hdr" != "$(printf \\x7fELF)" ]; then
+ exit 0
+ fi
+ debugfile="/buildstream-install/usr/lib/debug/$(basename "$1")"
+ mkdir -p "$(dirname "$debugfile")"
+ objcopy --only-keep-debug --compress-debug-sections "$1" "$debugfile"
+ chmod 644 "$debugfile"
+ strip --remove-section=.comment --remove-section=.note --strip-unneeded "$1"
+ objcopy --add-gnu-debuglink "$debugfile" "$1"' - {} ';'</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">01</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">fe98698f</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">libhello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">integration-commands/libhello/fe98698f-build.368.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">integration-commands/hello/18c81214-build.414.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running integration command
+
+<span style="opacity:0.5"> ldconfig "/usr/lib"</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+
+<span style="opacity:0.5"> make PREFIX="/usr"</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+
+<span style="opacity:0.5"> make -j1 PREFIX="/usr" DESTDIR="/buildstream-install" install</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+
+<span style="opacity:0.5"> find "/buildstream-install" -type f \
+ '(' -perm -111 -o -name '*.so*' \
+ -o -name '*.cmxs' -o -name '*.node' ')' \
+ -exec sh -ec \
+ 'read -n4 hdr <"$1" # check for elf header
+ if [ "$hdr" != "$(printf \\x7fELF)" ]; then
+ exit 0
+ fi
+ debugfile="/buildstream-install/usr/lib/debug/$(basename "$1")"
+ mkdir -p "$(dirname "$debugfile")"
+ objcopy --only-keep-debug --compress-debug-sections "$1" "$debugfile"
+ chmod 644 "$debugfile"
+ strip --remove-section=.comment --remove-section=.note --strip-unneeded "$1"
+ objcopy --add-gnu-debuglink "$debugfile" "$1"' - {} ';'</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">01</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">integration-commands/hello/18c81214-build.414.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">17</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Build
+
+<span style="color:#C4A000"><span style="">Pipeline Summary
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Total: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Session: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Fetch Queue: </span></span><span style="color:#C4A000">processed </span><span style="color:#4E9A06">0</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">skipped </span><span style="color:#C4A000">4</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">failed </span><span style="color:#CC0000"><span style="opacity:0.5">0</span></span>
+<span style="color:#06989A"><span style="opacity:0.5"> Build Queue: </span></span><span style="color:#C4A000">processed </span><span style="color:#4E9A06">4</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">skipped </span><span style="color:#C4A000">0</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">failed </span><span style="color:#CC0000"><span style="opacity:0.5">0</span></span>
+</pre></div>
diff --git a/doc/source/sessions-stored/integration-commands-shell.html b/doc/source/sessions-stored/integration-commands-shell.html
new file mode 100644
index 000000000..10d642e94
--- /dev/null
+++ b/doc/source/sessions-stored/integration-commands-shell.html
@@ -0,0 +1,26 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/integration-commands</span>$ bst shell hello.bst -- hello pony
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">f3a052f5</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000"> main</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running integration command
+
+<span style="opacity:0.5"> ldconfig "/usr/lib"</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">18c81214</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000"> main</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running command
+
+<span style="opacity:0.5"> hello pony</span>
+
+Hello pony
+</pre></div>
diff --git a/doc/source/sessions-stored/running-commands-build.html b/doc/source/sessions-stored/running-commands-build.html
new file mode 100644
index 000000000..621bdb707
--- /dev/null
+++ b/doc/source/sessions-stored/running-commands-build.html
@@ -0,0 +1,103 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/running-commands</span>$ bst build hello.bst
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Build
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Checking sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Checking sources
+
+<span style="color:#C4A000"><span style="">BuildStream Version 1.1.3+141.g6fa3f922.dirty
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Session Start: </span></span><span style="color:#C4A000">Sunday, 17-06-2018 at 20:11:21</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Project: </span></span><span style="color:#C4A000">running-commands (/home/user/running-commands)</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Targets: </span></span><span style="color:#C4A000">hello.bst</span>
+
+<span style="color:#C4A000"><span style="">User Configuration
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Configuration File: </span></span><span style="color:#C4A000">/home/user/.config/buildstream.conf</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Log Files: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/logs</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Source Mirrors: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/sources</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Build Area: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/build</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Artifact Cache: </span></span><span style="color:#C4A000">/home/user/.cache/buildstream/artifacts</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Strict Build Plan: </span></span><span style="color:#C4A000">Yes</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Fetch Tasks: </span></span><span style="color:#C4A000">10</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Build Tasks: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Push Tasks: </span></span><span style="color:#C4A000">4</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Maximum Network Retries: </span></span><span style="color:#C4A000">2</span>
+
+<span style="color:#C4A000"><span style="">Pipeline
+</span></span><span style="color:#4E9A06"> buildable</span> <span style="color:#C4A000">a352c93edfc55a41868b4f482758ad3ea1c21571532373542cd20b9135f0718d</span> <span style="color:#3465A4"><span style="">base/alpine.bst</span></span>
+<span style="color:#3465A4"> waiting</span> <span style="color:#C4A000">a8eeb045115a4a71c18d09fe14b7b4fc3f3e838414a7d23d7c6d4c3027f28743</span> <span style="color:#3465A4"><span style="">base.bst</span></span>
+<span style="color:#3465A4"> waiting</span> <span style="color:#C4A000">c50da0531f050b51a7ddb6f331750642ad222ae6a81a16e091e026aa4d7cc07a</span> <span style="color:#3465A4"><span style="">hello.bst</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">===============================================================================
+</span></span><span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a352c93e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">running-commands/base-alpine/a352c93e-build.17046.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a352c93e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">04</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a352c93e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a352c93e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">09</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a352c93e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">15</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a352c93e</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base/alpine.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">running-commands/base-alpine/a352c93e-build.17046.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a8eeb045</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">running-commands/base/a8eeb045-build.17054.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a8eeb045</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a8eeb045</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">a8eeb045</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">base.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">running-commands/base/a8eeb045-build.17054.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">running-commands/hello/c50da053-build.17056.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging sources
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+
+<span style="opacity:0.5"> make PREFIX="/usr"</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running build-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+
+<span style="opacity:0.5"> make -j1 PREFIX="/usr" DESTDIR="/buildstream-install" install</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running install-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+
+<span style="opacity:0.5"> find "/buildstream-install" -type f \
+ '(' -perm -111 -o -name '*.so*' \
+ -o -name '*.cmxs' -o -name '*.node' ')' \
+ -exec sh -ec \
+ 'read -n4 hdr <"$1" # check for elf header
+ if [ "$hdr" != "$(printf \\x7fELF)" ]; then
+ exit 0
+ fi
+ debugfile="/buildstream-install/usr/lib/debug/$(basename "$1")"
+ mkdir -p "$(dirname "$debugfile")"
+ objcopy --only-keep-debug --compress-debug-sections "$1" "$debugfile"
+ chmod 644 "$debugfile"
+ strip --remove-section=.comment --remove-section=.note --strip-unneeded "$1"
+ objcopy --add-gnu-debuglink "$debugfile" "$1"' - {} ';'</span>
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running strip-commands
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Caching artifact
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">01</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">build</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span><span style="color:#C4A000"><span style="opacity:0.5">running-commands/hello/c50da053-build.17056.log</span></span>
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">17</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Build
+
+<span style="color:#C4A000"><span style="">Pipeline Summary
+</span></span><span style="color:#06989A"><span style="opacity:0.5"> Total: </span></span><span style="color:#C4A000">3</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Session: </span></span><span style="color:#C4A000">3</span>
+<span style="color:#06989A"><span style="opacity:0.5"> Fetch Queue: </span></span><span style="color:#C4A000">processed </span><span style="color:#4E9A06">0</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">skipped </span><span style="color:#C4A000">3</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">failed </span><span style="color:#CC0000"><span style="opacity:0.5">0</span></span>
+<span style="color:#06989A"><span style="opacity:0.5"> Build Queue: </span></span><span style="color:#C4A000">processed </span><span style="color:#4E9A06">3</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">skipped </span><span style="color:#C4A000">0</span><span style="color:#06989A"><span style="opacity:0.5">, </span></span><span style="color:#C4A000">failed </span><span style="color:#CC0000"><span style="opacity:0.5">0</span></span>
+</pre></div>
diff --git a/doc/source/sessions-stored/running-commands-shell.html b/doc/source/sessions-stored/running-commands-shell.html
new file mode 100644
index 000000000..a4666067f
--- /dev/null
+++ b/doc/source/sessions-stored/running-commands-shell.html
@@ -0,0 +1,22 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/running-commands</span>$ bst shell hello.bst -- hello
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Staging dependencies
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Integrating sandbox
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000">c50da053</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#C4A000"> main</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">hello.bst </span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#06989A"><span style=""><span style="opacity:0.5">STATUS </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Running command
+
+<span style="opacity:0.5"> hello</span>
+
+Hello World
+</pre></div>
diff --git a/doc/source/sessions-stored/running-commands-show-after.html b/doc/source/sessions-stored/running-commands-show-after.html
new file mode 100644
index 000000000..beb241112
--- /dev/null
+++ b/doc/source/sessions-stored/running-commands-show-after.html
@@ -0,0 +1,16 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/running-commands</span>$ bst show hello.bst
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#75507B"> cached</span> <span style="color:#C4A000">a352c93edfc55a41868b4f482758ad3ea1c21571532373542cd20b9135f0718d</span> <span style="color:#3465A4"><span style="">base/alpine.bst</span></span>
+<span style="color:#75507B"> cached</span> <span style="color:#C4A000">a8eeb045115a4a71c18d09fe14b7b4fc3f3e838414a7d23d7c6d4c3027f28743</span> <span style="color:#3465A4"><span style="">base.bst</span></span>
+<span style="color:#75507B"> cached</span> <span style="color:#C4A000">c50da0531f050b51a7ddb6f331750642ad222ae6a81a16e091e026aa4d7cc07a</span> <span style="color:#3465A4"><span style="">hello.bst</span></span>
+</pre></div>
diff --git a/doc/source/sessions-stored/running-commands-show-before.html b/doc/source/sessions-stored/running-commands-show-before.html
new file mode 100644
index 000000000..f86a0739f
--- /dev/null
+++ b/doc/source/sessions-stored/running-commands-show-before.html
@@ -0,0 +1,16 @@
+<!--
+ WARNING: This file was generated with bst2html.py
+-->
+<div class="highlight" style="font-size:x-small"><pre>
+<span style="color:#C4A000;font-weight:bold">user@host</span>:<span style="color:#3456A4;font-weight:bold">~/running-commands</span>$ bst show hello.bst
+
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Loading pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving pipeline
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">--</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#3465A4"><span style=""><span style="opacity:0.5">START </span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#06989A"><span style="opacity:0.5">[</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">:</span></span><span style="color:#C4A000">00</span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">][</span></span><span style="color:#06989A"><span style="opacity:0.5">] </span></span><span style="color:#4E9A06"><span style=""><span style="opacity:0.5">SUCCESS</span></span></span><span style="color:#06989A"><span style="opacity:0.5"> </span></span>Resolving cached state
+<span style="color:#4E9A06"> buildable</span> <span style="color:#C4A000">a352c93edfc55a41868b4f482758ad3ea1c21571532373542cd20b9135f0718d</span> <span style="color:#3465A4"><span style="">base/alpine.bst</span></span>
+<span style="color:#3465A4"> waiting</span> <span style="color:#C4A000">a8eeb045115a4a71c18d09fe14b7b4fc3f3e838414a7d23d7c6d4c3027f28743</span> <span style="color:#3465A4"><span style="">base.bst</span></span>
+<span style="color:#3465A4"> waiting</span> <span style="color:#C4A000">c50da0531f050b51a7ddb6f331750642ad222ae6a81a16e091e026aa4d7cc07a</span> <span style="color:#3465A4"><span style="">hello.bst</span></span>
+</pre></div>
diff --git a/doc/source/tutorial/autotools.rst b/doc/source/tutorial/autotools.rst
new file mode 100644
index 000000000..4441cb938
--- /dev/null
+++ b/doc/source/tutorial/autotools.rst
@@ -0,0 +1,146 @@
+
+
+Using the autotools element
+===========================
+In :ref:`the last chapter <tutorial_running_commands>` we observed how the
+:mod:`manual <elements.manual>` element works, allowing one to specify and
+run commands manually in the process of constructing an *artifact*.
+
+In this chapter, we'll go over a mostly automated build of a similar
+hello world example. We will observe how our configurations of the
+:mod:`autotools <elements.autotools>` element translate to configurations
+on the :mod:`manual <elements.manual>` element, and observe how
+:ref:`variable substitution <format_variables>` works.
+
+.. note::
+
+ This example is distributed with BuildStream
+ in the `doc/examples/autotools
+ <https://gitlab.com/BuildStream/buildstream/tree/master/doc/examples/autotools>`_
+ subdirectory.
+
+
+Overview
+--------
+Instead of using the :mod:`local <sources.local>` source as we have been using
+in the previous examples, we're going to use a :mod:`tar <sources.tar>` source
+this time to obtain the ``automake`` release tarball directly from the upstream
+hosting.
+
+In this example we're going to build the example program included in the
+upstream ``automake`` tarball itself, and we're going to use the automated
+:mod:`autotools <elements.autotools>` build element to do so.
+
+
+Project structure
+-----------------
+
+
+``project.conf``
+~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/autotools/project.conf
+ :language: yaml
+
+Like the :ref:`last project.conf <tutorial_running_commands_project_conf>`, we've
+added another :ref:`source alias <project_source_aliases>` for ``gnu``, the location
+from which we're going to download the ``automake`` tarball.
+
+
+``elements/base/alpine.bst`` and ``elements/base.bst``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The alpine base and base stack element are defined in the
+same way as in the last chapter: :ref:`tutorial_running_commands`.
+
+
+``elements/hello.bst``
+~~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/autotools/elements/hello.bst
+ :language: yaml
+
+In this case, we haven't touched the element's ``config`` section
+at all, instead we just slightly override the bahavior of the
+:mod:`autotools <elements.autotools>` build element by overriding
+the :ref:`command-subdir variable <format_variables>`
+
+
+Looking at variables
+''''''''''''''''''''
+Let's take a moment and observe how :ref:`element composition
+<format_composition>` works with variables.
+
+As :ref:`the documentation <format_composition>` mentions:
+
+* The initial settings of the ``project.conf`` variables are setup
+ using BuildStream's :ref:`builtin defaults <project_builtin_defaults>`.
+
+* After this, your local ``project.conf`` may override some variables
+ on a project wide basis. Those will in turn be overridden by any
+ defaults provided by element classes, such as the variables set in the
+ documentation of the :mod:`autotools <elements.autotools>` build element.
+ The variables you set in your final ``<element.bst>`` *element declarations*,
+ will have the final say on the value of a particular variable.
+
+* Finally, the variables, which may be composed of other variables,
+ are resolved after all composition has taken place.
+
+The variable we needed to override was ``command-subdir``, which is an
+automatic variable provided by the :mod:`BuildElement <buildstream.buildelement>`
+abstract class. This variable simply instructs the :mod:`BuildElement <buildstream.buildelement>`
+in which subdirectory of the ``%{build-root}`` to run it's commands in.
+
+One can always display the resolved set of variables for a given
+element's configuration using :ref:`bst show <invoking_show>`:
+
+.. raw:: html
+ :file: ../sessions/autotools-show-variables.html
+
+As an exercise, we suggest that you modify the ``hello.bst``
+element to set the prefix like so:
+
+.. code:: yaml
+
+ variables:
+ prefix: "/opt"
+
+And rerun the above :ref:`bst show <invoking_show>` command to observe how this
+changes the output.
+
+Observe where the variables are declared in the :ref:`builtin defaults
+<project_builtin_defaults>` and :mod:`autotools <elements.autotools>` element
+documentation, and how overriding these affects the resolved set of variables.
+
+
+Using the project
+-----------------
+
+
+Build the hello.bst element
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+To build the project, run :ref:`bst build <invoking_build>` in the
+following way:
+
+.. raw:: html
+ :file: ../sessions/autotools-build.html
+
+
+Run the hello world program
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+We probably know by now what's going to happen, but let's run
+the program we've compiled anyway using :ref:`bst shell <invoking_shell>`:
+
+.. raw:: html
+ :file: ../sessions/autotools-shell.html
+
+
+Summary
+-------
+Now we've used a builtin :ref:`build element <plugins_build_elements>`, and
+we've taken a look into :ref:`how variables work <format_variables>`.
+
+When browsing the :ref:`build elements <plugins_build_elements>` in the
+documentation, we are now equipped with a good idea of what an element is going
+to do, based on their default YAML configuration and any configurations
+we have in our project. We can also now observe what variables are in effect
+for the build of a given element, using :ref:`bst show <invoking_show>`.
diff --git a/doc/source/tutorial/first-project.rst b/doc/source/tutorial/first-project.rst
new file mode 100644
index 000000000..1791b198b
--- /dev/null
+++ b/doc/source/tutorial/first-project.rst
@@ -0,0 +1,128 @@
+
+
+.. _tutorial_first_project:
+
+Your first project
+==================
+To get a feel for the basics, we'll start with the most basic BuildStream project we
+could think of.
+
+.. note::
+
+ This example is distributed with BuildStream
+ in the `doc/examples/first-project
+ <https://gitlab.com/BuildStream/buildstream/tree/master/doc/examples/first-project>`_
+ subdirectory.
+
+
+Creating the project
+--------------------
+First, lets create the project itself using the convenience :ref:`bst init <invoking_init>`
+command to create a little project structure:
+
+.. raw:: html
+ :file: ../sessions/first-project-init.html
+
+
+This will give you a :ref:`project.conf <projectconf>` which will look like this:
+
+``project.conf``
+~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/first-project/project.conf
+ :language: yaml
+
+The :ref:`project.conf <projectconf>` is a central point of configuration
+for your BuildStream project.
+
+
+Add some content
+----------------
+BuildStream processes directory trees as input and output,
+so let's just create a ``hello.world`` file for the project
+to have.
+
+.. raw:: html
+ :file: ../sessions/first-project-touch.html
+
+
+Declare the element
+-------------------
+Here we're going to declare a simple :mod:`import <elements.import>` element
+which will import the ``hello.world`` file we've created in the previous step.
+
+Create ``elements/hello.bst`` with the following content:
+
+
+``elements/hello.bst``
+~~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/first-project/elements/hello.bst
+ :language: yaml
+
+
+The source
+~~~~~~~~~~
+The :mod:`local <sources.local>` source used by the ``hello.bst`` element,
+can be used to access files or directories which are stored in the same repository
+as your BuildStream project. The ``hello.bst`` element uses the :mod:`local <sources.local>`
+source to stage our local ``hello.world`` file.
+
+
+The element
+~~~~~~~~~~~
+The :mod:`import <elements.import>` element can be used to simply add content
+directly to the output artifacts. In this case, it simply takes the ``hello.world`` file
+provided by it's source and stages it directly to the artifact output root.
+
+.. tip::
+
+ In this example so far we've used two plugins, the :mod:`local <sources.local>`
+ source and the :mod:`import <elements.import>` element.
+
+ You can always browse the documentation for all plugins in
+ the :ref:`plugins section <plugins>` of the manual.
+
+
+Build the element
+-----------------
+In order to carry out the activities of the :mod:`import <elements.import>` element
+we've declared, we're going to have to ask BuildStream to *build*.
+
+This process will collect all of the sources required for the specified ``hello.bst``
+and get the backing :mod:`import <elements.import>` element to generate an *artifact*
+for us.
+
+.. raw:: html
+ :file: ../sessions/first-project-build.html
+
+Now the artifact is ready.
+
+Using :ref:`bst show <invoking_show>`, we can observe that the artifact's state, which was reported
+as ``buildable`` in the :ref:`bst build <invoking_build>` command above, has now changed to ``cached``:
+
+.. raw:: html
+ :file: ../sessions/first-project-show.html
+
+
+Observe the output
+------------------
+Now that we've finished building, we can checkout the output of the
+artifact we've created using :ref:`bst checkout <invoking_checkout>`
+
+.. raw:: html
+ :file: ../sessions/first-project-checkout.html
+
+And observe that the file we expect is there:
+
+.. raw:: html
+ :file: ../sessions/first-project-ls.html
+
+
+Summary
+-------
+In this section we've created our first BuildStream project from
+scratch, but it doesnt do much.
+
+We've observed the general structure of a BuildStream project,
+and we've run our first build.
diff --git a/doc/source/tutorial/integration-commands.rst b/doc/source/tutorial/integration-commands.rst
new file mode 100644
index 000000000..8d80eb9a2
--- /dev/null
+++ b/doc/source/tutorial/integration-commands.rst
@@ -0,0 +1,130 @@
+
+
+Integration commands
+====================
+Sometimes a software requires more configuration or processing than what is
+performed at installation time, otherwise it will not run properly.
+
+This is especially true in cases where a daemon or library interoperates
+with third party extensions and needs to maintain a system wide cache whenever
+it's extensions are installed or removed; system wide font caches are an example
+of this.
+
+In these cases we use :ref:`integration commands <public_integration>` to
+ensure that a runtime is ready to run after all of it's components have been *staged*.
+
+.. note::
+
+ This example is distributed with BuildStream
+ in the `doc/examples/integration-commands
+ <https://gitlab.com/BuildStream/buildstream/tree/master/doc/examples/integration-commands>`_
+ subdirectory.
+
+
+Overview
+--------
+In this chapter, we'll be exploring :ref:`integration commands <public_integration>`,
+which will be our first look at :ref:`public data <format_public>`.
+
+
+Project structure
+-----------------
+
+
+``project.conf`` and ``elements/base.bst``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The project.conf and base stack :mod:`stack <elements.stack>` element are configured in the
+same way as in the previous chapter: :ref:`tutorial_running_commands`.
+
+
+``elements/base/alpine.bst``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/integration-commands/elements/base/alpine.bst
+ :language: yaml
+
+This is the same ``base/alpine.bst`` we've seen in previous chapters,
+except that we've added an :ref:`integration command <public_integration>`.
+
+This informs BuildStream that whenever the output of this element is
+expected to *run*, this command should be run first. In this case we
+are simply running ``ldconfig`` as a precautionary measure, to ensure
+that the runtime linker is ready to find any shared libraries we may
+have added to ``%{libdir}``.
+
+
+Looking at public data
+''''''''''''''''''''''
+The :ref:`integration commands <public_integration>` used here is the first time
+we've used any :ref:`builtin public data <public_builtin>`.
+
+Public data is a free form portion of an element's configuration and
+is not necessarily understood by the element on which it is declared, public
+data is intended to be read by it's reverse dependency elements.
+
+This allows annotations on some elements to inform elements later in
+the dependency chain about details of it's artifact, or to suggest how
+it should be processed.
+
+
+``elements/libhello.bst`` and ``elements/hello.bst``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+These are basically manual elements very similar to the ones we've
+seen in the previous chapter: :ref:`tutorial_running_commands`.
+
+These produce a library and a hello program which uses the library,
+we will consider these irrelevant to the topic and leave examination
+of `their sources
+<https://gitlab.com/BuildStream/buildstream/tree/master/doc/examples/integration-commands/files>`_
+as an exercise for the reader.
+
+
+Using the project
+-----------------
+
+
+Build the hello.bst element
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+To build the project, run :ref:`bst build <invoking_build>` in the
+following way:
+
+.. raw:: html
+ :file: ../sessions/integration-commands-build.html
+
+Observe in the build process above, the integration command declared on the
+``base/alpine.bst`` element is run after staging the dependency artifacts
+into the build sandbox and before running any of the build commands, for
+both of the ``libhello.bst`` and ``hello.bst`` elements.
+
+BuildStream assumes that commands which are to be run in the build sandbox
+need to be run in an *integrated* sandbox.
+
+.. tip::
+
+ Integration commands can be taxing on your overall build process,
+ because they need to run at the beginning of every build which
+ :ref:`runtime depends <format_dependencies_types>` on the element
+ declaring them.
+
+ For this reason, it is better to leave out more onerous tasks
+ if they are not needed at software build time, and handle those
+ specific tasks differently later in the pipeline, before deployment.
+
+
+Run the hello world program
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Unlike the previous chapters, this hello world program takes an argument,
+we can invoke the program using :ref:`bst shell <invoking_shell>`:
+
+.. raw:: html
+ :file: ../sessions/integration-commands-shell.html
+
+Here we see again, the integration commands are also used when preparing
+the shell to launch a command.
+
+
+Summary
+-------
+In this chapter we've observed how :ref:`integration commands <public_integration>`
+work, and we now know about :ref:`public data <format_public>`, which plugins
+can read from their dependencies in order to influence their build process.
diff --git a/doc/source/tutorial/running-commands.rst b/doc/source/tutorial/running-commands.rst
new file mode 100644
index 000000000..1708145d8
--- /dev/null
+++ b/doc/source/tutorial/running-commands.rst
@@ -0,0 +1,236 @@
+
+
+.. _tutorial_running_commands:
+
+Running commands
+================
+In :ref:`the first chapter <tutorial_first_project>` we only imported
+a file to create an artifact, this time lets run some commands inside
+the :ref:`isolated build sandbox <sandboxing>`.
+
+.. note::
+
+ This example is distributed with BuildStream
+ in the `doc/examples/running-commands
+ <https://gitlab.com/BuildStream/buildstream/tree/master/doc/examples/running-commands>`_
+ subdirectory.
+
+
+Overview
+--------
+In this chapter, we'll be running commands inside the sandboxed
+execution environment and producing build output.
+
+We'll be compiling the following simple C file:
+
+
+``files/src/hello.c``
+~~~~~~~~~~~~~~~~~~~~~
+.. literalinclude:: ../../examples/running-commands/files/src/hello.c
+ :language: c
+
+
+And we're going to build it using ``make``, using the following Makefile:
+
+
+``files/src/Makefile``
+~~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/running-commands/files/src/Makefile
+ :language: Makefile
+
+
+We'll be using the most fundamental :ref:`build element <plugins_build_elements>`,
+the :mod:`manual <elements.manual>` build element.
+
+The :mod:`manual <elements.manual>` element is the backbone on which all the other
+build elements are built, so understanding how it works at this level is helpful.
+
+
+Project structure
+-----------------
+In this project we have a ``project.conf``, a directory with some source
+code, and 3 element declarations.
+
+Let's first take a peek at what we need to build using :ref:`bst show <invoking_show>`:
+
+.. raw:: html
+ :file: ../sessions/running-commands-show-before.html
+
+This time we have loaded a pipeline with 3 elements, let's go over what they do
+in detail.
+
+
+.. _tutorial_running_commands_project_conf:
+
+``project.conf``
+~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/running-commands/project.conf
+ :language: yaml
+
+Our ``project.conf`` is very much like the last one, except that we
+have defined a :ref:`source alias <project_source_aliases>` for ``alpine``.
+
+.. tip::
+
+ Using :ref:`source aliases <project_source_aliases>` for groups of sources
+ which are generally hosted together is encouraged. This allows one to globally
+ change the access scheme or URL for a group of repositories which belong together.
+
+
+``elements/base/alpine.bst``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/running-commands/elements/base/alpine.bst
+ :language: yaml
+
+This :mod:`import <elements.import>` element uses a :mod:`tar <sources.tar>`
+source to download our Alpine Linux tarball to create our base runtime.
+
+This tarball is a sysroot which provides the C runtime libraries
+and some programs - this is what will be providing the programs we're
+going to run in this example.
+
+
+``elements/base.bst``
+~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/running-commands/elements/base.bst
+ :language: yaml
+
+This is just a symbolic :mod:`stack <elements.stack>` element which declares that
+anything which depends on it, will implicitly depend on ``base/alpine.bst``.
+
+It is typical to use stack elements in places where the implementing logical
+software stack could change, but you rather not have your higher level components
+carry knowledge about those changing components.
+
+Any element which :ref:`runtime depends <format_dependencies_types>` on
+the ``base.bst`` will now be able to execute programs provided by the imported
+``base/alpine.bst`` runtime.
+
+
+``elements/hello.bst``
+~~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/running-commands/elements/hello.bst
+ :language: yaml
+
+Finally we have the element which executes commands. Looking at the
+:mod:`manual <elements.manual>` element's documentation, we can see that
+the element configuration exposes four command lists:
+
+* ``configure-commands``
+
+ Commands which are run in preparation of a build. This is where you
+ would normally call any configure stage build tools to configure
+ the build how you like and generate some files needed for the build.
+
+* ``build-commands``
+
+ Commands to run the build, usually a build system will
+ invoke the compiler for you here.
+
+* ``install-commands``
+
+ Commands to install the build results.
+
+ Commands to install the build results into the target system,
+ these should install files somewhere under ``%{install-root}``.
+
+* ``strip-commands``
+
+ Commands to doctor the build results after the install.
+
+ Typically this involves stripping binaries of debugging
+ symbols or stripping timestamps from build results to ensure
+ reproducibility.
+
+.. tip::
+
+ All other :ref:`build elements <plugins_build_elements>`
+ implement exactly the same command lists too, except that they provide
+ default commands specific to invoke the build systems they support.
+
+The :mod:`manual <elements.manual>` element however is the most basic
+and does not provide any default commands, so we have instructed it
+to use ``make`` to build and install our program.
+
+
+Using the project
+-----------------
+
+
+Build the hello.bst element
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+To build the project, run :ref:`bst build <invoking_build>` in the
+following way:
+
+.. raw:: html
+ :file: ../sessions/running-commands-build.html
+
+Now we've built our hello world program, using ``make``
+and the C compiler provided by the Alpine Linux image.
+
+In the :ref:`first chapter <tutorial_first_project>` we observed that the inputs
+and output of an element are *directory trees*. In this example, the directory tree
+generated by ``base/alpine.bst`` is consumed by ``hello.bst`` due to the
+:ref:`implicit runtime dependency <format_dependencies_types>` introduced by ``base.bst``.
+
+.. tip::
+
+ All of the :ref:`dependencies <format_dependencies>` which are required to run for
+ the sake of a build, are staged at the root of the build sandbox. These comprise the
+ runtime environment in which the depending element will run commands.
+
+ The result is that the ``make`` program and C compiler provided by ``base/alpine.bst``
+ were already in ``$PATH`` and ready to run when the commands were needed by ``hello.bst``.
+
+Now observe that all of the elements in the loaded pipeline are ``cached``,
+the element is *built*:
+
+.. raw:: html
+ :file: ../sessions/running-commands-show-after.html
+
+
+Run the hello world program
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Now that we've built everything, we can indulge ourselves in running
+the hello world program using :ref:`bst shell <invoking_shell>`:
+
+.. raw:: html
+ :file: ../sessions/running-commands-shell.html
+
+Here, :ref:`bst shell <invoking_build>` created a runtime environment for running
+the ``hello.bst`` element. This was done by staging all of the dependencies of
+``hello.bst`` including the ``hello.bst`` output itself into a directory. Once a directory
+with all of the dependencies was staged and ready, we ran the ``hello`` command from
+within the build sandbox environment.
+
+.. tip::
+
+ When specifying a command for :ref:`bst shell <invoking_shell>` to run,
+ we always specify ``--`` first. This is a commonly understood shell syntax
+ to indicate that the remaining arguments are to be treated literally.
+
+ Specifying ``--`` is optional and disambiguates BuildStream's arguments
+ and options from those of the program being run by
+ :ref:`bst shell <invoking_shell>`.
+
+
+Summary
+-------
+In this chapter we've explored how to use the :mod:`manual <elements.manual>` element,
+which forms the basis of all build elements.
+
+We've also observed how the directory tree from the output *artifact* of one element
+is later *staged* at the root of the sandbox, as input for use by any build elements
+which :ref:`depend <format_dependencies>` on that element.
+
+.. tip::
+
+ The way that elements consume their dependency input can vary across the
+ different *kinds* of elements. This chapter describes how it works for
+ :mod:`build elements <buildstream.buildelement>` implementations, which
+ are the most commonly used element type.
diff --git a/doc/source/commands.rst b/doc/source/using_commands.rst
index 18affc6e5..18affc6e5 100644
--- a/doc/source/commands.rst
+++ b/doc/source/using_commands.rst
diff --git a/doc/source/user_config.rst b/doc/source/using_config.rst
index d02aaf3d4..d02aaf3d4 100644
--- a/doc/source/user_config.rst
+++ b/doc/source/using_config.rst
diff --git a/doc/source/examples.rst b/doc/source/using_examples.rst
index cebba27ad..aa100d007 100644
--- a/doc/source/examples.rst
+++ b/doc/source/using_examples.rst
@@ -1,6 +1,4 @@
-.. _examples:
-
Examples
========
This page contains documentation for real examples of BuildStream projects,
@@ -9,6 +7,6 @@ maintained and work as expected.
.. toctree::
- :maxdepth: 2
+ :maxdepth: 1
- examples_flatpak_autotools
+ examples/flatpak-autotools
diff --git a/doc/source/using_tutorial.rst b/doc/source/using_tutorial.rst
new file mode 100644
index 000000000..190c94c8d
--- /dev/null
+++ b/doc/source/using_tutorial.rst
@@ -0,0 +1,15 @@
+
+Tutorial
+========
+This is a step by step walkthrough meant help the user quickly get
+familiar with the fundamentals of creating and using BuildStream
+projects.
+
+.. toctree::
+ :numbered:
+ :maxdepth: 1
+
+ tutorial/first-project
+ tutorial/running-commands
+ tutorial/autotools
+ tutorial/integration-commands
diff --git a/setup.py b/setup.py
index 76708fcf5..717a4a01a 100755
--- a/setup.py
+++ b/setup.py
@@ -251,5 +251,6 @@ setup(name='BuildStream',
'pytest-cov',
# Provide option to run tests in parallel, less reliable
'pytest-xdist',
- 'pytest >= 3.1.0'],
+ 'pytest >= 3.1.0',
+ 'pylint >= 1.8 , < 2'],
zip_safe=False)
diff --git a/tests/completions/completions.py b/tests/completions/completions.py
index cc98cb940..7c169c2d2 100644
--- a/tests/completions/completions.py
+++ b/tests/completions/completions.py
@@ -9,6 +9,7 @@ MAIN_COMMANDS = [
'build ',
'checkout ',
'fetch ',
+ 'help ',
'init ',
'pull ',
'push ',
@@ -174,8 +175,9 @@ def test_option_directory(datafiles, cli, cmd, word_idx, expected, subdir):
['compose-all.bst ', 'compose-include-bin.bst ', 'compose-exclude-dev.bst '], None),
# When running from the files subdir
- ('project', 'bst show ', 2, [], 'files'),
- ('project', 'bst build com', 2, [], 'files'),
+ ('project', 'bst show ', 2, [e + ' ' for e in PROJECT_ELEMENTS], 'files'),
+ ('project', 'bst build com', 2,
+ ['compose-all.bst ', 'compose-include-bin.bst ', 'compose-exclude-dev.bst '], 'files'),
# When passing the project directory
('project', 'bst --directory ../ show ', 4, [e + ' ' for e in PROJECT_ELEMENTS], 'files'),
@@ -193,8 +195,10 @@ def test_option_directory(datafiles, cli, cmd, word_idx, expected, subdir):
['compose-all.bst ', 'compose-include-bin.bst ', 'compose-exclude-dev.bst '], None),
# When running from the files subdir
- ('no-element-path', 'bst show ', 2, [], 'files'),
- ('no-element-path', 'bst build com', 2, [], 'files'),
+ ('no-element-path', 'bst show ', 2,
+ [e + ' ' for e in (PROJECT_ELEMENTS + ['project.conf'])] + ['files/'], 'files'),
+ ('no-element-path', 'bst build com', 2,
+ ['compose-all.bst ', 'compose-include-bin.bst ', 'compose-exclude-dev.bst '], 'files'),
# When passing the project directory
('no-element-path', 'bst --directory ../ show ', 4,
@@ -213,3 +217,16 @@ def test_argument_element(datafiles, cli, project, cmd, word_idx, expected, subd
if subdir:
cwd = os.path.join(cwd, subdir)
assert_completion(cli, cmd, word_idx, expected, cwd=cwd)
+
+
+@pytest.mark.parametrize("cmd,word_idx,expected", [
+ ('bst he', 1, ['help ']),
+ ('bst help ', 2, MAIN_COMMANDS),
+ ('bst help fe', 2, ['fetch ']),
+ ('bst help p', 2, ['pull ', 'push ']),
+ ('bst help p', 2, ['pull ', 'push ']),
+ ('bst help w', 2, ['workspace ']),
+ ('bst help workspace ', 3, WORKSPACE_COMMANDS),
+])
+def test_help_commands(cli, cmd, word_idx, expected):
+ assert_completion(cli, cmd, word_idx, expected)
diff --git a/tests/context/context.py b/tests/context/context.py
index 0dc6c588b..35428105b 100644
--- a/tests/context/context.py
+++ b/tests/context/context.py
@@ -47,6 +47,23 @@ def test_context_load(context_fixture):
assert(context.logdir == os.path.join(cache_home, 'buildstream', 'logs'))
+# Assert that a changed XDG_CACHE_HOME doesn't cause issues
+def test_context_load_envvar(context_fixture):
+ os.environ['XDG_CACHE_HOME'] = '/some/path/'
+
+ context = context_fixture['context']
+ assert(isinstance(context, Context))
+
+ context.load(config=os.devnull)
+ assert(context.sourcedir == os.path.join('/', 'some', 'path', 'buildstream', 'sources'))
+ assert(context.builddir == os.path.join('/', 'some', 'path', 'buildstream', 'build'))
+ assert(context.artifactdir == os.path.join('/', 'some', 'path', 'buildstream', 'artifacts'))
+ assert(context.logdir == os.path.join('/', 'some', 'path', 'buildstream', 'logs'))
+
+ # Reset the environment variable
+ del os.environ['XDG_CACHE_HOME']
+
+
# Test that values in a user specified config file
# override the defaults
@pytest.mark.datafiles(os.path.join(DATA_DIR))
diff --git a/tests/examples/__init__.py b/tests/examples/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/examples/__init__.py
diff --git a/tests/examples/autotools.py b/tests/examples/autotools.py
new file mode 100644
index 000000000..c774776fb
--- /dev/null
+++ b/tests/examples/autotools.py
@@ -0,0 +1,47 @@
+import os
+import pytest
+
+from tests.testutils import cli_integration as cli
+from tests.testutils.integration import assert_contains
+from tests.testutils.site import IS_LINUX
+
+pytestmark = pytest.mark.integration
+
+DATA_DIR = os.path.join(
+ os.path.dirname(os.path.realpath(__file__)), '..', '..', 'doc', 'examples', 'autotools'
+)
+
+
+# Tests a build of the autotools amhello project on a alpine-linux base runtime
+@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
+@pytest.mark.datafiles(DATA_DIR)
+def test_autotools_build(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ checkout = os.path.join(cli.directory, 'checkout')
+
+ # Check that the project can be built correctly.
+ result = cli.run(project=project, args=['build', 'hello.bst'])
+ result.assert_success()
+
+ result = cli.run(project=project, args=['checkout', 'hello.bst', checkout])
+ result.assert_success()
+
+ assert_contains(checkout, ['/usr', '/usr/lib', '/usr/bin',
+ '/usr/share', '/usr/lib/debug',
+ '/usr/lib/debug/hello', '/usr/bin/hello',
+ '/usr/share/doc', '/usr/share/doc/amhello',
+ '/usr/share/doc/amhello/README'])
+
+
+# Test running an executable built with autotools.
+@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
+@pytest.mark.datafiles(DATA_DIR)
+def test_autotools_run(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+
+ result = cli.run(project=project, args=['build', 'hello.bst'])
+ result.assert_success()
+
+ result = cli.run(project=project, args=['shell', 'hello.bst', 'hello'])
+ result.assert_success()
+ assert result.output == 'Hello World!\nThis is amhello 1.0.\n'
diff --git a/tests/examples/first-project.py b/tests/examples/first-project.py
new file mode 100644
index 000000000..dac181423
--- /dev/null
+++ b/tests/examples/first-project.py
@@ -0,0 +1,29 @@
+import os
+import pytest
+
+from tests.testutils import cli_integration as cli
+from tests.testutils.integration import assert_contains
+from tests.testutils.site import IS_LINUX
+
+
+pytestmark = pytest.mark.integration
+
+
+DATA_DIR = os.path.join(
+ os.path.dirname(os.path.realpath(__file__)), '..', '..', 'doc', 'examples', 'first-project'
+)
+
+
+@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
+@pytest.mark.datafiles(DATA_DIR)
+def test_first_project_build_checkout(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ checkout = os.path.join(cli.directory, 'checkout')
+
+ result = cli.run(project=project, args=['build', 'hello.bst'])
+ assert result.exit_code == 0
+
+ result = cli.run(project=project, args=['checkout', 'hello.bst', checkout])
+ assert result.exit_code == 0
+
+ assert_contains(checkout, ['/hello.world'])
diff --git a/tests/examples/integration-commands.py b/tests/examples/integration-commands.py
new file mode 100644
index 000000000..32ef763eb
--- /dev/null
+++ b/tests/examples/integration-commands.py
@@ -0,0 +1,36 @@
+import os
+import pytest
+
+from tests.testutils import cli_integration as cli
+from tests.testutils.integration import assert_contains
+from tests.testutils.site import IS_LINUX
+
+
+pytestmark = pytest.mark.integration
+DATA_DIR = os.path.join(
+ os.path.dirname(os.path.realpath(__file__)), '..', '..', 'doc', 'examples', 'integration-commands'
+)
+
+
+@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
+@pytest.mark.datafiles(DATA_DIR)
+def test_integration_commands_build(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ checkout = os.path.join(cli.directory, 'checkout')
+
+ result = cli.run(project=project, args=['build', 'hello.bst'])
+ assert result.exit_code == 0
+
+
+# Test running the executable
+@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
+@pytest.mark.datafiles(DATA_DIR)
+def test_integration_commands_run(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+
+ result = cli.run(project=project, args=['build', 'hello.bst'])
+ assert result.exit_code == 0
+
+ result = cli.run(project=project, args=['shell', 'hello.bst', '--', 'hello', 'pony'])
+ assert result.exit_code == 0
+ assert result.output == 'Hello pony\n'
diff --git a/tests/examples/running-commands.py b/tests/examples/running-commands.py
new file mode 100644
index 000000000..95f645d77
--- /dev/null
+++ b/tests/examples/running-commands.py
@@ -0,0 +1,36 @@
+import os
+import pytest
+
+from tests.testutils import cli_integration as cli
+from tests.testutils.integration import assert_contains
+from tests.testutils.site import IS_LINUX
+
+
+pytestmark = pytest.mark.integration
+DATA_DIR = os.path.join(
+ os.path.dirname(os.path.realpath(__file__)), '..', '..', 'doc', 'examples', 'running-commands'
+)
+
+
+@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
+@pytest.mark.datafiles(DATA_DIR)
+def test_running_commands_build(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ checkout = os.path.join(cli.directory, 'checkout')
+
+ result = cli.run(project=project, args=['build', 'hello.bst'])
+ assert result.exit_code == 0
+
+
+# Test running the executable
+@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
+@pytest.mark.datafiles(DATA_DIR)
+def test_running_commands_run(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+
+ result = cli.run(project=project, args=['build', 'hello.bst'])
+ assert result.exit_code == 0
+
+ result = cli.run(project=project, args=['shell', 'hello.bst', '--', 'hello'])
+ assert result.exit_code == 0
+ assert result.output == 'Hello World\n'
diff --git a/tests/format/project.py b/tests/format/project.py
index b8e411351..9d595981b 100644
--- a/tests/format/project.py
+++ b/tests/format/project.py
@@ -55,6 +55,21 @@ def test_load_default_project(cli, datafiles):
@pytest.mark.datafiles(os.path.join(DATA_DIR))
+def test_load_project_from_subdir(cli, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename, 'project-from-subdir')
+ result = cli.run(
+ project=project,
+ cwd=os.path.join(project, 'subdirectory'),
+ args=['show', '--format', '%{env}', 'manual.bst'])
+ result.assert_success()
+
+ # Read back some of our project defaults from the env
+ env = _yaml.load_data(result.output)
+ assert (env['USER'] == "tomjon")
+ assert (env['TERM'] == "dumb")
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR))
def test_override_project_path(cli, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename, "overridepath")
result = cli.run(project=project, args=[
diff --git a/tests/format/project/project-from-subdir/manual.bst b/tests/format/project/project-from-subdir/manual.bst
new file mode 100644
index 000000000..4d7f70266
--- /dev/null
+++ b/tests/format/project/project-from-subdir/manual.bst
@@ -0,0 +1 @@
+kind: manual
diff --git a/tests/format/project/project-from-subdir/project.conf b/tests/format/project/project-from-subdir/project.conf
new file mode 100644
index 000000000..fd3134c58
--- /dev/null
+++ b/tests/format/project/project-from-subdir/project.conf
@@ -0,0 +1,4 @@
+# Basic project configuration that doesnt override anything
+#
+
+name: pony
diff --git a/tests/format/project/project-from-subdir/subdirectory/README b/tests/format/project/project-from-subdir/subdirectory/README
new file mode 100644
index 000000000..b32d37708
--- /dev/null
+++ b/tests/format/project/project-from-subdir/subdirectory/README
@@ -0,0 +1 @@
+This directory is used to test running commands from a project subdirectory.
diff --git a/tests/frontend/buildcheckout.py b/tests/frontend/buildcheckout.py
index 3eb98139f..5b46d3d52 100644
--- a/tests/frontend/buildcheckout.py
+++ b/tests/frontend/buildcheckout.py
@@ -390,3 +390,22 @@ def test_build_checkout_workspaced_junction(cli, tmpdir, datafiles):
with open(filename, 'r') as f:
contents = f.read()
assert contents == 'animal=Horsy\n'
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_build_checkout_cross_junction(datafiles, cli, tmpdir):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ subproject_path = os.path.join(project, 'files', 'sub-project')
+ junction_path = os.path.join(project, 'elements', 'junction.bst')
+ checkout = os.path.join(cli.directory, 'checkout')
+
+ generate_junction(tmpdir, subproject_path, junction_path)
+
+ result = cli.run(project=project, args=['build', 'junction.bst:import-etc.bst'])
+ result.assert_success()
+
+ result = cli.run(project=project, args=['checkout', 'junction.bst:import-etc.bst', checkout])
+ result.assert_success()
+
+ filename = os.path.join(checkout, 'etc', 'animal.conf')
+ assert os.path.exists(filename)
diff --git a/tests/frontend/cross_junction_workspace.py b/tests/frontend/cross_junction_workspace.py
new file mode 100644
index 000000000..eb2bc2eb8
--- /dev/null
+++ b/tests/frontend/cross_junction_workspace.py
@@ -0,0 +1,117 @@
+import os
+from tests.testutils import cli, create_repo
+from buildstream import _yaml
+
+
+def prepare_junction_project(cli, tmpdir):
+ main_project = tmpdir.join("main")
+ sub_project = tmpdir.join("sub")
+ os.makedirs(str(main_project))
+ os.makedirs(str(sub_project))
+
+ _yaml.dump({'name': 'main'}, str(main_project.join("project.conf")))
+ _yaml.dump({'name': 'sub'}, str(sub_project.join("project.conf")))
+
+ import_dir = tmpdir.join("import")
+ os.makedirs(str(import_dir))
+ with open(str(import_dir.join("hello.txt")), "w") as f:
+ f.write("hello!")
+
+ import_repo_dir = tmpdir.join("import_repo")
+ os.makedirs(str(import_repo_dir))
+ import_repo = create_repo("git", str(import_repo_dir))
+ import_ref = import_repo.create(str(import_dir))
+
+ _yaml.dump({'kind': 'import',
+ 'sources': [import_repo.source_config(ref=import_ref)]},
+ str(sub_project.join("data.bst")))
+
+ sub_repo_dir = tmpdir.join("sub_repo")
+ os.makedirs(str(sub_repo_dir))
+ sub_repo = create_repo("git", str(sub_repo_dir))
+ sub_ref = sub_repo.create(str(sub_project))
+
+ _yaml.dump({'kind': 'junction',
+ 'sources': [sub_repo.source_config(ref=sub_ref)]},
+ str(main_project.join("sub.bst")))
+
+ args = ['fetch', 'sub.bst']
+ result = cli.run(project=str(main_project), args=args)
+ result.assert_success()
+
+ return str(main_project)
+
+
+def open_cross_junction(cli, tmpdir):
+ project = prepare_junction_project(cli, tmpdir)
+ workspace = tmpdir.join("workspace")
+
+ element = 'sub.bst:data.bst'
+ args = ['workspace', 'open', element, str(workspace)]
+ result = cli.run(project=project, args=args)
+ result.assert_success()
+
+ assert cli.get_element_state(project, element) == 'buildable'
+ assert os.path.exists(str(workspace.join('hello.txt')))
+
+ return project, workspace
+
+
+def test_open_cross_junction(cli, tmpdir):
+ open_cross_junction(cli, tmpdir)
+
+
+def test_list_cross_junction(cli, tmpdir):
+ project, workspace = open_cross_junction(cli, tmpdir)
+
+ element = 'sub.bst:data.bst'
+
+ args = ['workspace', 'list']
+ result = cli.run(project=project, args=args)
+ result.assert_success()
+
+ loaded = _yaml.load_data(result.output)
+ assert isinstance(loaded.get('workspaces'), list)
+ workspaces = loaded['workspaces']
+ assert len(workspaces) == 1
+ assert 'element' in workspaces[0]
+ assert workspaces[0]['element'] == element
+
+
+def test_close_cross_junction(cli, tmpdir):
+ project, workspace = open_cross_junction(cli, tmpdir)
+
+ element = 'sub.bst:data.bst'
+ args = ['workspace', 'close', '--remove-dir', element]
+ result = cli.run(project=project, args=args)
+ result.assert_success()
+
+ assert not os.path.exists(str(workspace))
+
+ args = ['workspace', 'list']
+ result = cli.run(project=project, args=args)
+ result.assert_success()
+
+ loaded = _yaml.load_data(result.output)
+ assert isinstance(loaded.get('workspaces'), list)
+ workspaces = loaded['workspaces']
+ assert len(workspaces) == 0
+
+
+def test_close_all_cross_junction(cli, tmpdir):
+ project, workspace = open_cross_junction(cli, tmpdir)
+
+ args = ['workspace', 'close', '--remove-dir', '--all']
+ result = cli.run(project=project, args=args)
+ result.assert_success()
+
+ assert not os.path.exists(str(workspace))
+
+ args = ['workspace', 'list']
+ result = cli.run(project=project, args=args)
+ result.assert_success()
+
+ loaded = _yaml.load_data(result.output)
+ assert isinstance(loaded.get('workspaces'), list)
+ workspaces = loaded['workspaces']
+ assert len(workspaces) == 0
diff --git a/tests/frontend/fetch.py b/tests/frontend/fetch.py
index e074dadae..ee3a3c3d5 100644
--- a/tests/frontend/fetch.py
+++ b/tests/frontend/fetch.py
@@ -157,3 +157,41 @@ def test_inconsistent_junction(cli, tmpdir, datafiles, ref_storage):
# informing the user to track the junction first
result = cli.run(project=project, args=['fetch', 'junction-dep.bst'])
result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.SUBPROJECT_INCONSISTENT)
+
+
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize("ref_storage", [('inline'), ('project.refs')])
+@pytest.mark.parametrize("kind", [(kind) for kind in ALL_REPO_KINDS])
+def test_fetch_cross_junction(cli, tmpdir, datafiles, ref_storage, kind):
+ project = str(datafiles)
+ subproject_path = os.path.join(project, 'files', 'sub-project')
+ junction_path = os.path.join(project, 'elements', 'junction.bst')
+
+ import_etc_path = os.path.join(subproject_path, 'elements', 'import-etc-repo.bst')
+ etc_files_path = os.path.join(subproject_path, 'files', 'etc-files')
+
+ repo = create_repo(kind, str(tmpdir.join('import-etc')))
+ ref = repo.create(etc_files_path)
+
+ element = {
+ 'kind': 'import',
+ 'sources': [
+ repo.source_config(ref=(ref if ref_storage == 'inline' else None))
+ ]
+ }
+ _yaml.dump(element, import_etc_path)
+
+ configure_project(project, {
+ 'ref-storage': ref_storage
+ })
+
+ generate_junction(tmpdir, subproject_path, junction_path, store_ref=(ref_storage == 'inline'))
+
+ if ref_storage == 'project.refs':
+ result = cli.run(project=project, args=['track', 'junction.bst'])
+ result.assert_success()
+ result = cli.run(project=project, args=['track', 'junction.bst:import-etc.bst'])
+ result.assert_success()
+
+ result = cli.run(project=project, args=['fetch', 'junction.bst:import-etc.bst'])
+ result.assert_success()
diff --git a/tests/frontend/pull.py b/tests/frontend/pull.py
index 0d3890993..411ac1b31 100644
--- a/tests/frontend/pull.py
+++ b/tests/frontend/pull.py
@@ -3,6 +3,8 @@ import shutil
import pytest
from tests.testutils import cli, create_artifact_share
+from . import generate_junction
+
# Project directory
DATA_DIR = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
@@ -226,41 +228,73 @@ def test_push_pull_non_strict(cli, tmpdir, datafiles):
@pytest.mark.datafiles(DATA_DIR)
def test_push_pull_track_non_strict(cli, tmpdir, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
+ share = create_artifact_share(os.path.join(str(tmpdir), 'artifactshare'))
+
+ # First build the target element and push to the remote.
+ cli.configure({
+ 'artifacts': {'url': share.repo, 'push': True},
+ 'projects': {
+ 'test': {'strict': False}
+ }
+ })
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ result.assert_success()
+ assert cli.get_element_state(project, 'target.bst') == 'cached'
+
+ # Assert that everything is now cached in the remote.
+ share.update_summary()
+ all_elements = {'target.bst', 'import-bin.bst', 'import-dev.bst', 'compose-all.bst'}
+ for element_name in all_elements:
+ assert_shared(cli, share, project, element_name)
+
+ # Now we've pushed, delete the user's local artifact cache
+ # directory and try to redownload it from the share
+ #
+ artifacts = os.path.join(cli.directory, 'artifacts')
+ shutil.rmtree(artifacts)
- with create_artifact_share(os.path.join(str(tmpdir), 'artifactshare')) as share:
+ # Assert that nothing is cached locally anymore
+ for element_name in all_elements:
+ assert cli.get_element_state(project, element_name) != 'cached'
- # First build the target element and push to the remote.
- cli.configure({
- 'artifacts': {'url': share.repo, 'push': True},
- 'projects': {
- 'test': {'strict': False}
- }
- })
- result = cli.run(project=project, args=['build', 'target.bst'])
- result.assert_success()
- assert cli.get_element_state(project, 'target.bst') == 'cached'
+ # Now try bst build with tracking and pulling.
+ # Tracking will be skipped for target.bst as it doesn't have any sources.
+ # With the non-strict build plan target.bst immediately enters the pull queue.
+ # However, pulling has to be deferred until the dependencies have been
+ # tracked as the strict cache key needs to be calculated before querying
+ # the caches.
+ result = cli.run(project=project, args=['build', '--track-all', '--all', 'target.bst'])
+ result.assert_success()
+ assert set(result.get_pulled_elements()) == all_elements
- # Assert that everything is now cached in the remote.
- all_elements = {'target.bst', 'import-bin.bst', 'import-dev.bst', 'compose-all.bst'}
- for element_name in all_elements:
- assert_shared(cli, share, project, element_name)
- # Now we've pushed, delete the user's local artifact cache
- # directory and try to redownload it from the share
- #
- artifacts = os.path.join(cli.directory, 'artifacts')
- shutil.rmtree(artifacts)
+@pytest.mark.skipif(not IS_LINUX, reason='Only available on linux')
+@pytest.mark.datafiles(DATA_DIR)
+def test_push_pull_cross_junction(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ share = create_artifact_share(os.path.join(str(tmpdir), 'artifactshare'))
+ subproject_path = os.path.join(project, 'files', 'sub-project')
+ junction_path = os.path.join(project, 'elements', 'junction.bst')
- # Assert that nothing is cached locally anymore
- for element_name in all_elements:
- assert cli.get_element_state(project, element_name) != 'cached'
+ generate_junction(tmpdir, subproject_path, junction_path, store_ref=True)
- # Now try bst build with tracking and pulling.
- # Tracking will be skipped for target.bst as it doesn't have any sources.
- # With the non-strict build plan target.bst immediately enters the pull queue.
- # However, pulling has to be deferred until the dependencies have been
- # tracked as the strict cache key needs to be calculated before querying
- # the caches.
- result = cli.run(project=project, args=['build', '--track-all', '--all', 'target.bst'])
- result.assert_success()
- assert set(result.get_pulled_elements()) == all_elements
+ # First build the target element and push to the remote.
+ cli.configure({
+ 'artifacts': {'url': share.repo, 'push': True}
+ })
+ result = cli.run(project=project, args=['build', 'junction.bst:import-etc.bst'])
+ result.assert_success()
+ assert cli.get_element_state(project, 'junction.bst:import-etc.bst') == 'cached'
+
+ cache_dir = os.path.join(project, 'cache', 'artifacts')
+ shutil.rmtree(cache_dir)
+
+ share.update_summary()
+ assert cli.get_element_state(project, 'junction.bst:import-etc.bst') == 'buildable'
+
+ # Now try bst pull
+ result = cli.run(project=project, args=['pull', 'junction.bst:import-etc.bst'])
+ result.assert_success()
+
+ # And assert that it's again in the local cache, without having built
+ assert cli.get_element_state(project, 'junction.bst:import-etc.bst') == 'cached'
diff --git a/tests/frontend/push.py b/tests/frontend/push.py
index 459c340bc..076324ce1 100644
--- a/tests/frontend/push.py
+++ b/tests/frontend/push.py
@@ -1,7 +1,12 @@
import os
import pytest
+from collections import namedtuple
+from unittest.mock import MagicMock
+
from buildstream._exceptions import ErrorDomain
-from tests.testutils import cli, create_artifact_share
+from tests.testutils import cli, create_artifact_share, create_element_size
+from tests.testutils.site import IS_LINUX
+from . import configure_project, generate_junction
# Project directory
DATA_DIR = os.path.join(
diff --git a/tests/frontend/show.py b/tests/frontend/show.py
index 719dadbf4..0276961ab 100644
--- a/tests/frontend/show.py
+++ b/tests/frontend/show.py
@@ -111,7 +111,8 @@ def test_target_is_dependency(cli, tmpdir, datafiles):
@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize("ref_storage", [('inline'), ('project.refs')])
-def test_unfetched_junction(cli, tmpdir, datafiles, ref_storage):
+@pytest.mark.parametrize("element_name", ['junction-dep.bst', 'junction.bst:import-etc.bst'])
+def test_unfetched_junction(cli, tmpdir, datafiles, ref_storage, element_name):
project = os.path.join(datafiles.dirname, datafiles.basename)
subproject_path = os.path.join(project, 'files', 'sub-project')
junction_path = os.path.join(project, 'elements', 'junction.bst')
@@ -155,14 +156,15 @@ def test_unfetched_junction(cli, tmpdir, datafiles, ref_storage):
# Assert the correct error when trying to show the pipeline
result = cli.run(project=project, silent=True, args=[
- 'show', 'junction-dep.bst'])
+ 'show', element_name])
result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.SUBPROJECT_FETCH_NEEDED)
@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize("ref_storage", [('inline'), ('project.refs')])
-def test_inconsistent_junction(cli, tmpdir, datafiles, ref_storage):
+@pytest.mark.parametrize("element_name", ['junction-dep.bst', 'junction.bst:import-etc.bst'])
+def test_inconsistent_junction(cli, tmpdir, datafiles, ref_storage, element_name):
project = os.path.join(datafiles.dirname, datafiles.basename)
subproject_path = os.path.join(project, 'files', 'sub-project')
junction_path = os.path.join(project, 'elements', 'junction.bst')
@@ -190,6 +192,43 @@ def test_inconsistent_junction(cli, tmpdir, datafiles, ref_storage):
# Assert the correct error when trying to show the pipeline
result = cli.run(project=project, silent=True, args=[
- 'show', 'junction-dep.bst'])
+ 'show', element_name])
result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.SUBPROJECT_INCONSISTENT)
+
+
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize("element_name", ['junction-dep.bst', 'junction.bst:import-etc.bst'])
+def test_fetched_junction(cli, tmpdir, datafiles, element_name):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ subproject_path = os.path.join(project, 'files', 'sub-project')
+ junction_path = os.path.join(project, 'elements', 'junction.bst')
+ element_path = os.path.join(project, 'elements', 'junction-dep.bst')
+
+ # Create a repo to hold the subproject and generate a junction element for it
+ generate_junction(tmpdir, subproject_path, junction_path, store_ref=True)
+
+ # Create a stack element to depend on a cross junction element
+ #
+ element = {
+ 'kind': 'stack',
+ 'depends': [
+ {
+ 'junction': 'junction.bst',
+ 'filename': 'import-etc.bst'
+ }
+ ]
+ }
+ _yaml.dump(element, element_path)
+
+ result = cli.run(project=project, silent=True, args=[
+ 'fetch', 'junction.bst'])
+
+ result.assert_success()
+
+ # Assert the correct error when trying to show the pipeline
+ result = cli.run(project=project, silent=True, args=[
+ 'show', '--format', '%{name}-%{state}', element_name])
+
+ results = result.output.strip().splitlines()
+ assert 'junction.bst:import-etc.bst-buildable' in results
diff --git a/tests/frontend/track.py b/tests/frontend/track.py
index 2defc2349..51768d650 100644
--- a/tests/frontend/track.py
+++ b/tests/frontend/track.py
@@ -437,3 +437,46 @@ def test_junction_element(cli, tmpdir, datafiles, ref_storage):
# Now assert element state (via bst show under the hood) of the dep again
assert cli.get_element_state(project, 'junction-dep.bst') == 'waiting'
+
+
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize("ref_storage", [('inline'), ('project.refs')])
+@pytest.mark.parametrize("kind", [(kind) for kind in ALL_REPO_KINDS])
+def test_cross_junction(cli, tmpdir, datafiles, ref_storage, kind):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ subproject_path = os.path.join(project, 'files', 'sub-project')
+ junction_path = os.path.join(project, 'elements', 'junction.bst')
+ etc_files = os.path.join(subproject_path, 'files', 'etc-files')
+ repo_element_path = os.path.join(subproject_path, 'elements',
+ 'import-etc-repo.bst')
+
+ configure_project(project, {
+ 'ref-storage': ref_storage
+ })
+
+ repo = create_repo(kind, str(tmpdir.join('element_repo')))
+ ref = repo.create(etc_files)
+
+ generate_element(repo, repo_element_path)
+
+ generate_junction(str(tmpdir.join('junction_repo')),
+ subproject_path, junction_path, store_ref=False)
+
+ # Track the junction itself first.
+ result = cli.run(project=project, args=['track', 'junction.bst'])
+ result.assert_success()
+
+ assert cli.get_element_state(project, 'junction.bst:import-etc-repo.bst') == 'no reference'
+
+ # Track the cross junction element. -J is not given, it is implied.
+ result = cli.run(project=project, args=['track', 'junction.bst:import-etc-repo.bst'])
+
+ if ref_storage == 'inline':
+ # This is not allowed to track cross junction without project.refs.
+ result.assert_main_error(ErrorDomain.PIPELINE, 'untrackable-sources')
+ else:
+ result.assert_success()
+
+ assert cli.get_element_state(project, 'junction.bst:import-etc-repo.bst') == 'buildable'
+
+ assert os.path.exists(os.path.join(project, 'project.refs'))
diff --git a/tests/frontend/track_cross_junction.py b/tests/frontend/track_cross_junction.py
new file mode 100644
index 000000000..34c39ddd2
--- /dev/null
+++ b/tests/frontend/track_cross_junction.py
@@ -0,0 +1,156 @@
+import os
+import pytest
+from tests.testutils import cli, create_repo, ALL_REPO_KINDS
+from buildstream import _yaml
+
+from . import generate_junction
+
+
+def generate_element(repo, element_path, dep_name=None):
+ element = {
+ 'kind': 'import',
+ 'sources': [
+ repo.source_config()
+ ]
+ }
+ if dep_name:
+ element['depends'] = [dep_name]
+
+ _yaml.dump(element, element_path)
+
+
+def generate_import_element(tmpdir, kind, project, name):
+ element_name = 'import-{}.bst'.format(name)
+ repo_element_path = os.path.join(project, 'elements', element_name)
+ files = str(tmpdir.join("imported_files_{}".format(name)))
+ os.makedirs(files)
+
+ with open(os.path.join(files, '{}.txt'.format(name)), 'w') as f:
+ f.write(name)
+
+ subproject_path = os.path.join(str(tmpdir.join('sub-project-{}'.format(name))))
+
+ repo = create_repo(kind, str(tmpdir.join('element_{}_repo'.format(name))))
+ ref = repo.create(files)
+
+ generate_element(repo, repo_element_path)
+
+ return element_name
+
+
+def generate_project(tmpdir, name, config={}):
+ project_name = 'project-{}'.format(name)
+ subproject_path = os.path.join(str(tmpdir.join(project_name)))
+ os.makedirs(os.path.join(subproject_path, 'elements'))
+
+ project_conf = {
+ 'name': name,
+ 'element-path': 'elements'
+ }
+ project_conf.update(config)
+ _yaml.dump(project_conf, os.path.join(subproject_path, 'project.conf'))
+
+ return project_name, subproject_path
+
+
+def generate_simple_stack(project, name, dependencies):
+ element_name = '{}.bst'.format(name)
+ element_path = os.path.join(project, 'elements', element_name)
+ element = {
+ 'kind': 'stack',
+ 'depends': dependencies
+ }
+ _yaml.dump(element, element_path)
+
+ return element_name
+
+
+def generate_cross_element(project, subproject_name, import_name):
+ basename, _ = os.path.splitext(import_name)
+ return generate_simple_stack(project, 'import-{}-{}'.format(subproject_name, basename),
+ [{
+ 'junction': '{}.bst'.format(subproject_name),
+ 'filename': import_name
+ }])
+
+
+@pytest.mark.parametrize("kind", [(kind) for kind in ALL_REPO_KINDS])
+def test_cross_junction_multiple_projects(cli, tmpdir, datafiles, kind):
+ tmpdir = tmpdir.join(kind)
+
+ # Generate 3 projects: main, a, b
+ _, project = generate_project(tmpdir, 'main', {'ref-storage': 'project.refs'})
+ project_a, project_a_path = generate_project(tmpdir, 'a')
+ project_b, project_b_path = generate_project(tmpdir, 'b')
+
+ # Generate an element with a trackable source for each project
+ element_a = generate_import_element(tmpdir, kind, project_a_path, 'a')
+ element_b = generate_import_element(tmpdir, kind, project_b_path, 'b')
+ element_c = generate_import_element(tmpdir, kind, project, 'c')
+
+ # Create some indirections to the elements with dependencies to test --deps
+ stack_a = generate_simple_stack(project_a_path, 'stack-a', [element_a])
+ stack_b = generate_simple_stack(project_b_path, 'stack-b', [element_b])
+
+ # Create junctions for projects a and b in main.
+ junction_a = '{}.bst'.format(project_a)
+ junction_a_path = os.path.join(project, 'elements', junction_a)
+ generate_junction(tmpdir.join('repo_a'), project_a_path, junction_a_path, store_ref=False)
+
+ junction_b = '{}.bst'.format(project_b)
+ junction_b_path = os.path.join(project, 'elements', junction_b)
+ generate_junction(tmpdir.join('repo_b'), project_b_path, junction_b_path, store_ref=False)
+
+ # Track the junctions.
+ result = cli.run(project=project, args=['track', junction_a, junction_b])
+ result.assert_success()
+
+ # Import elements from a and b in to main.
+ imported_a = generate_cross_element(project, project_a, stack_a)
+ imported_b = generate_cross_element(project, project_b, stack_b)
+
+ # Generate a top level stack depending on everything
+ all_bst = generate_simple_stack(project, 'all', [imported_a, imported_b, element_c])
+
+ # Track without following junctions. But explicitly also track the elements in project a.
+ result = cli.run(project=project, args=['track', '--deps', 'all', all_bst, '{}:{}'.format(junction_a, stack_a)])
+ result.assert_success()
+
+ # Elements in project b should not be tracked. But elements in project a and main should.
+ expected = [element_c,
+ '{}:{}'.format(junction_a, element_a)]
+ assert set(result.get_tracked_elements()) == set(expected)
+
+
+@pytest.mark.parametrize("kind", [(kind) for kind in ALL_REPO_KINDS])
+def test_track_exceptions(cli, tmpdir, datafiles, kind):
+ tmpdir = tmpdir.join(kind)
+
+ _, project = generate_project(tmpdir, 'main', {'ref-storage': 'project.refs'})
+ project_a, project_a_path = generate_project(tmpdir, 'a')
+
+ element_a = generate_import_element(tmpdir, kind, project_a_path, 'a')
+ element_b = generate_import_element(tmpdir, kind, project_a_path, 'b')
+
+ all_bst = generate_simple_stack(project_a_path, 'all', [element_a,
+ element_b])
+
+ junction_a = '{}.bst'.format(project_a)
+ junction_a_path = os.path.join(project, 'elements', junction_a)
+ generate_junction(tmpdir.join('repo_a'), project_a_path, junction_a_path, store_ref=False)
+
+ result = cli.run(project=project, args=['track', junction_a])
+ result.assert_success()
+
+ imported_b = generate_cross_element(project, project_a, element_b)
+ indirection = generate_simple_stack(project, 'indirection', [imported_b])
+
+ result = cli.run(project=project,
+ args=['track', '--deps', 'all',
+ '--except', indirection,
+ '{}:{}'.format(junction_a, all_bst), imported_b])
+ result.assert_success()
+
+ expected = ['{}:{}'.format(junction_a, element_a),
+ '{}:{}'.format(junction_a, element_b)]
+ assert set(result.get_tracked_elements()) == set(expected)
diff --git a/tests/integration/make.py b/tests/integration/make.py
new file mode 100644
index 000000000..6928cfdc2
--- /dev/null
+++ b/tests/integration/make.py
@@ -0,0 +1,47 @@
+import os
+import pytest
+
+from tests.testutils import cli_integration as cli
+from tests.testutils.integration import assert_contains
+
+
+pytestmark = pytest.mark.integration
+
+
+DATA_DIR = os.path.join(
+ os.path.dirname(os.path.realpath(__file__)),
+ "project"
+)
+
+
+# Test that a make build 'works' - we use the make sample
+# makehello project for this.
+@pytest.mark.integration
+@pytest.mark.datafiles(DATA_DIR)
+def test_make_build(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ checkout = os.path.join(cli.directory, 'checkout')
+ element_name = 'make/makehello.bst'
+
+ result = cli.run(project=project, args=['build', element_name])
+ assert result.exit_code == 0
+
+ result = cli.run(project=project, args=['checkout', element_name, checkout])
+ assert result.exit_code == 0
+
+ assert_contains(checkout, ['/usr', '/usr/bin',
+ '/usr/bin/hello'])
+
+
+# Test running an executable built with make
+@pytest.mark.datafiles(DATA_DIR)
+def test_make_run(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ element_name = 'make/makehello.bst'
+
+ result = cli.run(project=project, args=['build', element_name])
+ assert result.exit_code == 0
+
+ result = cli.run(project=project, args=['shell', element_name, '/usr/bin/hello'])
+ assert result.exit_code == 0
+ assert result.output == 'Hello, world\n'
diff --git a/tests/integration/project/elements/make/makehello.bst b/tests/integration/project/elements/make/makehello.bst
new file mode 100644
index 000000000..4b5c5ac3b
--- /dev/null
+++ b/tests/integration/project/elements/make/makehello.bst
@@ -0,0 +1,10 @@
+kind: make
+description: make test
+
+depends:
+- base.bst
+
+sources:
+- kind: tar
+ url: project_dir:/files/makehello.tar.gz
+ ref: fd342a36503a0a0dd37b81ddb4d2b78bd398d912d813339e0de44a6b6c393b8e
diff --git a/tests/integration/project/elements/sandbox-bwrap/base-with-tmp.bst b/tests/integration/project/elements/sandbox-bwrap/base-with-tmp.bst
new file mode 100644
index 000000000..5c9fa6083
--- /dev/null
+++ b/tests/integration/project/elements/sandbox-bwrap/base-with-tmp.bst
@@ -0,0 +1,6 @@
+kind: import
+description: Base for after-sandbox cleanup test
+
+sources:
+ - kind: local
+ path: files/base-with-tmp/
diff --git a/tests/integration/project/elements/sandbox-bwrap/test-cleanup.bst b/tests/integration/project/elements/sandbox-bwrap/test-cleanup.bst
new file mode 100644
index 000000000..2a89dd3ee
--- /dev/null
+++ b/tests/integration/project/elements/sandbox-bwrap/test-cleanup.bst
@@ -0,0 +1,13 @@
+kind: manual
+description: A dummy project to utilize a base with existing /tmp folder.
+
+depends:
+ - filename: base.bst
+ type: build
+
+ - filename: sandbox-bwrap/base-with-tmp.bst
+
+config:
+ build-commands:
+ - |
+ true
diff --git a/tests/integration/project/files/base-with-tmp/tmp/dummy b/tests/integration/project/files/base-with-tmp/tmp/dummy
new file mode 100644
index 000000000..d18f28449
--- /dev/null
+++ b/tests/integration/project/files/base-with-tmp/tmp/dummy
@@ -0,0 +1 @@
+dummy! \ No newline at end of file
diff --git a/tests/integration/project/files/makehello.tar.gz b/tests/integration/project/files/makehello.tar.gz
new file mode 100644
index 000000000..d0edcb29c
--- /dev/null
+++ b/tests/integration/project/files/makehello.tar.gz
Binary files differ
diff --git a/tests/integration/sandbox-bwrap.py b/tests/integration/sandbox-bwrap.py
new file mode 100644
index 000000000..7d2a18498
--- /dev/null
+++ b/tests/integration/sandbox-bwrap.py
@@ -0,0 +1,31 @@
+import os
+import pytest
+
+from tests.testutils import cli_integration as cli
+from tests.testutils.integration import assert_contains
+from tests.testutils.site import HAVE_BWRAP
+
+
+pytestmark = pytest.mark.integration
+
+
+DATA_DIR = os.path.join(
+ os.path.dirname(os.path.realpath(__file__)),
+ "project"
+)
+
+
+# Bubblewrap sandbox doesn't remove the dirs it created during its execution,
+# so BuildStream tries to remove them to do good. BuildStream should be extra
+# careful when those folders already exist and should not touch them, though.
+@pytest.mark.integration
+@pytest.mark.skipif(not HAVE_BWRAP, reason='Only available with bubblewrap')
+@pytest.mark.datafiles(DATA_DIR)
+def test_sandbox_bwrap_cleanup_build(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ # This element depends on a base image with non-empty `/tmp` folder.
+ element_name = 'sandbox-bwrap/test-cleanup.bst'
+
+ # Here, BuildStream should not attempt any rmdir etc.
+ result = cli.run(project=project, args=['build', element_name])
+ assert result.exit_code == 0
diff --git a/tests/loader/basics.py b/tests/loader/basics.py
index 008750f70..3526697c5 100644
--- a/tests/loader/basics.py
+++ b/tests/loader/basics.py
@@ -84,3 +84,15 @@ def test_invalid_key(datafiles):
element = loader.load()[0]
assert (exc.value.reason == LoadErrorReason.INVALID_DATA)
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'onefile'))
+def test_invalid_directory_load(datafiles):
+
+ basedir = os.path.join(datafiles.dirname, datafiles.basename)
+ loader = make_loader(basedir, ['elements/'])
+
+ with pytest.raises(LoadError) as exc:
+ element = loader.load()[0]
+
+ assert (exc.value.reason == LoadErrorReason.LOADING_DIRECTORY)
diff --git a/tests/loader/junctions.py b/tests/loader/junctions.py
index 635a987bd..a02961fb5 100644
--- a/tests/loader/junctions.py
+++ b/tests/loader/junctions.py
@@ -260,3 +260,43 @@ def test_git_build(cli, tmpdir, datafiles):
# Check that the checkout contains the expected files from both projects
assert(os.path.exists(os.path.join(checkoutdir, 'base.txt')))
assert(os.path.exists(os.path.join(checkoutdir, 'foo.txt')))
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_cross_junction_names(cli, tmpdir, datafiles):
+ project = os.path.join(str(datafiles), 'foo')
+ copy_subprojects(project, datafiles, ['base'])
+
+ element_list = cli.get_pipeline(project, ['base.bst:target.bst'])
+ assert 'base.bst:target.bst' in element_list
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_build_git_cross_junction_names(cli, tmpdir, datafiles):
+ project = os.path.join(str(datafiles), 'foo')
+ checkoutdir = os.path.join(str(tmpdir), "checkout")
+
+ # Create the repo from 'base' subdir
+ repo = create_repo('git', str(tmpdir))
+ ref = repo.create(os.path.join(str(datafiles), 'base'))
+
+ # Write out junction element with git source
+ element = {
+ 'kind': 'junction',
+ 'sources': [
+ repo.source_config(ref=ref)
+ ]
+ }
+ _yaml.dump(element, os.path.join(project, 'base.bst'))
+
+ print(element)
+ print(cli.get_pipeline(project, ['base.bst']))
+
+ # Build (with implicit fetch of subproject), checkout
+ result = cli.run(project=project, args=['build', 'base.bst:target.bst'])
+ assert result.exit_code == 0
+ result = cli.run(project=project, args=['checkout', 'base.bst:target.bst', checkoutdir])
+ assert result.exit_code == 0
+
+ # Check that the checkout contains the expected files from both projects
+ assert(os.path.exists(os.path.join(checkoutdir, 'base.txt')))
diff --git a/tests/sandboxes/missing-command.py b/tests/sandboxes/missing-command.py
new file mode 100644
index 000000000..8f210bcec
--- /dev/null
+++ b/tests/sandboxes/missing-command.py
@@ -0,0 +1,19 @@
+import os
+import pytest
+
+from buildstream._exceptions import ErrorDomain
+
+from tests.testutils import cli
+
+
+DATA_DIR = os.path.join(
+ os.path.dirname(os.path.realpath(__file__)),
+ "missing-command"
+)
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_missing_command(cli, tmpdir, datafiles):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ result = cli.run(project=project, args=['build', 'no-runtime.bst'])
+ result.assert_task_error(ErrorDomain.SANDBOX, 'missing-command')
diff --git a/tests/sandboxes/missing-command/no-runtime.bst b/tests/sandboxes/missing-command/no-runtime.bst
new file mode 100644
index 000000000..4d7f70266
--- /dev/null
+++ b/tests/sandboxes/missing-command/no-runtime.bst
@@ -0,0 +1 @@
+kind: manual
diff --git a/tests/sandboxes/missing-command/project.conf b/tests/sandboxes/missing-command/project.conf
new file mode 100644
index 000000000..b32753625
--- /dev/null
+++ b/tests/sandboxes/missing-command/project.conf
@@ -0,0 +1 @@
+name: test
diff --git a/tests/testutils/__init__.py b/tests/testutils/__init__.py
index 7e5b792a2..93143b505 100644
--- a/tests/testutils/__init__.py
+++ b/tests/testutils/__init__.py
@@ -1,3 +1,4 @@
from .runcli import cli, cli_integration
from .repo import create_repo, ALL_REPO_KINDS
from .artifactshare import create_artifact_share
+from .element_generators import create_element_size
diff --git a/tests/testutils/element_generators.py b/tests/testutils/element_generators.py
new file mode 100644
index 000000000..3f6090da8
--- /dev/null
+++ b/tests/testutils/element_generators.py
@@ -0,0 +1,40 @@
+import os
+
+from buildstream import _yaml
+
+
+# create_element_size()
+#
+# This will open a "<name>_data" file for writing and write
+# <size> MB of urandom (/dev/urandom) "stuff" into the file.
+# A bst import element file is then created: <name>.bst
+#
+# Args:
+# name: (str) of the element name (e.g. target.bst)
+# path: (str) pathway to the project/elements directory
+# dependencies: A list of strings (can also be an empty list)
+# size: (int) size of the element in bytes
+#
+# Returns:
+# Nothing (creates a .bst file of specified size)
+#
+def create_element_size(name, path, dependencies, size):
+ os.makedirs(path, exist_ok=True)
+
+ # Create a file to be included in this element's artifact
+ with open(os.path.join(path, name + '_data'), 'wb+') as f:
+ f.write(os.urandom(size))
+
+ # Simplest case: We want this file (of specified size) to just
+ # be an import element.
+ element = {
+ 'kind': 'import',
+ 'sources': [
+ {
+ 'kind': 'local',
+ 'path': os.path.join(path, name + '_data')
+ }
+ ],
+ 'depends': dependencies
+ }
+ _yaml.dump(element, os.path.join(path, name))