#!/bin/sh -e # Seeing as this is the only rust package in the repositories (other than rust # itself), this will also serve as a reference to writing network-free rust # based packages. # Set the CARGO_HOME variable to the current directory to prevent cargo from # touching '$HOME/.cargo'. This keeps the build contained to the package # manager's domain. export CARGO_HOME="$PWD" # Instruct the compiler to trim absolute paths in resulting binaries and instead # change them to relative paths ($PWD/... ./...). export RUSTFLAGS="$RUSTFLAGS --remap-path-prefix=$PWD=." # Extract each crate and generate a checksum file. This effectively mimics # 'cargo vendor' without the network requirement. This allows the package # manager to cache each crate and handle them as regular sources. ( cd vendor for crate in *.crate; do tar xf "$crate" # Strip the filename from the sha256sum output. sha256=$(sha256sum "$crate") sha256=${sha256%% *} printf '{"package":"%s","files":{}}\n' "$sha256" \ > "${crate%.crate}/.cargo-checksum.json" done ) # Cargo reads a "global" configuration file from $CARGO_HOME, as we've set it to # $PWD this is where we'll be storing the vendor config. mkdir -p .cargo # Create the configuration file to tell cargo to look in the 'vendor' directory # for the already downloaded sources rather than crates.io (over network). cat < .cargo/config.toml [source.crates-io] replace-with = "vendored-sources" [source.vendored-sources] directory = "vendor" EOF # Use the '--frozen' flag to tell cargo to skip the network and use whatever # dependencies are in the Cargo.[toml|lock] files. cargo build --release --frozen mkdir -p "$1/usr/bin" cp -f target/release/cbindgen "$1/usr/bin"