Generate the AppImage on xenial distribution.

AppImage should be genarated on a "old" distribution to be sure that
libc versions are compatible.

However, we need at least ubuntu bionic to have QWebEngine packaged.
Let's prepare our AppDir directory in bionic and generate the appimage
in xenial.
By using a small launcher script, we check that libc versions are
compatible and else print a nice message instead of crash.

See https://github.com/probonopd/linuxdeployqt/issues/340
This commit is contained in:
Matthieu Gautier 2019-09-23 17:15:22 +02:00
parent 9d5d62e96c
commit cc39a7c6fe
6 changed files with 107 additions and 58 deletions

View File

@ -86,6 +86,16 @@ script:
--mount=type=bind,src=$HOME/.gradle/caches,dst=/home/ci_builder/.gradle/caches \ --mount=type=bind,src=$HOME/.gradle/caches,dst=/home/ci_builder/.gradle/caches \
--mount=type=bind,src=$TRAVIS_BUILD_DIR,dst=/home/ci_builder/kiwix-build \ --mount=type=bind,src=$TRAVIS_BUILD_DIR,dst=/home/ci_builder/kiwix-build \
kiwix/kiwix-build_ci:${VARIANT}-${DOCKER_VERSION} kiwix/kiwix-build_ci:${VARIANT}-${DOCKER_VERSION}
if [[ $PLATFORM = "native_dyn" && $DESKTOP_ONLY = 1 ]]
then
docker run -rm \
-e PLATFORM -e NIGHTLY_DATE -e TRAVIS_EVENT_TYPE -e DESKTOP_ONLY -e TRAVIS_TAG \
--device /dev/fuse --cap-add ALL --privileged \
--mount=type=bind,src=$HOME/EXPORT,dst=/home/ci_builder/EXPORT \
--mount=type=bind,src=$TRAVIS_BUILD_DIR,dst=/home/ci_builder/kiwix-build \
kiwix/kiwix-build_ci:xenial-${DOCKER_VERSION} \
/home/ci_builder/kiwix-build/scripts/create_kiwix-desktop_appImage.sh /home/ci_builder/EXPORT/AppDir
fi
fi fi
- if [[ $TRAVIS_OS_NAME != "linux" ]]; then python3 travis/compile_all.py; fi - if [[ $TRAVIS_OS_NAME != "linux" ]]; then python3 travis/compile_all.py; fi
after_success: after_success:
@ -110,7 +120,7 @@ env:
global: global:
- NIGHTLY_DATE=$(date +%Y-%m-%d) - NIGHTLY_DATE=$(date +%Y-%m-%d)
- SSH_KEY=/tmp/private/travisci_builder_id_key - SSH_KEY=/tmp/private/travisci_builder_id_key
- DOCKER_VERSION=2 - DOCKER_VERSION=3
matrix: matrix:
- PLATFORM="flatpak" DESKTOP_ONLY=1 - PLATFORM="flatpak" DESKTOP_ONLY=1
- PLATFORM="native_dyn" - PLATFORM="native_dyn"

View File

