New script to build a package from the source (.rpm, .deb).

This commit is contained in:
Andrew Wood
2024-12-07 01:26:44 +00:00
parent 499f8418bf
commit bb339ba519
2 changed files with 147 additions and 1 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ bin_PROGRAMS = pv
dist_doc_DATA = README.md docs/INSTALL docs/COPYING docs/NEWS.md docs/ACKNOWLEDGEMENTS.md docs/DEVELOPERS.md
dist_man1_MANS = docs/pv.1
EXTRA_DIST = docs/pv.1.md docs/benchmark.sh docs/test-on-vm-lab.sh
EXTRA_DIST = docs/pv.1.md docs/benchmark.sh docs/test-on-vm-lab.sh docs/build-package.sh
pv_SOURCES = \
src/main/debug.c \
+146
View File
@@ -0,0 +1,146 @@
#!/bin/sh
#
# Usage: sh build-package.sh source-1.2.3.tar.gz
#
# Given a tar.gz, build a package for the current OS.
#
# Supports these packaging types:
#
# .deb (Debian, Ubuntu, etc) - requires dpkg-dev, debhelper
# .rpm (AlmaLinux, Rocky Linux, OpenSUSE etc) - requires rpmbuild
#
# If the MAINTAINER environment variable is set, this is used as a GPG key
# ID for package signing.
#
# The packages built with this script are not "official", in that they are
# not part of any Linux distribution and may not follow the distribution's
# policies. Use at your own risk.
sourceArchive="$1"
test -n "${sourceArchive}" && test -f "${sourceArchive}" \
|| { printf "%s: %s: %s\n" "${0##*/}" "${sourceArchive}" "source archive not found" 1>&2; exit 1; }
packageName="pv"
packageSummary="Shell pipeline element to meter data passing through"
packageDescription="\
pv (Pipe Viewer) can be inserted into any normal pipeline between two
processes to give a visual indication of how quickly data is passing
through, how long it has taken, how near to completion it is, and an
estimate of how long it will be until completion."
packageUrl="https://www.ivarch.com/programs/pv.shtml"
sourceUrl="https://www.ivarch.com/programs/sources/${packageName}-%{version}.tar.gz"
packageEmail="Andrew Wood <pv@ivarch.com>"
workDir="$(mktemp -d)" || exit 1
trap 'rm -rf "${workDir}"' EXIT
# Infer the version from the most recent NEWS entry.
version="$(tar xzf "${sourceArchive}" --wildcards -O '*/docs/NEWS.md' 2>/dev/null | awk '/^### [0-9]/{print $2}' | sed -n 1p)"
if command -v rpmbuild >/dev/null 2>&1; then
# Build an RPM.
cat > "${workDir}"/spec <<EOF
Summary: ${packageSummary}
Name: ${packageName}
Version: ${version}
Release: 1%{?dist}
License: GPLv3+
Source: ${sourceUrl}
Url: ${packageUrl}
%description
${packageDescription}
%prep
%setup -q
%build
%configure
make %{?_smp_mflags}
%install
test -n "\${RPM_BUILD_ROOT}" && test "\${RPM_BUILD_ROOT}" != '/' && rm -rf "\${RPM_BUILD_ROOT}"
make install DESTDIR="\${RPM_BUILD_ROOT}"
rm -rf "\${RPM_BUILD_ROOT}/usr/share/doc"
%find_lang %{name}
%check
make check
%clean
test -n "\${RPM_BUILD_ROOT}" && test "\${RPM_BUILD_ROOT}" != '/' && rm -rf "\${RPM_BUILD_ROOT}"
%files -f %{name}.lang
%defattr(-, root, root)
%{_bindir}/*
%{_mandir}/man1/*
%doc README.md docs/NEWS.md docs/ACKNOWLEDGEMENTS.md docs/COPYING
%changelog
* $(date '+%a %b %d %Y') ${packageEmail} - ${version}-1
- Package built from main source.
EOF
mkdir "${workDir}/SOURCES"
cp "${sourceArchive}" "${workDir}/SOURCES/${packageName}-${version}.tar.gz"
rpmbuild -D "%_topdir ${workDir}" -bb "${workDir}/spec" || exit 1
if test -n "${MAINTAINER}"; then
# Sign the RPMs.
rpm -D "%_gpg_name ${MAINTAINER}" --addsign "${workDir}/RPMS"/*/*.rpm || exit 1
fi
cp -v "${workDir}/RPMS"/*/*.rpm .
fi
if command -v dpkg-buildpackage >/dev/null 2>&1; then
# Build a Debian package.
mkdir "${workDir}/build" "${workDir}/build/debian" "${workDir}/build/debian/source"
tar xzf "${sourceArchive}" -C "${workDir}/build" --strip-components=1
printf "%s\n" "10" > "${workDir}/build/debian/compat"
touch "${workDir}/build/debian/copyright"
printf "%s\n" "3.0 (quilt)" > "${workDir}/build/debian/source/format"
cat > "${workDir}/build/debian/rules" <<EOF
#!/usr/bin/make -f
export DH_VERBOSE = 1
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
%:
dh \$@
EOF
chmod 700 "${workDir}/build/debian/rules"
cat > "${workDir}/build/debian/control" <<EOF
Source: ${packageName}
Maintainer: ${packageEmail}
Section: misc
Priority: optional
Standards-Version: 3.9.2
Build-Depends: debhelper (>= 9)
Package: ${packageName}
Architecture: any
Depends: \${misc:Depends}
Description: ${packageSummary}
$(printf "%s\n.\n" "${packageDescription}" | sed 's,^, ,')
EOF
cat > "${workDir}/build/debian/changelog" <<EOF
${packageName} (${version}-1) UNRELEASED; urgency=low
* Package built from main source.
-- ${packageEmail} $(date -R)
EOF
if test -n "${MAINTAINER}"; then
(cd "${workDir}/build" && dpkg-buildpackage --build=binary --force-sign --sign-keyid="${MAINTAINER}") || exit 1
else
(cd "${workDir}/build" && dpkg-buildpackage --build=binary) || exit 1
fi
cp -v "${workDir}"/*.deb . || exit 1
fi