#!/bin/sh if [ "$1" == --prepare ]; then PREPARE=1 fi name='below' specfile="rust-${name}.spec" version=$(rpm -q --qf '%{VERSION}\n' --specfile "$specfile" | head -1) nv="${name}-${version}" crate="${nv}.crate" vendor_tarball="${nv}-vendor.tar.gz" if [ -f "$vendor_tarball" ]; then echo "${vendor_tarball} already exists, aborting" exit 1 fi [ -f "$crate" ] || spectool -g "$specfile" tardir="$PWD" workdir=$(mktemp -d) if [ ! -n "$PREPARE" ]; then trap 'rm -rf "$workdir"' EXIT fi # libbpf-rs and libbpf-cargo transitively depend on libbpf 0.5.0, and # el8 ships 0.4.0. # # So we cheat: # - below-fix-metadata.diff (which is applied in %prep) # sets up all the other crates to be replaced with patched # versions under patched-crates/ # - below-patched-crates.patch contains the actual modifications of the patched # crates (mostly the edition downgrades, a few pins and a couple of build # fixes) # # We then build the vendored tarball as follows: # - unpack the below crate and vendor # - foreach patched crate, move it from vendor/ to patched-crates/ # - delete vendor/ as it's no longer needed, and so we can vendor again later # - apply the two patches, to fix the below metadata and the patched crates # - run vendor again, and then tar up *both* patched-crates/ and vendor/ tar xvzf "$tardir/$crate" -C "$workdir" (cd "${workdir}/${nv}" && cargo vendor) mkdir "${workdir}/${nv}/patched-crates" for c in below_derive below-common below-config below-dump below-model below-render below-store below-view cgroupfs fb_procfs libbpf-cargo libbpf-rs; do mv "${workdir}/${nv}/vendor/${c}" "${workdir}/${nv}/patched-crates/" done rm -r "${workdir}/${nv}/vendor" (cd "${workdir}/${nv}" && patch -p1 < ${tardir}/below-fix-metadata.diff) if [ -n "$PREPARE" ]; then echo "Go to ${workdir} and update the patch" exit 1 else (cd "${workdir}/${nv}" && \ ([ -f ${tardir}/below-patched-crates.patch ] && \ patch -p1 < ${tardir}/below-patched-crates.patch); \ cargo vendor && \ tar cvzf "${tardir}/${vendor_tarball}" patched-crates/ vendor/) fi exit 0