mirror of
https://github.com/outbackdingo/UltraGrid.git
synced 2026-03-20 11:40:08 +00:00
The size is only some 90 kB when compressed so it is perhaps not worth downloading from external source and depend on it. It could be even bundled directly, not by CI. Now it is actually the case in Linux (create-appimage.sh) but it is also possible for other platforms.
188 lines
6.6 KiB
Bash
Executable File
188 lines
6.6 KiB
Bash
Executable File
#!/bin/sh -eux
|
|
##
|
|
## Creates UltraGrid AppImage
|
|
##
|
|
## @param $1 (optional) zsync URL - location used for AppImage updater
|
|
## @env $appimage_key (optional) signing key
|
|
## @returns name of created AppImage
|
|
|
|
APPDIR=UltraGrid.AppDir
|
|
APPPREFIX=$APPDIR/usr
|
|
eval "$(grep 'srcdir *=' < Makefile | tr -d \ )"
|
|
|
|
umask 022
|
|
|
|
# soft fail - fail in CI, otherwise continue
|
|
handle_error() {
|
|
echo "$1" >&2
|
|
if [ -n "${GITHUB_REPOSITORY:-}" ]; then
|
|
exit 2
|
|
fi
|
|
}
|
|
|
|
mkdir tmpinstall $APPDIR
|
|
make DESTDIR=tmpinstall install
|
|
mv tmpinstall/usr/local $APPPREFIX
|
|
|
|
# add packet reflector
|
|
make -f "${srcdir?srcdir not found}/hd-rum-multi/Makefile" "SRCDIR=$srcdir/hd-rum-multi"
|
|
cp hd-rum $APPPREFIX/bin
|
|
make -C "$srcdir/tools" convert
|
|
cp "$srcdir/tools/convert" $APPPREFIX/bin
|
|
|
|
# add platform and other Qt plugins if using dynamic libs
|
|
# @todo copy only needed ones
|
|
# @todo use https://github.com/probonopd/linuxdeployqt
|
|
PLUGIN_LIBS=
|
|
QT_DIR=
|
|
QT_VER=
|
|
if [ -f $APPPREFIX/bin/uv-qt ]; then
|
|
QT_LDD_DEP=$(ldd $APPPREFIX/bin/uv-qt | grep Qt.Gui | grep -v 'not found')
|
|
QT_DIR=$(echo "$QT_LDD_DEP" | awk '{ print $3 }')
|
|
QT_DIR=$(dirname "$QT_DIR")
|
|
QT_VER=$(echo "$QT_LDD_DEP" | awk '{ print $1 }' | sed 's/.*Qt\([0-9]\)Gui.*/\1/g')
|
|
fi
|
|
if [ -n "$QT_DIR" ]; then
|
|
QT_PLUGIN_PREFIX=$QT_DIR/qt$QT_VER
|
|
SRC_PLUGIN_DIR=$QT_PLUGIN_PREFIX/plugins
|
|
DST_PLUGIN_DIR=$APPPREFIX/lib/$(basename "$QT_PLUGIN_PREFIX")/plugins
|
|
mkdir -p "$DST_PLUGIN_DIR"
|
|
cp -r "$SRC_PLUGIN_DIR"/* "$DST_PLUGIN_DIR"
|
|
PLUGIN_LIBS=$(find "$DST_PLUGIN_DIR" -type f)
|
|
fi
|
|
|
|
add_fonts() { # for GUI+testcard2
|
|
if ! command -v fc-match >/dev/null; then
|
|
handle_error "fc-match not found, not copying fonts!"
|
|
return
|
|
fi
|
|
# add DejaVu font
|
|
mkdir $APPPREFIX/share/fonts
|
|
for family in "DejaVu Sans" "DejaVu Sans Mono"; do
|
|
for style in "Book" "Bold"; do
|
|
FONT_PATH=$(fc-match "$family:style=$style" file | sed 's/.*=//')
|
|
cp "$FONT_PATH" $APPPREFIX/share/fonts
|
|
done
|
|
done
|
|
if ls $APPPREFIX/lib/*mixer* >/dev/null 2>&1; then
|
|
mkdir -p $APPPREFIX/share/soundfonts
|
|
sf=${SDL_SOUNDFONTS:-$srcdir/data/default.sf3}
|
|
cp "$sf" $APPPREFIX/share/soundfonts/default."${sf##*.}"
|
|
fi
|
|
}
|
|
|
|
# copy dependencies
|
|
mkdir -p $APPPREFIX/lib
|
|
for n in "$APPPREFIX"/bin/* "$APPPREFIX"/lib/ultragrid/* $PLUGIN_LIBS; do
|
|
for lib in $(ldd "$n" | awk '{ print $3 }'); do
|
|
[ ! -f "$lib" ] && continue
|
|
DST_NAME=$APPPREFIX/lib/$(basename "$lib")
|
|
[ -f "$DST_NAME" ] && continue
|
|
cp "$lib" $APPPREFIX/lib
|
|
done
|
|
done
|
|
|
|
# hide Wayland libraries
|
|
if ls $APPPREFIX/lib/libwayland-* >/dev/null 2>&1; then
|
|
mkdir $APPPREFIX/lib/wayland
|
|
mv $APPPREFIX/lib/libwayland-* $APPPREFIX/lib/wayland
|
|
fi
|
|
|
|
add_fonts
|
|
|
|
if command -v wget >/dev/null && wget -V | grep -q https; then
|
|
dl() {
|
|
wget -O - ${GITHUB_TOKEN+--header "Authorization: token $GITHUB_TOKEN"} "$1"
|
|
}
|
|
elif command -v curl >/dev/null; then
|
|
dl() {
|
|
curl --fail -sSL ${GITHUB_TOKEN+-H "Authorization: token $GITHUB_TOKEN"} "$1"
|
|
}
|
|
else
|
|
echo "Neither wget nor curl was found - if one needed later, it will " \
|
|
"fail!" >&2
|
|
fi
|
|
|
|
# Remove libraries that should not be bundled, see https://gitlab.com/probono/platformissues
|
|
[ -f excludelist ] || dl https://raw.githubusercontent.com/probonopd/AppImages/master/excludelist > excludelist || exit 1
|
|
DIRNAME=$(dirname "$0")
|
|
uname_m=$(uname -m)
|
|
excl_list_arch=x86
|
|
if expr "$uname_m" : arm >/dev/null || expr "uname_m" : aarch64 > /dev/null; then
|
|
excl_list_arch=arm
|
|
fi
|
|
cat "$DIRNAME/excludelist.local.$excl_list_arch" >> excludelist
|
|
EXCLUDE_LIST=
|
|
while read -r x; do
|
|
if [ -z "$x" ] || expr "x$x" : x\# > /dev/null; then
|
|
continue
|
|
fi
|
|
NAME=$(echo "$x" | awk '{ print $1 }')
|
|
EXCLUDE_LIST="$EXCLUDE_LIST $NAME"
|
|
done < excludelist
|
|
for n in $EXCLUDE_LIST; do
|
|
if [ "$n" = libjack.so.0 ]; then # JACK is currently handled in AppRun
|
|
continue
|
|
fi
|
|
if [ -f "$APPPREFIX/lib/$n" ]; then
|
|
rm "$APPPREFIX/lib/$n"
|
|
fi
|
|
done
|
|
|
|
( cd $APPPREFIX/lib; rm -f libcmpto* ) # remove non-free components
|
|
|
|
# ship VA-API drivers if have libva
|
|
if [ -f "$(echo $APPPREFIX/lib/libva.so.* | cut -d\ -f 1)" ]; then
|
|
for n in ${LIBVA_DRIVERS_PATH:-} /usr/lib/x86_64-linux-gnu/dri /usr/lib/dri; do
|
|
if [ -d "$n" ]; then
|
|
cp -r "$n" $APPPREFIX/lib/va
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
cp -r "$srcdir/data/scripts/Linux-AppImage/AppRun" "$srcdir/data/scripts/Linux-AppImage/scripts" "$srcdir/data/ultragrid.png" $APPDIR
|
|
cp "$srcdir/data/uv-qt.desktop" $APPDIR/cz.cesnet.ultragrid.desktop
|
|
appimageupdatetool=$(command -v appimageupdatetool-x86_64.AppImage || command -v ./appimageupdatetool || true)
|
|
if [ -z "$appimageupdatetool" ]; then
|
|
appimageupdatetool=./appimageupdatetool
|
|
dl https://github.com/AppImage/AppImageUpdate/releases/download/continuous/appimageupdatetool-x86_64.AppImage > $appimageupdatetool # use AppImageUpdate for GUI updater
|
|
fi
|
|
cp "$appimageupdatetool" $APPDIR/appimageupdatetool
|
|
chmod ugo+x $APPDIR/appimageupdatetool
|
|
if [ -f /lib/x86_64-linux-gnu/libfuse.so.2 ]; then
|
|
mkdir $APPDIR/appimageupdatetool-lib
|
|
cp /lib/x86_64-linux-gnu/libfuse.so.2 $APPDIR/appimageupdatetool-lib
|
|
fi
|
|
|
|
GIT_ROOT=$(git rev-parse --show-toplevel || true)
|
|
if [ -n "${appimage_key-}" ] && [ -n "${GIT_ROOT-}" ]; then
|
|
echo "$appimage_key" >> "$GIT_ROOT/pubkey.asc"
|
|
fi
|
|
|
|
mkappimage=$(command -v ./mkappimage || command -v mkappimage-x86_64.AppImage || command -v mkappimage || true)
|
|
if [ -z "$mkappimage" ]; then
|
|
mkai_url=$(dl https://api.github.com/repos/probonopd/go-appimage/releases/tags/continuous | grep "browser_download_url.*mkappimage-.*-x86_64.AppImage" | head -n 1 | cut -d '"' -f 4)
|
|
dl "$mkai_url" > mkappimage
|
|
chmod +x mkappimage
|
|
mkappimage=./mkappimage
|
|
fi
|
|
if "$mkappimage" 2>&1 | grep fuse; then
|
|
if [ ! -d mkappimage-extracted ]; then
|
|
"$mkappimage" --appimage-extract
|
|
mv squashfs-root mkappimage-extracted
|
|
fi
|
|
mkappimage="mkappimage-extracted/AppRun"
|
|
fi
|
|
|
|
UPDATE_INFORMATION=
|
|
if [ $# -ge 1 ]; then
|
|
UPDATE_INFORMATION="-u zsync|$1"
|
|
fi
|
|
# shellcheck disable=SC1007,SC2086 # word spliting of
|
|
# $UPDATE_INFORMATION is a requested behavior
|
|
GITHUB_TOKEN= $mkappimage $UPDATE_INFORMATION $APPDIR
|
|
|
|
rm -rf $APPDIR tmpinstall
|
|
|