This is a Cargo helper command which automatically creates Debian packages (.deb
) from Cargo projects.
cargo install cargo-deb
Requires Rust 1.19+, Debian/Ubuntu, dpkg
, ldd
, and optionally liblzma-dev
.
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
. This package can be installed with dpkg -i target/debian/*.deb
.
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.
Debug symbols are stripped from the main binary by default. To keep debug symbols, either set [profile.release] debug = true
in Cargo.toml
or run cargo deb --no-strip
.
cargo deb --install
builds and installs the project system-wide.
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
. However, as these fields are not enough for a complete Debian package, you may also define a new table, [package.metadata.deb]
that contains maintainer
, copyright
, license-file
, depends
, extended-description
, section
, priority
, and assets
.
- maintainer: The person maintaining the Debian packaging. If not present, the first author is used.
- copyright: To whom and when the copyright of the software is granted. If not present, the list of authors is used.
- license-file: The location of the license and the amount of lines to skip at the top. If not present, package-level
license-file
is used. - depends: The runtime dependencies of the project, which are automatically generated with the
$auto
keyword. - extended-description: An extended description of the project โ the more detailed the better. Package's
readme
file is used as a fallback. - revision: Version of the Debian package (when the package is updated more often than the project).
- section: The application category that the software belongs to.
- priority: Defines if the package is
required
oroptional
. - assets: Files to be included in the package and the permissions to assign them. If assets are not specified, then defaults are taken from binaries explicitly listed in
[[bin]]
(copied to/usr/bin/
) and packagereadme
(copied tousr/share/doc/โฆ
).- The first argument of each asset is the location of that asset in the Rust project.
- The second argument is where the file will be copied.
- If is argument ends with
/
it will be inferred that the target is the directory where the file will be copied. - Otherwise, it will be inferred that the source argument will be renamed when copied.
- If is argument ends with
- The third argument is the permissions (octal string) to assign that file.
- features: List of Cargo features to use when building the package.
- default-features: whether to use default crate features in addition to the
features
list (defaulttrue
).
[package.metadata.deb]
maintainer = "Michael Aaron Murphy <[email protected]>"
copyright = "2017, Michael Aaron Murphy <[email protected]>"
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:
[package.metadata.deb]
maintainer = "Michael Aaron Murphy <[email protected]>"
copyright = "2015-2016, Michael Aaron Murphy <[email protected]>"
license-file = ["LICENSE", "3"]
depends = "$auto"
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"]
]