repo/extra/cbindgen/build
2023-07-19 20:01:43 -05:00

54 lines
1.7 KiB
Bash
Executable File

#!/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 <<EOF > .cargo/config
[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"