diff --git a/build_tools/make_linux_packages.sh b/build_tools/make_linux_packages.sh new file mode 100755 index 000000000..a2ebc86cd --- /dev/null +++ b/build_tools/make_linux_packages.sh @@ -0,0 +1,83 @@ +#!/bin/sh + +# This script takes a source tarball (from build_tools/make_tarball.sh) and a vendor tarball (from +# build_tools/make_vendor_tarball.sh, generated if not present), and produces: +# * Appropriately-named symlinks to look like a Debian package +# * Debian .changes and .dsc files with plain names ($version-1) and supported Ubuntu prefixes +# ($version-1~somedistro) +# * An RPM spec file +# By default, input and output files go in ~/fish_built, but this can be controlled with the +# FISH_ARTEFACT_PATH environment variable. + +{ + +set -e + +version=$1 +[ -n "$version" ] || { echo "Version number required as argument" >&2; exit 1; } + + +[ -n "$DEB_SIGN_KEYID$DEB_SIGN_KEYFILE" ] || + echo "Warning: neither DEB_SIGN_KEYID or DEB_SIGN_KEYFILE environment variables are set; you +will need a signing key for the author of the most recent debian/changelog entry." >&2 + +workpath=${FISH_ARTEFACT_PATH:-~/fish_built} +source_tarball="$workpath"/fish-"$version".tar.xz +vendor_tarball="$workpath"/fish-"$version"-vendor.tar.xz + +[ -e "$source_tarball" ] || { echo "Missing source tarball, expected at $source_tarball" >&2; exit 1; } +cd "$workpath" + +# Unpack the sources +tar xf "$source_tarball" +sourcepath="$workpath"/fish-"$version" + +# Generate the vendor tarball if it is not already present +[ -e "$vendor_tarball" ] || (cd "$sourcepath"; build_tools/make_vendor_tarball.sh;) + +# This step requires network access, so do it early in case it fails +# sh has no real array support +ubuntu_versions=$(uv run --script "$sourcepath"/build_tools/supported_ubuntu_versions.py) + +# Write the specfile +[ -e "$workpath"/fish.spec ] && { echo "Cowardly refusing to overwite an existing fish.spec" >&2; +exit 1; } +rpmversion=$(echo "$version" |sed -e 's/-/+/' -e 's/-/./g') +sed -e "s/@version@/$version/g" -e "s/@rpmversion@/$rpmversion/g" \ + < "$sourcepath"/fish.spec.in > "$workpath"/fish.spec + +# Make the symlinks for Debian +ln -s "$source_tarball" "$workpath"/fish_"$version".orig.tar.xz +ln -s "$vendor_tarball" "$workpath"/fish_"$version".orig-cargo-vendor.tar.xz + +# Set up the Debian source tree +cd "$sourcepath" +mkdir cargo-vendor +tar -C cargo-vendor -x -f "$vendor_tarball" +cp -r contrib/debian debian + +# The vendor tarball contains a new .cargo/config.toml, which has the +# vendoring overrides appended to it. dpkg-source will add this as a +# patch using the flags in debian/ +cp cargo-vendor/.cargo/config.toml .cargo/config.toml + +# Update the Debian changelog +# The release scripts do this for release builds - skip if it has already been done +if head -n1 debian/changelog | grep --invert-match --quiet --fixed-strings "$version"; then + debchange --newversion "$version-1" --distribution unstable "Snapshot build" +fi + +# Builds the "plain" Debian package +# debuild runs lintian, which takes ten minutes to run over the vendor directories +# just use dpkg-buildpackage directly +dpkg-buildpackage --build=source -d + +# Build the Ubuntu packages +# deb-reversion does not work on source packages, so do the whole thing ourselves +for series in $ubuntu_versions; do + sed -i -e "1 s/$version-1)/$version-1~$series)/" -e "1 s/unstable/$series/" debian/changelog + dpkg-buildpackage --build=source -d + sed -i -e "1 s/$version-1~$series)/$version-1)/" -e "1 s/$series/unstable/" debian/changelog +done + +}