Debian packages from Cargo projects Build Status

This is a Cargo helper command which automatically creates binary Debian packages (.deb) from Cargo projects.

Installation

sh cargo install cargo-deb

Requires Rust 1.42+, and optionally dpkg, ldd and liblzma-dev. Compatible with Ubuntu.

Usage

sh cargo deb

Upon running cargo deb from the base directory of your Rust project, the Debian package will be created in target/debian/<project_name>_<version>_<arch>.deb (or you can change the location with the --output option). This package can be installed with dpkg -i target/debian/*.deb.

Debug symbols are stripped from the main binary by default, unless [profile.release] debug = true is set in Cargo.toml. If cargo deb --separate-debug-symbols is run, the debug symbols will be packaged as a separate file installed at /usr/lib/debug/<path-to-binary>.debug.

cargo deb --install builds and installs the project system-wide.

Configuration

No configuration is necessary to make a basic package from a Cargo project with a binary. This command obtains basic information it needs from the Cargo.toml file. It uses Cargo fields: name, version, license, license-file, description, readme, homepage, and repository.

For a more complete Debian package, you may also define a new table, [package.metadata.deb] that contains maintainer, copyright, license-file, changelog, depends, conflicts, breaks, replaces, provides, extended-description/extended-description-file, section, priority, and assets.

[package.metadata.deb] options

Everything is optional:

Example of custom Cargo.toml additions

toml [package.metadata.deb] maintainer = "Michael Aaron Murphy <mmstickman@gmail.com>" copyright = "2017, Michael Aaron Murphy <mmstickman@gmail.com>" license-file = ["LICENSE", "4"] extended-description = """\ A simple subcommand for the Cargo package manager for \ building Debian packages from Rust projects.""" depends = "$auto" section = "utility" priority = "optional" assets = [ ["target/release/cargo-deb", "usr/bin/", "755"], ["README.md", "usr/share/doc/cargo-deb/README", "644"], ]

Systemd Manager:

toml [package.metadata.deb] maintainer = "Michael Aaron Murphy <mmstickman@gmail.com>" copyright = "2015-2016, Michael Aaron Murphy <mmstickman@gmail.com>" license-file = ["LICENSE", "3"] depends = "$auto, systemd" extended-description = """\ Written safely in Rust, this systemd manager provides a simple GTK3 GUI interface \ that allows you to enable/disable/start/stop services, monitor service logs, and \ edit unit files without ever using the terminal.""" section = "admin" priority = "optional" assets = [ ["assets/org.freedesktop.policykit.systemd-manager.policy", "usr/share/polkit-1/actions/", "644"], ["assets/systemd-manager.desktop", "usr/share/applications/", "644"], ["assets/systemd-manager-pkexec", "usr/bin/", "755"], ["target/release/systemd-manager", "usr/bin/", "755"] ]

Advanced usage

--fast flag uses lighter compression. Useful for very large packages or quick deployment.

[package.metadata.deb.variants.$name]

There can be multiple variants of the metadata in one Cargo.toml file. --variant=name selects the variant to use. Options set in a variant override [package.metadata.deb] options. It automatically adjusts package name.

Cross-compilation

cargo deb supports a --target flag, which takes Rust target triple. See rustc --print target-list for the list of supported values.

Cross-compilation can be run from any host, including macOS and Windows, provided that Debian-compatible linker and system libraries are available to Rust. The target has to be installed for Rust (e.g. rustup target add i686-unknown-linux-gnu) and has to be installed for the host system (e.g. Debian) (e.g. apt-get install libc6-dev-i386). Note that Rust's and Debian's architecture names are different.

sh cargo deb --target=i686-unknown-linux-gnu

Cross-compiled archives are saved in target/<target triple>/debian/*.deb. The actual archive path is printed on success.

In .cargo/config you can add [target.<target triple>] strip = { path = "…" } objcopy = { path = "…" } to specify a path to the architecture-specific strip and objcopy commands, or use --no-strip.

Separate debug info

cargo deb --separate-debug-symbols

Removes debug symbols from executables and places them as separate files in /usr/lib/debug. Requires GNU objcopy tool.

Custom build flags

If you would like to handle the build process yourself, you can use cargo deb --no-build so that the cargo-deb command will not attempt to rebuild your project.

cargo deb -- <cargo build flags>

Flags after -- are passed to cargo build, so you can use options such as -Z, --frozen, and --locked. Please use that only for features that cargo-deb doesn't support natively.

Workspaces

Workspaces are not fully supported yet. Please leave feedback if you're interested in workspace support.

It's possible to build a project in another directory with cargo deb --manifest-path=<path/to/Cargo.toml>.

Custom version strings

cargo deb --deb-version my-custom-version

Overrides the version string generated from the Cargo manifest.