cargo-aur
is a new subcommand for cargo
that produces a release tarball and
PKGBUILD file for a Rust project, so that it can be released on the Arch Linux
User Repository (AUR).
No extra configuration is necessary. As long as your Cargo.toml
has the usual
fields, a PKGBUILD will be generated with all the necessary sections filled
out.
Guess what? cargo-aur
itself is on the AUR! Install it with an AUR-compatible
package manager like aura
:
sudo aura -A cargo-aur-bin
...or via cargo
:
cargo install cargo-aur
Navigate to a Rust project, and run:
cargo aur
This will produce a foobar-1.2.3-x86_64.tar.gz
tarball and a PKGBUILD within
target/cargo-aur
.
If you wish, you can now run makepkg
to ensure that your package actually builds.
> makepkg
==> Making package: cargo-aur-bin 1.0.0-1 (Wed 10 Jun 2020 08:23:46 PM PDT)
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
... etc ...
==> Finished making: cargo-aur-bin 1.0.0-1 (Wed 10 Jun 2020 08:23:47 PM PDT)
Notice that the built package itself is postfixed with -bin
, which follows the
AUR standard.
At this point, it is up to you to:
- Create an official
Release
on Github/Gitlab, attaching the original binary tarball thatcargo aur
produced. - Copy the PKGBUILD to a git repo that tracks releases of your package.
- Run
makepkg --printsrcinfo > .SRCINFO
. - Commit both files and push to the AUR.
Some of these steps may be automated in cargo aur
at a later date if there is
sufficient demand.
If you specify a [[bin]]
section in your Cargo.toml
and set the name
field, this will be used as the binary name to install within the PKGBUILD.
If your package requires other Arch packages at runtime, you can specify these
within your Cargo.toml
like this:
[package.metadata.aur]
depends = ["nachos", "pizza"]
optdepends = ["sushi", "ramen"]
And these settings will be copied to your PKGBUILD.
The files
list can be used to designated initial files to be copied the user's
filesystem. So this:
[package.metadata.aur]
files = [["path/to/local/foo.txt", "/usr/local/share/your-app/foo.txt"]]
will result in this:
package() {
install -Dm755 your-app -t "$pkgdir/usr/bin"
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
install -Dm644 "path/to/local/foo.txt" "$pkgdir/usr/local/share/your-app/foo.txt"
}
The custom
list can be used to add specific commands to the package()
function. This config:
[package.metadata.aur]
custom = ["echo hi"]
yields:
package() {
install -Dm755 cargo-aur -t "$pkgdir/usr/bin"
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
echo hi
}
Note: Caveat emptor. No attempt is made to verify the injected commands.
Run with --musl
to produce a release binary that is statically linked via
MUSL.
> cargo aur --musl
> cd target/x86_64-unknown-linux-musl/release/
> ldd <your-binary>
not a dynamic executable