.. highlight:: yaml Library and Package Dependencies ################################ ``dds`` considers that all libraries belong to a single *package*, but a single package may contain one or more *libraries*. For this reason, and to better interoperate with other build and packaging tools, we consider the issues of package dependencies and library dependencies separately. .. _deps.pkg-deps: Package Dependencies ******************** Consider that we are creating a package ``acme-gadgets@4.3.6``. We declare the name and version in the ``package.dds`` in the package root: .. code-block:: Name: acme-gadgets Version: 4.3.6 Namespace: acme .. note:: The ``Namespace`` field is required, but will be addressed in the :ref:`deps.lib-deps` section. Suppose that our package's libraries build upon the libraries in the ``acme-widgets`` package, and that we require version ``1.4.3`` or newer, but not as new as ``2.0.0``. Such a dependency can be declared with the ``Depends`` key: .. code-block:: :emphasize-lines: 5 Name: acme-gadgets Version: 4.3.6 Namespace: acme Depends: acme-widgets ^1.4.3 If we wish to declare additional dependencies, we simply declare them with additional ``Depends`` keys .. code-block:: :emphasize-lines: 5-7 Name: acme-gadgets Version: 4.3.6 Namespace: acme Depends: acme-widgets ^1.4.3 Depends: acme-gizmos ~5.6.5 Depends: acme-utils ^3.3.0 When ``dds`` attempts to build a project, it will first build the dependency solution by iteratively scanning the dependencies of the containing project and all transitive dependencies. .. note:: Unlike other packaging tools, ``dds`` will find a solution with the *lowest* possible version that satisfies the given requirements for each package. .. _deps.lib-deps: Library Dependencies ******************** In ``dds``, library interdependencies are tracked separately from the packages that contain them. A library must declare its intent to use another library in the ``library.dds`` at its library root. The minimal content of a ``library.dds`` is the ``Name`` key: .. code-block:: Name: gadgets To announce that a library wishes to *use* another library, use the aptly-named ``Uses`` key: .. code-block:: :emphasize-lines: 3-5 Name: gadgets Uses: acme/widgets Uses: acme/gizmos Uses: acme/utils Here is where the package's ``Namespace`` key comes into play: A library's qualified name is specified by joining the ``Namespace`` of the containing package with the ``Name`` of the library within that package with a ``/`` between them. It is the responsibility of package authors to document the ``Namespace`` and ``Name`` of the packages and libraries that they distribute. .. note:: The ``Namespace`` of a package is completely arbitrary, and need not relate to a C++ ``namespace``. .. note:: The ``Namespace`` need not be unique to a single package. For example, a single organization (Like Acme Inc.) can share a single ``Namespace`` for many of their packages and libraries. However, it is essential that the ``/`` pair be universally unique, so choose wisely! Once the ``Uses`` key appears in the ``library.dds`` file of a library, ``dds`` will make available the headers for the library being used, and will transitively propagate that usage requirement to users of the library.