From cd2a013ccfffdc45f3674c79d5992475570480ca Mon Sep 17 00:00:00 2001 From: Kevin Mittman <kmittman@nvidia.com> Date: Mon, 15 Aug 2022 11:25:59 -0700 Subject: [PATCH] Add Debian package example Signed-off-by: Kevin Mittman <kmittman@nvidia.com> --- debian/Makefile | 44 +++++++ debian/example/debian/compat | 1 + debian/example/debian/rules | 62 +++++++++ debian/example/debian/source/format | 1 + debian/example/debian/templates/changelog.in | 5 + debian/example/debian/templates/control.in | 10 ++ .../debian/templates/example.install.in | 0 debian/meta/stubrepo-debian.sh | 118 ++++++++++++++++++ 8 files changed, 241 insertions(+) create mode 100644 debian/Makefile create mode 100644 debian/example/debian/compat create mode 100755 debian/example/debian/rules create mode 100644 debian/example/debian/source/format create mode 100644 debian/example/debian/templates/changelog.in create mode 100644 debian/example/debian/templates/control.in create mode 100644 debian/example/debian/templates/example.install.in create mode 100755 debian/meta/stubrepo-debian.sh diff --git a/debian/Makefile b/debian/Makefile new file mode 100644 index 0000000..ced2500 --- /dev/null +++ b/debian/Makefile @@ -0,0 +1,44 @@ +PWD = $(shell pwd) +VERSION = 1.0-1 +GPG_HEADLESS = --openpgp --decrypt --no-auto-check-trustdb --batch --no-tty --status-fd 1 + +DEB_ROOT = example +DEB_ARCH = all +IN_FILES = $(wildcard $(DEB_ROOT)/debian/templates/*.install.in) +DEB_PACKAGE = $(join $(addsuffix ../../, $(dir $(IN_FILES))), $(notdir $(IN_FILES:.install.in=_$(VERSION)_$(DEB_ARCH).deb))) + +META_ROOT = meta + +default: all + +$(DEB_PACKAGE): $(IN_FILES) + cd $(DEB_ROOT)/; make -f debian/rules fill_templates VERSION=1.0 + cd $(DEB_ROOT)/; dpkg-buildpackage -b -us -uc + mv *.deb *.buildinfo *.changes $(DEB_ROOT)/ + cd $(DEB_ROOT)/; rm -rf debian/`basename $< | cut -d. -f1` + +all: $(DEB_PACKAGE) Release trash + @for deb in $(DEB_PACKAGE); do ar -p "$(DEB_PACKAGE)" _gpgbuilder 2>&1 | GNUPGHOME=/dev/null gpg $GPG_HEADLESS 2>&1 | grep -q "[GNUPG:\] NO_PUBKEY" || echo "UNSIGNED `basename $(DEB_PACKAGE)`"; done + @#ls -1 $(META_DATA) + +debian: $(DEB_PACKAGE) + +Release: $(DEB_PACKAGE) + @for pkg in $(DEB_PACKAGE); do deb=`readlink -m $$pkg`; ln -s -f $$deb $(META_ROOT)/`basename $$deb`; done + cd $(META_ROOT); ./stubrepo-debian.sh *.deb + +meta: Release + +trash: + cd $(DEB_ROOT)/; rm -f *.changes *.buildinfo + cd $(DEB_ROOT)/; rm -f debian/changelog debian/control debian/*.log debian/*.install debian/*.substvars debian/files + cd $(DEB_ROOT)/; rm -rf debian/example debian/.debhelper + +clean: trash + rm -f $(META_ROOT)/Packages $(META_ROOT)/Packages.gz + rm -f $(META_ROOT)/Release + rm -f $(META_ROOT)/Release.gpg $(META_ROOT)/InRelease + rm -f $(META_ROOT)/*.deb + rm -f $(DEB_ROOT)/*.deb + +.PHONY: all default debian meta trash clean diff --git a/debian/example/debian/compat b/debian/example/debian/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/debian/example/debian/compat @@ -0,0 +1 @@ +9 diff --git a/debian/example/debian/rules b/debian/example/debian/rules new file mode 100755 index 0000000..bc95526 --- /dev/null +++ b/debian/example/debian/rules @@ -0,0 +1,62 @@ +#!/usr/bin/make -f +DH_VERBOSE := 1 + +VERSION ?= 999 +BRANCH ?= 999 +REVISION ?= 1 +TIMESTAMP := $(shell date -R) + +%: + dh $@ + +fill_templates: + for template in debian/templates/*.in; do \ + dest=`echo $$template | \ + sed -e "s|\.in\$$||" \ + -e "s|templates\/||" \ + -e "s|BRANCH|$(BRANCH)|"`; \ + sed -e "s|#VERSION#|$(VERSION)|g" \ + -e "s|#BRANCH#|$(BRANCH)|g" \ + -e "s|#SONAME#|$(SONAME)|g" \ + -e "s|#REVISION#|$(REVISION)|g" \ + -e "s|#TIMESTAMP#|$(TIMESTAMP)|g" \ + -e "s|#DEBLIBINSTDIR#|$(DEBLIBINSTDIR)|g" \ + $$template > $$dest; \ + done + +override_dh_clean: + dh_clean + +override_dh_auto_clean: + date + +override_dh_auto_build: + rm -f lib*.so + +override_signfile: + cal + +override_dh_auto_install: + dh_install --exclude=none --fail-missing + +override_dh_makeshlibs: + DEB_BUILD_GNU_TYPE=$(DEB_HOST_GNU_TYPE) dh_makeshlibs + +# +# Turn off a few of the debhelper scripts +# +override_dh_usrlocal: + +override_dh_strip: + +override_dh_strip_nondeterminism: + +# +# Disable dh_shlibdeps to allow packaging to run on systems which aren't +# the same architecture we're packaging for. +# +override_dh_shlibdeps: + +ifneq ($(DISABLE_FIXPERMS),) +override_dh_fixperms: +endif diff --git a/debian/example/debian/source/format b/debian/example/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/example/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian/example/debian/templates/changelog.in b/debian/example/debian/templates/changelog.in new file mode 100644 index 0000000..14db62f --- /dev/null +++ b/debian/example/debian/templates/changelog.in @@ -0,0 +1,5 @@ +example (#VERSION#-#REVISION#) stable; urgency=low + + * Example Debian package build + + -- maintainer <maintainer@example.com> #TIMESTAMP# diff --git a/debian/example/debian/templates/control.in b/debian/example/debian/templates/control.in new file mode 100644 index 0000000..f7a10c8 --- /dev/null +++ b/debian/example/debian/templates/control.in @@ -0,0 +1,10 @@ +Source: example +Maintainer: maintainer <maintainer@example.com> +Section: multiverse/devel +Priority: optional +Standards-Version: 3.8.0 + +Package: example +Architecture: all +Depends: ${misc:Depends} +Description: Example package for test of Debian package signing diff --git a/debian/example/debian/templates/example.install.in b/debian/example/debian/templates/example.install.in new file mode 100644 index 0000000..e69de29 diff --git a/debian/meta/stubrepo-debian.sh b/debian/meta/stubrepo-debian.sh new file mode 100755 index 0000000..61aa8f8 --- /dev/null +++ b/debian/meta/stubrepo-debian.sh @@ -0,0 +1,118 @@ +#!/bin/bash + +repo_origin="EXAMPLE" +repo_label="Unstable" +pkg_arch="all" +pkg_date=$(date -R -u) + +err() { echo "ERROR: $*"; exit 1; } + +find_tag() { + local index=0 + for key in ${pkg_tags[@]}; do + if [[ "$key" == "null" ]]; then + pkg_tags[$index]="null" + elif [[ "$key" == "$1" ]] || [[ -z "$1" ]]; then + value=$(dpkg-deb --field "$filename" "$key") + echo "$key: $value" + pkg_tags[$index]="null" + fi + index=$((index+1)) + done +} + +deb_pkg_info() { + [[ -f "$1" ]] || err "deb_pkg_info() file $1 not found" + + # Calculate some values + pkg_size=$(du -b "$1" 2>/dev/null | awk '{print $1}') + pkg_md5=$(md5sum "$1" 2>/dev/null | awk '{print $1}') + pkg_sha1=$(sha1sum "$1" 2>/dev/null | awk '{print $1}') + pkg_sha256=$(sha256sum "$1" 2>/dev/null | awk '{print $1}') + pkg_sha512=$(sha512sum "$1" 2>/dev/null | awk '{print $1}') + + # Order matters + filename="$1" + pkg_tags=($(dpkg --info "$filename" | sed 's/^ //' | grep -E "^[A-Za-z-]+:" | awk -F ":" '{print $1}')) + taglist="Package Version Architecture Multi-Arch Priority Section Source Origin Maintainer Original-Maintainer" + taglist+="Bugs Installed-Size Provides Depends Recommends Suggests Conflicts Breaks Replaces" + for tag in $taglist; do + find_tag $tag + done + + # Append calculated values + echo "Filename: ./$1" + echo "Size: $pkg_size" + echo "MD5sum: $pkg_md5" + echo "SHA1: $pkg_sha1" + echo "SHA256: $pkg_sha256" + echo "SHA512: $pkg_sha512" + + # Append package description + find_tag "Homepage" + find_tag "Description" + + # Anything leftover + find_tag +} + +deb_metadata() +{ + local Packages="$1" + [[ -f "$Packages" ]] || err "Packages file not found" + + # Compress manifest + gzip -c -9 -f $Packages > ${Packages}.gz + echo ":: ${Packages}.gz" + [[ -f "Packages.gz" ]] || err "Packages.gz file not found" + + # Calculate hashes + txt_bytes=$(wc --bytes Packages | awk '{print $1}') + txt_md5=$(md5sum Packages | awk '{print $1}') + txt_sha1=$(sha1sum Packages | awk '{print $1}') + txt_sha256=$(sha256sum Packages | awk '{print $1}') + + gz_bytes=$(wc --bytes Packages.gz | awk '{print $1}') + gz_md5=$(md5sum Packages.gz | awk '{print $1}') + gz_sha1=$(sha1sum Packages.gz | awk '{print $1}') + gz_sha256=$(sha256sum Packages.gz | awk '{print $1}') + + # Build checksum file + pkg_arch=$(basename "$subpath") + pkg_date=$(date -R -u) + + { + echo "Origin: ${repo_origin}" + echo "Label: ${repo_label}" + echo "Architecture: ${pkg_arch}" + echo "Date: ${pkg_date}" + echo "MD5Sum:" + printf " %s %48d %s\n" $txt_md5 $txt_bytes Packages + printf " %s %48d %s\n" $gz_md5 $gz_bytes Packages.gz + echo "SHA1:" + printf " %s %40d %s\n" $txt_sha1 $txt_bytes Packages + printf " %s %40d %s\n" $gz_sha1 $gz_bytes Packages.gz + echo "SHA256:" + printf " %s %16d %s\n" $txt_sha256 $txt_bytes Packages + printf " %s %16d %s\n" $gz_sha256 $gz_bytes Packages.gz + + # FIXME prevent hash mismatch error + echo "Acquire-By-Hash: no" + } > "Release" +} + +if [[ -z $1 ]] || [[ ! -f $1 ]]; then + err "USAGE: $0 [*.deb]" +fi + +if [[ ! -f "Package" ]]; then + for package in $@; do + deb_pkg_info "$package" >> Packages + done +fi + +if [[ ! -f "Release" ]]; then + deb_metadata "Packages" +fi + +### END ### -- GitLab