Skip to main content

Dependencies

Formats​

The [dependencies] section supports registry, path, Git, and pkg-config dependencies:

String (registry)​

[dependencies]
fmt = "10.1.1"
spdlog = "1.12"
catch2 = "3.4.0"

The version string is used as-is for registry lookup.

Table (git)​

[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0" }

Fields: git, branch, tag, rev, mode, include, lib, libs.

Table (path)​

[dependencies]
mylib = { path = "../mylib" }

For a prebuilt external library, specify its layout explicitly. The three arrays are paths relative to the dependency root (include, lib) and linker names (libs):

[dependencies]
dcr-math = { path = "../deps/dcr-math", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }

Table (pkg-config)​

Use an installed .pc package when the library is provided by the operating system or another system package manager. DCR invokes pkg-config --cflags and pkg-config --libs, preserving include, library, linker, and other flags:

[dependencies]
fmt = { pkg-config = "fmt" }
openssl = { pkg-config = ["openssl", "libcrypto"] }

The pkg-config executable must be available in PATH. The named .pc files must be available through pkg-config's standard search paths or via PKG_CONFIG_PATH. These dependencies are not downloaded or built by DCR; they are recorded in dcr.lock with a pkg-config+... source.

Registry​

DCR uses a package registry for dependency lookup by name.

# ~/.dcr/config.toml
[registry.default]
url = "https://index.dcr.dexoron.tech"
priority = 1

Registry priority: order in config.toml. The DCR_INDEX_PATH variable overrides the path to index.json.

Git dependencies​

Git dependencies are cloned into ~/.dcr/git/; their exact checked-out commit is written to dcr.lock.

Both Git and path dependencies have two modes:

  • DCR package: the source has dcr.toml. DCR builds it before the consumer and uses the package name from its manifest for linking.
  • Prebuilt library: it provides existing headers and binaries through include, lib, and libs. DCR passes them to the compiler/linker without building the dependency.

The mode is normally detected automatically. Use mode = "build" or mode = "prebuild" when a source contains both a manifest and prebuilt artifacts and you need to choose explicitly.

dcr-math-lib publishes both forms. Select its prebuilt library explicitly:

[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }

DCR supports specifying branch/tag/rev for git sources:

  • branch — switch to a branch
  • tag — switch to a tag
  • rev — switch to a specific commit
  • features — feature flags (parsed, but does not affect build)

Path dependencies​

Local paths may point at a DCR package or a prebuilt external library. A path DCR package is built before its consumer, including its own path/git dependencies. DCR detects dependency cycles. A prebuilt library is never built by DCR; it is linked from the directories declared in its dependency entry.

[dependencies]
mylib = { path = "/abs/path/to/lib" }
mylib = { path = "../relative/path" }

For DCR packages, the package name from dcr.toml is used for linking (so the dependency key may differ from the library name). Header resolution includes the packaged target/include directory and link search includes target/lib.

Buildable DCR library:

dcr-math-lib/
├── dcr.toml
└── src/
├── dcr_math.c
└── dcr_math.h

Prebuilt library:

dcr-math-lib/
├── include/
│ └── dcr_math.h
└── lib/
└── libdcr-math.a # or .so / .lib

libs contains linker names without the lib prefix and file extension: use ["dcr-math"] for libdcr-math.a.

If one repository contains both forms, keep the prebuilt files in include/ and lib/ and select the mode explicitly:

[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }

For a local copy, replace git with path = "../dcr-math-lib". In prebuild mode DCR does not run the dependency build, even when dcr.toml is present.

dcr.lock​

Dependency lock file. Contains package names and sources.

Created during dcr build for resolved registry, path, and Git dependencies. Not updated during dcr add — only on the next dcr build.

Resolution process​

  1. Resolve dependency sources (registry → git → path)
  2. Fetch git dependencies into ~/.dcr/git/ and check out the requested ref
  3. Build DCR package dependencies recursively
  4. Collect include_dirs, lib_dirs, libs for the compiler