Mercurial > hg > tony
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