| The Package Catalog | |||||
| ################### | |||||
| ``dds`` stores a catalog of available packages, along with their dependency | |||||
| statements and information about how a source distribution thereof may be | |||||
| maintained. | |||||
| Viewing Catalog Contents | |||||
| ************************ | |||||
| The default catalog database is stored in a user-local location, and the | |||||
| package IDs available can be listed with ``dds catalog list``. This will only | |||||
| list the IDs of the packages, but none of the additional metadata about them. | |||||
| Adding Packages to the Catalog | |||||
| ****************************** | |||||
| There are two primary ways to add entries to the package catalog. | |||||
| Adding Individual Packages | |||||
| ========================== | |||||
| A single package can be added to the catalog with the ``dds catalog add`` | |||||
| command: | |||||
| .. code-block:: text | |||||
| dds catalog add <package-id> | |||||
| [--depends <requirement> [--depends <requirement> [...]]] | |||||
| [--git-url <url>] | |||||
| [--git-ref <ref>] | |||||
| [--auto-lib <Namespace>/<Name>] | |||||
| The ``<package-id>`` positional arguments is the ``name@version`` package ID | |||||
| that will be added to the catalog. The following options are supported: | |||||
| ``--depends <requirement>`` | |||||
| This argument, which can be specified multiple times to represent multiple | |||||
| dependencies, sets the dependencies of the package within the catalog. If | |||||
| the obtained package root contains a ``package.dds``, then the dependencies | |||||
| listed here must be identical to those listed in ``package.dds``, or | |||||
| dependency resolution may yield unexpected results. | |||||
| ``--git-url <url>`` | |||||
| Specify a Git URL to clone from to obtain the package. The root of the | |||||
| cloned repository must be a package root, but does not necessarily need to | |||||
| have the ``package.dds`` and ``library.dds`` files if relying on the | |||||
| ``--auto-lib`` parameter. | |||||
| ``--git-ref`` **must** be passed with ``--git-url``. | |||||
| ``--git-ref <ref>`` | |||||
| Specify a Git ref to clone. The remote must support cloning by the ref that | |||||
| is specified here. Most usually this should be a Git tag. | |||||
| ``dds`` will perform a shallow clone of the package at the specified | |||||
| Git reference. | |||||
| ``--auto-lib`` | |||||
| This option must be provided if the upstream does not already contain the | |||||
| ``dds`` files that are necessary to export the library information. This | |||||
| can only be specified for packages that contain a single library root at | |||||
| the package root. | |||||
| The form of the argument is that of ``<Namespapce>/<Name>``, where | |||||
| ``Namespace`` and ``Name`` are the usage requirement keys that should be | |||||
| generated for the library. | |||||
| Bulk Imports via JSON | |||||
| ===================== | |||||
| The ``dds catalog import`` supports a ``--json`` flag that specifies a JSON | |||||
| file from which catalog entries will be generated. | |||||
| .. note:: | |||||
| The ``--json`` flag can be passed more than once to import multiple JSON | |||||
| files at once. | |||||
| The JSON file has the following structure: | |||||
| .. code-block:: jsonc | |||||
| { | |||||
| // Import version spec. | |||||
| "version": 1, | |||||
| // Packages section | |||||
| "packages": { | |||||
| // Subkeys are package names | |||||
| "acme-gadgets": { | |||||
| // Keys within the package names are the versions that are | |||||
| // available for each package. | |||||
| "0.4.2": { | |||||
| // `depends` is an object of dependencies for this | |||||
| // particular version of the package. | |||||
| "depends": { | |||||
| // A mapping of package names to version ranges | |||||
| "acme-widgets": "^1.4.1" | |||||
| }, | |||||
| // Specify the Git remote information | |||||
| "git": { | |||||
| // `url` and `ref` are required. | |||||
| "url": "http://example.com/git/repo/acme-gadgets.git", | |||||
| "ref": "v0.4.2-stable", | |||||
| // The `auto-lib` is optional, to specify an automatic | |||||
| // library name/namespace pair to generate for the | |||||
| // root library | |||||
| "auto-lib": "Acme/Gadgets" | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } |
| design | design | ||||
| packages | packages | ||||
| toolchains | toolchains | ||||
| source-dists | |||||
| catalog |
| location rather than modifying their source code. | location rather than modifying their source code. | ||||
| .. _pkgs.source-root: | |||||
| Source Roots in ``dds`` | Source Roots in ``dds`` | ||||
| ======================= | ======================= | ||||
| ``library.dds`` file must be present at the corresponding library root. | ``library.dds`` file must be present at the corresponding library root. | ||||
| .. _pkgs.pkg-root: | |||||
| Package Roots | Package Roots | ||||
| ************* | ************* | ||||
| A package is defined by some *package root*, and contains some number of | A package is defined by some *package root*, and contains some number of | ||||
| *libraries*. In order for a package to be exported by ``dds`` it must have a | *libraries*. In order for a package to be exported by ``dds`` it must have a | ||||
| ``package.dds`` file at its package root. | |||||
| ``package.dds`` file at its package root. | |||||
| The primary distribution format of packages that is used by ``dds`` is the | |||||
| *source distribution*. Refer to the page :doc:`source-dists`. | |||||
| Packages are identified by a name/version pair, joined together by an ``@`` | |||||
| symbol. The version of a package must be a semantic version string. Together, | |||||
| the ``name@version`` string forms the *package ID*, and it must be unique | |||||
| within a repository or package catalog. |
| The Local Package Repository | |||||
| ############################ | |||||
| ``dds`` maintains a local repository of packages that it has obtained at the | |||||
| request of a user. The packages themselves are stored as | |||||
| :doc:`source distributions <source-dists>` (``dds`` does not store the binaries | |||||
| that it builds within the repository). | |||||
| Reading Repository Contents | |||||
| *************************** | |||||
| Most times, ``dds`` will manage the repository content silently, but it may be | |||||
| useful to see what ``dds`` is currently storing away. | |||||
| The content of the repostiory can be seen with the ``repo`` subcommand:: | |||||
| > dds repo ls | |||||
| This will print the names of packages that ``dds`` has downloaded, as well as | |||||
| the versions of each. | |||||
| Obtaining Packages | |||||
| ****************** | |||||
| When ``dds`` builds a package, it will also build the dependency libraries of | |||||
| that package. In order for the dependency build to succeed, it must have a | |||||
| local copy of the source distribution of that dependency. | |||||
| When ``dds`` performs dependency resolution, it will consider both existing | |||||
| packages in the local repository, as well as packages that are available from | |||||
| the :doc:`package catalog <catalog>`. If the dependency solution requires any | |||||
| packages that are not in the local repository, it will use the information in | |||||
| the catalog to obtain a source distribution for each missing package. The | |||||
| source distributions will automatically be added to the local repository, and | |||||
| later dependency resolutions will not need to download that package again. | |||||
| .. _repo.export-local: | |||||
| Exporting a Project into the Repository | |||||
| *************************************** | |||||
| ``dds`` can only use packages that are available in the local repository. For | |||||
| packages that have a listing in the catalog, this is not a problem. If one is | |||||
| developing a local package and wants to allow it to be used in another local | |||||
| package, that can be done by exporting a source distribution from the package | |||||
| root:: | |||||
| > dds sdist export | |||||
| This command will create a source distribution and put it into the local | |||||
| repository. The package available to other projects on the local system. | |||||
| .. note:: | |||||
| This doesn't export in "editable" mode: A snapshot of the package root | |||||
| will be taken and exported to the local repository. | |||||
| If one tries to export a package root into a repository that already contains | |||||
| a package with a matching identifier, ``dds`` will issue an error. If the | |||||
| ``--replace`` flag is specified with ``sdist export``, then ``dds`` will | |||||
| forcibly replace the package in the local repository with a new copy. |
| Source Distributions | |||||
| #################### | |||||
| A *source distribution* is ``dds``'s primary format for consuming and | |||||
| distributing packages. A source distribution, in essence, is a | |||||
| :ref:`package root <pkgs.pkg-root>` directory that contains only the files | |||||
| necessary for ``dds`` to reproduce the full build of all libraries in the | |||||
| package. The source distribution retains the directory structure of every | |||||
| :ref:`source root <pkgs.source-root>` of the original package, and thus retains | |||||
| the header structure thereof. In this way, the ``#include`` directives to use | |||||
| a library in a source distribution are identical to if the libraries therein | |||||
| were directly part of the consuming project. | |||||
| Generating a Source Distribution | |||||
| ******************************** | |||||
| Generating a source distribution from a project directory is done with the | |||||
| ``sdist`` subcommand:: | |||||
| > dds sdist create | |||||
| The above command can be executed within any package root, and the result will | |||||
| be a new directory that reproduces the package's filesystem structure, but | |||||
| only maintaining the files that are necessary for ``dds`` to reproduce the | |||||
| build of that package. | |||||
| The ``--project=<dir>``` flag can be provided to override the directory that | |||||
| ``dds`` will use as the package root. The default is the working directory of | |||||
| the project. | |||||
| The ``--out=<path>`` flag can be provided to override the destination path of | |||||
| the resulting source distribution. The path should not name an existing file or | |||||
| directory. By default, ``dds`` will generate a source distribution in the | |||||
| working directory with the name ``project.dsd/`` (The output is itself a | |||||
| directory, not an archive). If the ``--replace`` flag is provided, then ``dds`` | |||||
| will overwrite the destination if it names an existing file or directory. | |||||
| Exporting a Package to the Local Repository | |||||
| ******************************************* | |||||
| .. seealso:: :ref:`repo.export-local` |