changeset 612:40cc49380398

First crack at AppImage build
author Chris Cannam
date Thu, 10 Oct 2019 11:48:34 +0100
parents 08859cbcd879
children 714ca9f0a432
files .hgignore deploy/linux/AppRun deploy/linux/build-and-test-appimage.sh deploy/linux/deploy-appimage.sh deploy/linux/docker/32/Dockerfile deploy/linux/docker/64/Dockerfile deploy/linux/docker/Dockerfile_appimage.in deploy/linux/docker/Dockerfile_test_appimage.in
diffstat 8 files changed, 282 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Thu Oct 10 10:46:44 2019 +0100
+++ b/.hgignore	Thu Oct 10 11:48:34 2019 +0100
@@ -50,3 +50,5 @@
 *.dylib
 test-svcore-*
 *.dmg
+Dockerfile*.gen
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/AppRun	Thu Oct 10 11:48:34 2019 +0100
@@ -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/sonic-lineup" "$@"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/build-and-test-appimage.sh	Thu Oct 10 11:48:34 2019 +0100
@@ -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_appimage.in | \
+    perl -p -e "s/\[\[REVISION\]\]/$current/g" > \
+         "$dockerdir"/Dockerfile_appimage.gen
+
+cat "$dockerdir"/Dockerfile_test_appimage.in | \
+    perl -p -e "s/\[\[REVISION\]\]/$current/g" > \
+         "$dockerdir"/Dockerfile_test_appimage.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/tony-appimage-$current"
+
+sudo docker build -t "$dockertag" -f "$dockerdir"/Dockerfile_appimage.gen "$dockerdir"
+
+outdir="$dockerdir/output"
+mkdir -p "$outdir"
+
+container=$(sudo docker create "$dockertag")
+
+sudo docker cp "$container":output-appimage.tar "$outdir"
+sudo docker rm "$container"
+
+( cd "$outdir" ; tar xf output-appimage.tar && rm -f output-appimage.tar )
+
+sudo docker build -f "$dockerdir"/Dockerfile_test_appimage.gen "$dockerdir"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/deploy-appimage.sh	Thu Oct 10 11:48:34 2019 +0100
@@ -0,0 +1,123 @@
+#!/bin/bash
+
+set -eu
+
+program=tony
+plugins="chp pyin"
+
+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/"$program"
+
+cp "$program" "$targetdir"/usr/bin/
+
+for p in $plugins ; do
+    cp "$p.so" "$targetdir"/usr/lib/"$program"/
+done
+
+ldd /usr/lib/x86_64-linux-gnu/libpulse.so.0 || true
+
+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"
+add_dependencies "$checker"
+
+for p in $plugins ; do
+    add_dependencies "$p.so"
+done
+
+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/$program-icon.svg" "$targetdir/$program.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" "Tony-$version-x86_64.AppImage"
+
--- a/deploy/linux/docker/32/Dockerfile	Thu Oct 10 10:46:44 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-FROM 32bit/ubuntu:14.04
-MAINTAINER Chris Cannam <cannam@all-day-breakfast.com>
-RUN apt-get update && apt-get install -y \
-    build-essential \
-    mercurial \
-    qtbase5-dev qt5-default \
-    libsndfile1-dev libsamplerate0-dev \
-    libfftw3-dev \
-    libbz2-dev \
-    libjack-dev libjack0 libpulse-dev \
-    libmad0-dev libid3tag0-dev \
-    liboggz2-dev libfishsound1-dev \
-    libasound2-dev \
-    liblo-dev liblrdf0-dev libsord-dev libserd-dev \
-    vamp-plugin-sdk librubberband-dev \
-    libboost-dev libboost-test-dev \
-    lintian \
-    w3m
-RUN hg clone -u v1.0-linuxbuild https://code.soundsoftware.ac.uk/hg/tony /opt/tony
-WORKDIR /opt/tony
-RUN ./configure && make
-RUN make -C chp -f Makefile.linux
-RUN make -C pyin -f Makefile.linux64
-RUN bash deploy/linux/deploy-deb.sh 1.0cc1-1 i386
--- a/deploy/linux/docker/64/Dockerfile	Thu Oct 10 10:46:44 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-FROM ubuntu:14.04
-MAINTAINER Chris Cannam <cannam@all-day-breakfast.com>
-RUN apt-get update && apt-get install -y \
-    build-essential \
-    mercurial \
-    qtbase5-dev qt5-default \
-    libsndfile1-dev libsamplerate0-dev \
-    libfftw3-dev \
-    libbz2-dev \
-    libjack-dev libjack0 libpulse-dev \
-    libmad0-dev libid3tag0-dev \
-    liboggz2-dev libfishsound1-dev \
-    libasound2-dev \
-    liblo-dev liblrdf0-dev libsord-dev libserd-dev \
-    vamp-plugin-sdk librubberband-dev \
-    libboost-dev libboost-test-dev \
-    lintian \
-    w3m
-RUN hg clone -u v1.0-linuxbuild https://code.soundsoftware.ac.uk/hg/tony /opt/tony
-WORKDIR /opt/tony
-RUN ./configure && make
-RUN make -C chp -f Makefile.linux
-RUN make -C pyin -f Makefile.linux64
-RUN bash deploy/linux/deploy-deb.sh 1.0cc1-1 amd64
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/docker/Dockerfile_appimage.in	Thu Oct 10 11:48:34 2019 +0100
@@ -0,0 +1,70 @@
+FROM ubuntu:14.04
+MAINTAINER Chris Cannam <cannam@all-day-breakfast.com>
+RUN apt-get update && \
+    apt-get install -y \
+    software-properties-common \
+    build-essential \
+    libbz2-dev \
+    libfftw3-dev \
+    libfishsound1-dev \
+    libid3tag0-dev \
+    liblo-dev \
+    liblrdf0-dev \
+    libmad0-dev \
+    liboggz2-dev \
+    libopus-dev \
+    libopusfile-dev \
+    libpulse-dev \
+    libasound2-dev \
+    libjack-dev \
+    libsamplerate-dev \
+    libsndfile-dev \
+    libsord-dev \
+    libxml2-utils \
+    libboost-all-dev \
+    libgl1-mesa-dev \
+    raptor-utils \
+    librubberband-dev \
+    git \
+    mercurial \
+    curl wget \
+    mlton \
+    autoconf automake libtool lintian
+
+# NB we do not install portaudio. We don't want to end up including it
+# in the bundle, because it comes with a dependency on the JACK
+# library which we don't want to bundle and can't assume people will
+# have. However, we do install JACK because the Dynamic JACK mechanism
+# should ensure we can detect, configure, and use that without
+# actually linking against it. We also have Pulse as the default I/O.
+
+RUN apt-add-repository -y ppa:beineri/opt-qt-5.10.1-trusty
+RUN apt-get update && \
+    apt-get install -y \
+    qt510base \
+    qt510svg
+RUN apt-get clean && rm -rf /var/lib/apt/lists/*
+
+RUN locale-gen en_US.UTF-8
+ENV LANG en_US.UTF-8  
+ENV LANGUAGE en_US:en  
+ENV LC_ALL en_US.UTF-8
+
+RUN hg clone -r[[REVISION]] https://code.soundsoftware.ac.uk/hg/tony
+
+WORKDIR /root
+
+COPY id_rsa_build .ssh/id_rsa_build
+COPY known_hosts .ssh/known_hosts
+RUN chmod 600 .ssh/id_rsa_build .ssh/known_hosts
+RUN echo '{"accounts": {"sourcehut": "~breakfastquay"}}' > .repoint.json
+RUN ( echo '[ui]' ; echo 'ssh = ssh -i /root/.ssh/id_rsa_build' ) > .hgrc
+
+WORKDIR /tony
+ENV QTDIR /opt/qt510
+ENV PATH /opt/qt510/bin:$PATH
+RUN ./configure
+RUN make -j3
+
+RUN deploy/linux/deploy-appimage.sh
+RUN tar cvf output-appimage.tar *.AppImage && cp output-appimage.tar ..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/docker/Dockerfile_test_appimage.in	Thu Oct 10 11:48:34 2019 +0100
@@ -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/Tony-[[REVISION]]-x86_64.AppImage Tony.AppImage
+RUN chmod +x Tony.AppImage
+RUN ./Tony.AppImage --appimage-extract
+RUN ./squashfs-root/AppRun --version