#!/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