changeset 91:ddfd13c43519

Aim to build an AppImage
author Chris Cannam
date Thu, 27 Feb 2020 12:58:36 +0000
parents 52d2358b2ccc
children e77b52b0ceeb
files .hgignore deploy/linux/AppRun deploy/linux/build-and-test.sh deploy/linux/build-docker.sh deploy/linux/deploy-appimage.sh deploy/linux/docker/Dockerfile.in deploy/linux/docker/Dockerfile_test.in
diffstat 7 files changed, 202 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Thu Feb 27 12:51:04 2020 +0000
+++ b/.hgignore	Thu Feb 27 12:58:36 2020 +0000
@@ -49,3 +49,4 @@
 Dockerfile.gen
 plugins.zip
 get-version
+output.tar
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/AppRun	Thu Feb 27 12:58:36 2020 +0000
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+mydir=$(dirname "$0")
+case "$mydir" in
+    /*) ;;
+    *) mydir="$PWD/$mydir";;
+esac
+
+echo "AppImage root is $mydir"
+
+PATH="$mydir/usr/bin:$mydir/bin:$PATH"
+export PATH
+
+LD_LIBRARY_PATH="$mydir/usr/lib:$mydir/usr/lib/x86_64-linux-gnu:$mydir/usr/lib64:$LD_LIBRARY_PATH"
+export LD_LIBRARY_PATH
+
+QT_PLUGIN_PATH="$mydir/usr/lib/qt5/plugins/:$mydir/usr/lib/x86_64-linux-gnu/qt5/plugins/:$mydir/usr/lib64/qt5/plugins/:$QT_PLUGIN_PATH"
+export QT_PLUGIN_PATH
+
+XDG_DATA_DIRS="$mydir/usr/share:$XDG_DATA_DIRS:/usr/local/share:/usr/share"
+export XDG_DATA_DIRS
+
+GSETTINGS_SCHEMA_DIR="$mydir/usr/share/glib-2.0/schemas:$GSETTINGS_SCHEMA_DIR"
+export GSETTINGS_SCHEMA_DIR
+
+exec "$mydir/usr/bin/vamp-plugin-pack-installer" "$@"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/build-and-test.sh	Thu Feb 27 12:58:36 2020 +0000
@@ -0,0 +1,46 @@
+#!/bin/bash
+#
+# Docker required
+
+set -eu
+
+current=$(hg id | awk '{ print $1; }')
+
+case "$current" in
+    *+) echo "ERROR: Current working copy has been modified - unmodified copy required so we know we can check it out separately and obtain the same contents"; exit 2;;
+    *);;
+esac
+
+echo
+echo "Building appimage from revision $current..."
+
+dockerdir=deploy/linux/docker
+
+cat "$dockerdir"/Dockerfile.in | \
+    perl -p -e "s/\[\[REVISION\]\]/$current/g" > \
+         "$dockerdir"/Dockerfile.gen
+
+cat "$dockerdir"/Dockerfile_test.in | \
+    perl -p -e "s/\[\[REVISION\]\]/$current/g" > \
+         "$dockerdir"/Dockerfile_test.gen
+
+fgrep 'hg.sr.ht' ~/.ssh/known_hosts > "$dockerdir"/known_hosts
+cp ~/.ssh/id_rsa_build "$dockerdir"/id_rsa_build
+chmod 600 "$dockerdir"/known_hosts "$dockerdir"/id_rsa_build
+trap "rm $dockerdir/known_hosts $dockerdir/id_rsa_build" 0
+
+dockertag="cannam/vamp-plugin-pack-installer-$current"
+
+sudo docker build -t "$dockertag" -f "$dockerdir"/Dockerfile.gen "$dockerdir"
+
+outdir="$dockerdir/output"
+mkdir -p "$outdir"
+
+container=$(sudo docker create "$dockertag")
+
+sudo docker cp "$container":output.tar "$outdir"
+sudo docker rm "$container"
+
+( cd "$outdir" ; tar xf output.tar && rm -f output.tar )
+
+sudo docker build -f "$dockerdir"/Dockerfile_test.gen "$dockerdir"
--- a/deploy/linux/build-docker.sh	Thu Feb 27 12:51:04 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#!/bin/bash
-#
-# Docker required
-
-set -eu
-
-current=$(hg id | awk '{ print $1; }')
-
-case "$current" in
-    *+) echo "ERROR: Current working copy has been modified - unmodified copy required so we know we can check it out separately and obtain the same contents"; exit 2;;
-    *);;
-esac
-
-echo
-echo "Building from revision $current..."
-
-dockerdir=deploy/linux/docker
-
-cat "$dockerdir"/Dockerfile.in | \
-    perl -p -e "s/\[\[REVISION\]\]/$current/g" > \
-         "$dockerdir"/Dockerfile.gen
-
-fgrep 'hg.sr.ht' ~/.ssh/known_hosts > "$dockerdir"/known_hosts
-cp ~/.ssh/id_rsa_build "$dockerdir"/id_rsa_build
-chmod 600 "$dockerdir"/known_hosts "$dockerdir"/id_rsa_build
-trap "rm $dockerdir/known_hosts $dockerdir/id_rsa_build" 0
-
-dockertag="cannam/vamp-plugin-pack-installer-$current"
-
-sudo docker build -t "$dockertag" -f "$dockerdir"/Dockerfile.gen "$dockerdir"
-
-outdir="$dockerdir/output"
-mkdir -p "$outdir"
-
-container=$(sudo docker create "$dockertag")
-
-sudo docker cp "$container":output.tar "$outdir"
-sudo docker rm "$container"
-
-( cd "$outdir" ; tar xf output.tar && rm -f output.tar )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/deploy-appimage.sh	Thu Feb 27 12:58:36 2020 +0000
@@ -0,0 +1,112 @@
+#!/bin/bash
+
+set -eu
+
+program=vamp-plugin-pack-installer
+
+get_id() {
+    if [ -d .hg ]; then
+        hg id | sed 's/[+ ].*$//'
+    elif [ -d .git ]; then
+        git rev-parse --short HEAD
+    else
+        echo "WARNING: can't figure out revision from VCS metadata" 1>&2
+        echo "unknown"
+    fi
+}
+
+version=$(get_id)
+
+targetdir="${program}.AppDir"
+
+echo "Target dir is $targetdir"
+
+if [ -d "$targetdir" ]; then
+    echo "Target directory exists, not overwriting"
+    exit
+fi
+
+mkdir "$targetdir"
+
+mkdir -p "$targetdir"/usr/bin
+mkdir -p "$targetdir"/usr/lib
+
+cp "$program" "$targetdir"/usr/bin/
+
+add_dependencies() {
+
+    local binary="$1"
+
+    echo "ldd $binary yields:"
+    ldd "$binary"
+    
+    for lib in $(ldd "$binary" | grep '=> [^ ]*/lib/' | \
+                     sed 's/^.*=> //' | sed 's/ .*$//'); do
+
+        base=$(basename "$lib")
+        if grep -v '^#' sv-dependency-builds/linux/appimage/excludelist |
+                grep -q "^$base$" ; then
+            echo "excluding: $lib"
+            continue
+        fi
+
+        target="$targetdir/usr/lib/$(basename $lib)"
+        
+        mkdir -p "$(dirname $target)"
+
+        if [ ! -f "$target" ]; then
+
+            cp -Lv "$lib" "$target"
+            chmod +x "$target"
+            
+            add_dependencies "$lib"
+            
+        fi
+    done
+}
+
+add_dependencies "$program"
+
+qtplugins="gif icns ico jpeg tga tiff wbmp webp cocoa minimal offscreen xcb"
+qtlibdirs="/usr/lib/x86_64-linux-gnu/qt5 /usr/lib/x86_64-linux-gnu/qt /usr/lib/qt5 /usr/lib/qt"
+
+QTDIR=${QTDIR:-}
+if [ -n "$QTDIR" ]; then
+    qtlibdirs="$QTDIR $qtlibdirs"
+fi
+
+for plug in $qtplugins; do
+    for libdir in $qtlibdirs; do
+        lib=$(find $libdir/plugins -name libq$plug.so -print 2>/dev/null || true)
+        if [ -n "$lib" ]; then
+            if [ -f "$lib" ]; then
+                subdir=$(basename $(dirname $lib))
+                if [ t"$subdir" = t"plugins" ]; then
+                    subdir=""
+                fi
+                target="$targetdir/usr/lib/qt5/plugins/$subdir/$(basename $lib)"
+                mkdir -p "$(dirname $target)"
+                cp -v "$lib" "$target"
+                chmod +x "$target"
+                add_dependencies "$lib"
+                break
+            fi
+        fi
+    done
+done
+
+cp "$program.desktop" "$targetdir/"
+
+cp "icons/scalable/sv-icon.svg" "$targetdir/"
+cp "icons/scalable/sv-icon.svg" "$targetdir/vamp-plugin-pack-installer.svg"
+
+cp "deploy/linux/AppRun" "$targetdir/"
+
+chmod +x "$targetdir/AppRun"
+
+# Do this with a separate extraction step, so as to make it work even
+# in situations where FUSE is unavailable like in a Docker container
+export ARCH=x86_64
+sv-dependency-builds/linux/appimage/appimagetool-x86_64.AppImage --appimage-extract
+./squashfs-root/AppRun "$targetdir" "VampPluginPackInstaller-$version-x86_64.AppImage"
+
--- a/deploy/linux/docker/Dockerfile.in	Thu Feb 27 12:51:04 2020 +0000
+++ b/deploy/linux/docker/Dockerfile.in	Thu Feb 27 12:58:36 2020 +0000
@@ -61,4 +61,5 @@
 RUN qmake -r
 RUN make -j3
 
-RUN tar cvf output.tar vamp-plugin-pack-installer && cp output.tar ..
+RUN deploy/linux/deploy-appimage.sh
+RUN tar cvf output.tar *.AppImage && cp output.tar ..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/docker/Dockerfile_test.in	Thu Feb 27 12:58:36 2020 +0000
@@ -0,0 +1,15 @@
+FROM centos:7
+
+# Ensure that everything subsequent is re-run when a new revision is
+# being built (rather than being cached) - so as to avoid potential
+# mismatches between results of yum update and the package dependency
+# installation itself
+RUN echo [[REVISION]]
+
+RUN yum -y update
+RUN yum -y groupinstall "X Window System"
+RUN yum -y install wget
+ADD output/VampPluginPackInstaller-[[REVISION]]-x86_64.AppImage Pack.AppImage
+RUN chmod +x Pack.AppImage
+RUN ./Pack.AppImage --appimage-extract
+RUN ./squashfs-root/AppRun --version