← Back to rust-lang/cargo

How to Deploy & Use rust-lang/cargo

Prerequisites

Building Cargo from source requires:

Required:

  • cargo and rustc (latest stable Rust toolchain)
  • A C compiler for your platform (see cc-rs requirements)
  • git (to clone the repository)

Platform-Specific Dependencies:

Linux/macOS:

  • OpenSSL development headers (libssl-dev on Ubuntu/Debian, openssl-devel on RHEL/Fedora/Alpine, or openssl via Homebrew on macOS)
  • pkg-config (to locate system libraries; optional but recommended)

Windows:

  • Visual Studio Build Tools or MinGW (for C compiler)
  • Windows SDK (for Schannel, used instead of OpenSSL)

Optional (for vendored-openssl feature):

  • perl and make (only if building with --features vendored-openssl to compile a static OpenSSL)

Note: The build automatically uses vendored versions of libcurl, libgit2, libssh2, and libz unless system libraries are detected via pkg-config. Using vendored libraries is recommended as they are tested to work with Cargo.

Installation

Clone the repository and build the release binary:

git clone https://github.com/rust-lang/cargo.git
cd cargo
cargo build --release

Build with vendored OpenSSL (avoids system OpenSSL dependency on Unix systems):

cargo build --release --features vendored-openssl

Build with specific system libraries (advanced): If you prefer system libraries over vendored ones, ensure they are installed and detectable via pkg-config:

# Ubuntu/Debian example
sudo apt-get install libcurl4-openssl-dev libgit2-dev libssh2-1-dev zlib1g-dev

# Build without vendored libraries (uses system versions)
cargo build --release

The compiled binary will be available at target/release/cargo.

Configuration

Cargo uses configuration files and environment variables to control behavior:

Configuration Files:

  • Global: ~/.cargo/config.toml (or config without extension)
  • Project-specific: .cargo/config.toml in your project root

Key Environment Variables:

  • CARGO_HOME — Directory for Cargo cache and config (default: ~/.cargo)
  • CARGO_TARGET_DIR — Location for build artifacts (default: target/)
  • CARGO_NET_OFFLINE — Set to true to disable network access
  • CARGO_HTTP_TIMEOUT — HTTP timeout in seconds (default: 30)
  • CARGO_REGISTRIES_CRATES_IO_PROTOCOL — Set to sparse (default) or git for registry indexing

Registry Authentication: For private registries, credentials are stored in:

  • ~/.cargo/credentials.toml (automatically managed via cargo login)

Example .cargo/config.toml:

[build]
jobs = 8
target-dir = "build"

[net]
retry = 3
git-fetch-with-cli = true

[registries]
my-registry = { index = "https://git.example.com/index" }

Build & Run

Development Build:

cargo build

Creates a debug binary at target/debug/cargo.

Release Build:

cargo build --release

Creates an optimized binary at target/release/cargo.

Running Tests:

# Run the full test suite
cargo test

# Run specific tests
cargo test --test testsuite -- add

# Run with verbose output
cargo test -- --nocapture

Using Your Built Cargo:

# Check version
./target/release/cargo --version

# Use to build another project
./target/release/cargo build --manifest-path /path/to/other/project/Cargo.toml

# Install locally for testing
cargo install --path . --force

Feature Flags:

  • vendored-openssl — Statically link OpenSSL (Unix only)
  • vendored-libgit2 — Force vendored libgit2 even if system version exists

Deployment

Local Installation: Install the built Cargo binary to your Rust toolchain:

# Install to CARGO_HOME/bin (usually ~/.cargo/bin)
cargo install --path . --force

# Or manually copy
cp target/release/cargo ~/.cargo/bin/cargo-dev

CI/CD Integration: Use your custom Cargo build in GitHub Actions:

- name: Build Custom Cargo
  run: |
    git clone https://github.com/rust-lang/cargo.git
    cd cargo
    cargo build --release --features vendored-openssl
    echo "$PWD/target/release" >> $GITHUB_PATH

Docker Deployment:

FROM rust:latest as builder
WORKDIR /src
RUN git clone https://github.com/rust-lang/cargo.git .
RUN cargo build --release --features vendored-openssl

FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y git ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /src/target/release/cargo /usr/local/bin/cargo
ENTRYPOINT ["cargo"]

Note: The Cargo team maintains the official binary distributed with Rust via rustup. Self-built binaries are primarily intended for development, testing new features, or specific environment requirements.

Troubleshooting

OpenSSL Not Found (Unix) Error: could not find native static library for openssl or openssl-sys build failures.

Solutions:

  • Install OpenSSL development headers: sudo apt-get install libssl-dev (Ubuntu) or brew install openssl (macOS)
  • Or build with: cargo build --release --features vendored-openssl

pkg-config Errors Error: pkg-config exited with status or library not found.

Solutions:

  • Install pkg-config and library headers
  • Or force vendored libraries: Ensure no system libcurl, libgit2, libssh2 dev packages are installed, or set PKG_CONFIG_PATH="" to force vendored builds

C Compiler Not Found Error: linker cc not found or failed to run custom build command.

Solutions:

  • Linux: Install build-essential (Ubuntu) or Development Tools (RHEL)
  • macOS: Install Xcode Command Line Tools: xcode-select --install
  • Windows: Install Visual Studio Build Tools with "Desktop development with C++" workload

Perl/Make Required Error: When using vendored-openssl, build fails with missing perl or make.

Solutions:

  • Install perl and make (or gmake on some systems)
  • On Windows with vendored OpenSSL, ensure Strawberry Perl is installed and in PATH

Git Dependencies Fail Error: SSH authentication failures when fetching git dependencies.

Solutions:

  • Set CARGO_NET_GIT_FETCH_WITH_CLI=true to use system git instead of libgit2
  • Or configure SSH keys in ~/.ssh/config with IdentitiesOnly yes

Windows-Specific: Schannel If building on Windows without OpenSSL, the build uses Schannel (Windows native TLS). Ensure Windows SDK is installed. If you need OpenSSL on Windows instead, use --features vendored-openssl.

Test Failures If tests fail due to network access or missing tools:

  • Set CARGO_NET_OFFLINE=true for offline tests (limited)
  • Some tests require git, ssh, and network connectivity to crates.io
  • Run specific test suites: cargo test --test testsuite instead of full suite