vdi-cloud/tools/build-usbredirect-private.sh

61 lines
2.8 KiB
Bash

#!/bin/sh
# Run on the Linux box as its build user. Download headers only; do not upgrade
# system GLib/libusb or overwrite the distribution's /usr/bin/usbredirect.
set -eu
build_root="${1:?usage: build-usbredirect-private.sh ABSOLUTE_NEW_BUILD_DIRECTORY}"
case "$build_root" in /*) ;; *) exit 2 ;; esac
mkdir "$build_root"
cd "$build_root"
mkdir headers
python3 - <<'PY'
import hashlib, pathlib, tarfile, urllib.request
url = 'https://www.spice-space.org/download/usbredir/usbredir-0.15.0.tar.xz'
data = urllib.request.urlopen(url, timeout=60).read()
expected = '6dc2a380277688a068191245dac2ab7063a552999d8ac3ad8e841c10ff050961'
if hashlib.sha256(data).hexdigest() != expected:
raise SystemExit('usbredir source checksum mismatch')
archive = pathlib.Path('usbredir-0.15.0.tar.xz')
archive.write_bytes(data)
with tarfile.open(archive) as tar:
base = pathlib.Path('.').resolve()
for item in tar.getmembers():
if not (base / item.name).resolve().is_relative_to(base) or item.issym() or item.islnk():
raise SystemExit('unexpected archive member')
tar.extractall('.')
PY
# apt validates package hashes from the configured repository metadata. These
# two development packages are extracted into this private directory only.
apt-get download libglib2.0-dev libusb-1.0-0-dev
for package in ./*.deb; do dpkg-deb -x "$package" headers; done
arch=$(cc -print-multiarch)
cat >config.h <<'EOF'
#define PACKAGE_STRING "usbredir 0.15.0"
#define PACKAGE_VERSION "0.15.0"
#define VERSION "0.15.0"
#define PACKAGE_BUGREPORT "https://gitlab.freedesktop.org/spice/usbredir/issues"
#define USBREDIR_VISIBLE __attribute__((visibility("default")))
EOF
source_dir="$build_root/usbredir-0.15.0"
# Static usbredir objects; GLib, libusb and libc remain the installed runtime.
cc -O2 -g -fstack-protector-strong -D_FORTIFY_SOURCE=2 -pthread \
-Wno-deprecated-declarations -I. \
-Iheaders/usr/include/glib-2.0 \
-I"headers/usr/lib/$arch/glib-2.0/include" \
-Iheaders/usr/include/gio-unix-2.0 -Iheaders/usr/include/libusb-1.0 \
-I"$source_dir/usbredirhost" -I"$source_dir/usbredirparser" \
"$source_dir/tools/usbredirect.c" "$source_dir/usbredirhost/usbredirhost.c" \
"$source_dir/usbredirparser/usbredirparser.c" "$source_dir/usbredirparser/usbredirfilter.c" \
"/usr/lib/$arch/libgio-2.0.so.0" "/usr/lib/$arch/libgobject-2.0.so.0" \
"/usr/lib/$arch/libglib-2.0.so.0" "/usr/lib/$arch/libusb-1.0.so.0" \
-o usbredirect
./usbredirect --help
for suite in filter serializer; do
cc -O2 -pthread -I. -Iheaders/usr/include/glib-2.0 \
-I"headers/usr/lib/$arch/glib-2.0/include" -I"$source_dir/usbredirparser" \
"$source_dir/tests/$suite.c" "$source_dir/usbredirparser/usbredirparser.c" \
"$source_dir/usbredirparser/usbredirfilter.c" \
"/usr/lib/$arch/libglib-2.0.so.0" -o "test-$suite"
"./test-$suite"
done
sha256sum usbredirect