.. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Dependency model ================ Elements in the data model are related by their *dependencies*. In BuildStream, there are two types of relationship that an Element may have with a *dependency*, :ref:`build and runtime dependencies `. More often than not, an element will require its dependency both to *build* and also at *runtime*. Consider a simple build scenario where you want to build an application, which requires a service be present in order to function properly at *runtime*, a compiler that need only be present at *build time*, and a runtime environment or base system which must be required all the time: .. image:: images/arch-dependency-model.svg Note that in BuildStream we are only concerned with element level granularity in our dependency model, and there is no way to depend on only a part of an element's output *artifact*. Instead we can employ :mod:`compose ` and :mod:`filter ` elements in conjunction with :ref:`split rules ` to achieve sub artifact granularity at build and deploy time. When developing BuildStream, it is important to understand the distinction between dependency types and element :class:`Scope `, which acts as a selector of which elements to consider in the dependency graph of a given element when performing recursive activities. Scope ~~~~~ * **Scope.ALL** In the :func:`Scope.ALL ` scope, all elements are considered. This is used in some cases to forcefully fetch, pull or build all dependencies of a given element, even when not all of them are needed. This scope simply includes all of the dependencies, including the element itself. * **Scope.RUN** In the :func:`Scope.RUN ` scope, only elements which are required to run are considered, including the element itself. Note that these are transitive - the service also requires the base runtime. This is used when for example, launching a ``bst shell`` environment for the purpose of running, or in any case we need to consider which elements are required to run. .. image:: images/arch-dependency-model-runtime.svg :align: center * **Scope.BUILD** In the :func:`Scope.BUILD ` scope, only elements which are required to build are considered, *excluding* the element we intend to build. .. image:: images/arch-dependency-model-build.svg :align: center Note that build type dependencies are not transitive, which is why the *Bootstrap* element is not selected when pulling in the *Compiler* to build the *Application*. Further, note that we still follow the *Compiler* dependency on the *Base Runtime*, this is because when we depend on an element for the purpose of *building*, we expect that element to *run* and as such we include all of the *runtime dependencies* of *build dependencies* when selecting the *Scope.BUILD* elements.