@ -2,50 +2,19 @@
set -e set -e
INSTALLDIR=${1:-$PWD/BUILD_native_dyn/INSTALL} APPDIR=${1:-$PWD/AppDir}
SOURCEDIR=${2:-$PWD/SOURCE/kiwix-desktop} APPIMAGETOOL=appimagetool-x86_64.AppImage
APPDIR=${3:-$PWD/AppDir} VERSION=$(grep '^VERSION' $APPDIR/info.txt | awk '{print $2}')
EXPORT_DIR=$(grep '^EXPORT_DIR' $APPDIR/info.txt | awk '{print $2}')
SYSTEMLIBDIR=lib/x86_64-linux-gnu APP_NAME="kiwix-desktop_x86_64_${VERSION}.appimage"
# Uncoment if needed
#SYSTEMLIBDIR=lib64
#TODO We should have our icon
ICONFILE=$SOURCEDIR/resources/icons/kiwix/app_icon.svg
DESKTOPFILE=$SOURCEDIR/resources/org.kiwix.desktop.desktop
# Create structure
mkdir -p $APPDIR/usr/{bin,lib,share} $APPDIR/usr/share/applications $APPDIR/usr/share/icons/hicolor/48x48/apps
# Copy our files
cp $INSTALLDIR/bin/kiwix-desktop $APPDIR/usr/bin/
cp $INSTALLDIR/$SYSTEMLIBDIR/*.so* $APPDIR/usr/lib
# Remove it as it break with linuxdeployqt (should we compile without it) ?
rm $APPDIR/usr/lib/libmagic.so*
# Copy nss lib (to not conflict with host's ones)
cp -a /usr/$SYSTEMLIBDIR/nss $APPDIR/usr/lib
cp -a /usr/$SYSTEMLIBDIR/libstdc++.so* $APPDIR/usr/lib
cp -a /usr/$SYSTEMLIBDIR/libc.so* $APPDIR/usr/lib
cp -a /usr/$SYSTEMLIBDIR/libz.so* $APPDIR/usr/lib
cp $ICONFILE $APPDIR/usr/share/icons/hicolor/48x48/apps/kiwix-desktop.svg
mkdir -p $APPDIR/usr/share/applications
cp $DESKTOPFILE $APPDIR/usr/share/applications/kiwix-desktop.desktop
# get the aria2
wget https://github.com/q3aql/aria2-static-builds/releases/download/v1.34.0/aria2-1.34.0-linux-gnu-64bit-build1.tar.bz2
mkdir -p $APPDIR/usr/bin/ && tar -C $APPDIR/usr/bin/ -xf aria2-1.34.0-linux-gnu-64bit-build1.tar.bz2 aria2-1.34.0-linux-gnu-64bit-build1/aria2c --strip-components=1
mkdir -p $APPDIR/etc/ssl/certs/ && tar -C $APPDIR/etc/ssl/certs/ -xf aria2-1.34.0-linux-gnu-64bit-build1.tar.bz2 aria2-1.34.0-linux-gnu-64bit-build1/ca-certificates.crt --strip-components=1
# copy kiwix-serve
cp $INSTALLDIR/bin/kiwix-serve $APPDIR/usr/bin
# Get linuxdeployqt # Get linuxdeployqt
wget https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage if [ ! -x $APPIMAGETOOL ]
chmod a+x linuxdeployqt-continuous-x86_64.AppImage then
wget https://github.com/AppImage/AppImageKit/releases/download/12/$APPIMAGETOOL
chmod a+x $APPIMAGETOOL
fi
# Fill with all deps libs and so echo "Create appimage from $APPDIR to ${EXPORT_DIR}/$APP_NAME"
./linuxdeployqt-continuous-x86_64.AppImage $APPDIR/usr/bin/kiwix-desktop -unsupported-allow-new-glibc -bundle-non-qt-libs -extra-plugins=imageformats,iconengines
# Fix the RPATH of QtWebEngineProcess [TODO] Fill a issue ?
patchelf --set-rpath '$ORIGIN/../lib' $APPDIR/usr/libexec/QtWebEngineProcess
patchelf --set-rpath '$ORIGIN/../lib' $APPDIR/usr/bin/kiwix-serve
# Build the image. # Build the image.
./linuxdeployqt-continuous-x86_64.AppImage $APPDIR/usr/share/applications/kiwix-desktop.desktop -unsupported-allow-new-glibc -bundle-non-qt-libs -extra-plugins=imageformats,iconengines -appimage ./$APPIMAGETOOL $APPDIR $EXPORT_DIR/$APP_NAME

View File

@ -0,0 +1,71 @@
#!/usr/bin/env bash
set -e
INSTALLDIR=${1:-$PWD/BUILD_native_dyn/INSTALL}
SOURCEDIR=${2:-$PWD/SOURCE/kiwix-desktop}
APPDIR=${3:-$HOME/AppDir}
SYSTEMLIBDIR=lib/x86_64-linux-gnu
# Uncoment if needed
#SYSTEMLIBDIR=lib64
#TODO We should have our icon
ICONFILE=$SOURCEDIR/resources/icons/kiwix/app_icon.svg
DESKTOPFILE=$SOURCEDIR/resources/org.kiwix.desktop.desktop
# Create structure
mkdir -p $APPDIR/usr/{bin,lib,share} $APPDIR/usr/share/applications $APPDIR/usr/share/icons/hicolor/48x48/apps
# Copy our files
cp $INSTALLDIR/bin/kiwix-desktop $APPDIR/usr/bin/
cp $INSTALLDIR/$SYSTEMLIBDIR/*.so* $APPDIR/usr/lib
# Remove it as it break with linuxdeployqt (should we compile without it) ?
rm $APPDIR/usr/lib/libmagic.so*
# Copy nss lib (to not conflict with host's ones)
cp -a /usr/$SYSTEMLIBDIR/nss $APPDIR/usr/lib
cp -a /usr/$SYSTEMLIBDIR/libstdc++.so* $APPDIR/usr/lib
cp -a /usr/$SYSTEMLIBDIR/libc.so* $APPDIR/usr/lib
cp -a /usr/$SYSTEMLIBDIR/libz.so* $APPDIR/usr/lib
cp $ICONFILE $APPDIR/kiwix-desktop.svg
cp $DESKTOPFILE $APPDIR/kiwix-desktop.desktop
# get the aria2
wget https://github.com/q3aql/aria2-static-builds/releases/download/v1.34.0/aria2-1.34.0-linux-gnu-64bit-build1.tar.bz2
mkdir -p $APPDIR/usr/bin/ && tar -C $APPDIR/usr/bin/ -xf aria2-1.34.0-linux-gnu-64bit-build1.tar.bz2 aria2-1.34.0-linux-gnu-64bit-build1/aria2c --strip-components=1
mkdir -p $APPDIR/etc/ssl/certs/ && tar -C $APPDIR/etc/ssl/certs/ -xf aria2-1.34.0-linux-gnu-64bit-build1.tar.bz2 aria2-1.34.0-linux-gnu-64bit-build1/ca-certificates.crt --strip-components=1
# copy kiwix-serve
cp $INSTALLDIR/bin/kiwix-serve $APPDIR/usr/bin
# Get linuxdeployqt
wget https://github.com/probonopd/linuxdeployqt/releases/download/6/linuxdeployqt-6-x86_64.AppImage
chmod a+x linuxdeployqt-6-x86_64.AppImage
# Fill with all deps libs and so
./linuxdeployqt-6-x86_64.AppImage $APPDIR/usr/bin/kiwix-desktop -unsupported-allow-new-glibc -bundle-non-qt-libs -extra-plugins=imageformats,iconengines
# Fix the RPATH of QtWebEngineProcess [TODO] Fill a issue ?
patchelf --set-rpath '$ORIGIN/../lib' $APPDIR/usr/libexec/QtWebEngineProcess
patchelf --set-rpath '$ORIGIN/../lib' $APPDIR/usr/bin/kiwix-serve
echo "create $APPDIR/AppRun"
LIBC_BUILD_VERSION=$(ldd --version | head -1 | awk '{ print $NF }')
rm $APPDIR/AppRun
cat <<'EOF' | sed "s/__LIBC_BUILD_VERSION__/${LIBC_BUILD_VERSION}/" > $APPDIR/AppRun
#!/bin/bash
HERE=$(dirname "$(readlink -f "${0}")")
LIBC_VERSION=$(ldd --version | head -1 | awk '{ print $NF }' )
LIBC_BUILD_VERSION="__LIBC_BUILD_VERSION__"
function normalize { printf "%03d%03d" $(echo "$1" | tr '.' ' '); }
if [ $(normalize $LIBC_VERSION) -lt $(normalize $LIBC_BUILD_VERSION) ]
then
echo "Your glib version ($LIBC_VERSION) is too old to run kiwix-desktop"
echo "You need at least version $LIBC_BUILD_VERSION."
else
exec $HERE/usr/bin/kiwix-desktop
fi
EOF
chmod a+x $APPDIR/AppRun

View File

@ -13,8 +13,6 @@ RUN apt update -q && \
libmicrohttpd-dev aria2 \ libmicrohttpd-dev aria2 \
# Qt packages # Qt packages
libqt5gui5 qtbase5-dev qtwebengine5-dev libqt5svg5-dev qt5-image-formats-plugins qt5-default \ libqt5gui5 qtbase5-dev qtwebengine5-dev libqt5svg5-dev qt5-image-formats-plugins qt5-default \
# To create the appimage of kiwix-desktop
libfuse2 fuse patchelf \
# Flatpak tools # Flatpak tools
elfutils flatpak flatpak-builder \ elfutils flatpak flatpak-builder \
# Cross win32 compiler # Cross win32 compiler

View File

@ -130,20 +130,19 @@ def create_desktop_image():
archive_dir = NIGHTLY_KIWIX_ARCHIVES_DIR archive_dir = NIGHTLY_KIWIX_ARCHIVES_DIR
src_dir = SOURCE_DIR/'kiwix-desktop' src_dir = SOURCE_DIR/'kiwix-desktop'
if PLATFORM == 'flatpak': if PLATFORM != 'flatpak':
build_path = BASE_DIR/'org.kiwix.desktop.flatpak' app_dir = EXPORT_DIR/'AppDir'
app_name = 'org.kiwix.desktop.{}.flatpak'.format(postfix) command = ['kiwix-build/scripts/prepare_kiwix-desktop_appImage.sh',
print_message("archive is ", build_path) str(INSTALL_DIR), str(src_dir), str(app_dir)]
else:
build_path = HOME/'Kiwix-{}-x86_64.AppImage'.format(postfix)
app_name = "kiwix-desktop_x86_64_{}.appimage".format(postfix)
command = ['kiwix-build/scripts/create_kiwix-desktop_appImage.sh',
str(INSTALL_DIR), str(src_dir), str(HOME/'AppDir')]
env = dict(os.environ)
env['VERSION'] = postfix
print_message("Build AppImage of kiwix-desktop") print_message("Build AppImage of kiwix-desktop")
subprocess.check_call(command, cwd=str(HOME), env=env) subprocess.check_call(command, cwd=str(HOME))
with open(str(app_dir/'info.txt'), 'w') as f:
f.write("VERSION {}\nEXPORT_DIR {}".format(postfix, archive_dir))
return
build_path = BASE_DIR/'org.kiwix.desktop.flatpak'
app_name = 'org.kiwix.desktop.{}.flatpak'.format(postfix)
print_message("archive is ", build_path)
try: try:
archive_dir.mkdir(parents=True) archive_dir.mkdir(parents=True)
except FileExistsError: except FileExistsError:

View File

@ -16,6 +16,8 @@ RUN apt update -q && \
libmicrohttpd-dev \ libmicrohttpd-dev \
# Cross compile i586 # Cross compile i586
libc6-dev-i386 lib32stdc++6 gcc-multilib g++-multilib \ libc6-dev-i386 lib32stdc++6 gcc-multilib g++-multilib \
# To create the appimage of kiwix-desktop
libfuse2 fuse patchelf \
# Other tools (to remove) # Other tools (to remove)
# vim less grep \ # vim less grep \
&& \ && \