mirror of
https://github.com/WerWolv/ImHex.git
synced 2026-04-01 21:17:44 -05:00
build: Simplify appimage build (#356)
* Simplify creating an AppImage - package.sh packages the build result into an AppImage. It requires squashfs-tools to work - runtime-x86_64 is a binary distributed by the AppImage project that takes care of extracting and running the image * use AppRun from AppImage project * clean up no longer needed bits * Keep docker way of working around - Docker now also uses `package.sh`, so no more need for FUSE. - Fetch binaries instead of storing in git. * Fix details * wait a little longer for the container to start
This commit is contained in:
12
dist/AppImage/AppRun
vendored
12
dist/AppImage/AppRun
vendored
@@ -1,12 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
SELF=$(readlink -f "$0")
|
|
||||||
HERE=${SELF%/*}
|
|
||||||
export PATH="${HERE}/usr/bin/:${HERE}/usr/sbin/:${HERE}/usr/games/:${HERE}/bin/:${HERE}/sbin/${PATH:+:$PATH}"
|
|
||||||
export LD_LIBRARY_PATH="${HERE}/usr/lib/:${HERE}/usr/lib/i386-linux-gnu/:${HERE}/usr/lib/x86_64-linux-gnu/:${HERE}/usr/lib32/:${HERE}/usr/lib64/:${HERE}/lib/:${HERE}/lib/i386-linux-gnu/:${HERE}/lib/x86_64-linux-gnu/:${HERE}/lib32/:${HERE}/lib64/${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
|
||||||
export PYTHONPATH="${HERE}/usr/share/pyshared/${PYTHONPATH:+:$PYTHONPATH}"
|
|
||||||
export XDG_DATA_DIRS="${HERE}/usr/share/${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}"
|
|
||||||
export PERLLIB="${HERE}/usr/share/perl5/:${HERE}/usr/lib/perl5/${PERLLIB:+:$PERLLIB}"
|
|
||||||
export GSETTINGS_SCHEMA_DIR="${HERE}/usr/share/glib-2.0/schemas/${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}"
|
|
||||||
export QT_PLUGIN_PATH="${HERE}/usr/lib/qt4/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt4/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt4/plugins/:${HERE}/usr/lib32/qt4/plugins/:${HERE}/usr/lib64/qt4/plugins/:${HERE}/usr/lib/qt5/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt5/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt5/plugins/:${HERE}/usr/lib32/qt5/plugins/:${HERE}/usr/lib64/qt5/plugins/${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}"
|
|
||||||
EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2 | cut -d " " -f 1)
|
|
||||||
exec "${EXEC}" "$@"
|
|
||||||
33
dist/AppImage/Dockerfile
vendored
33
dist/AppImage/Dockerfile
vendored
@@ -2,6 +2,7 @@ FROM debian:bullseye-slim
|
|||||||
LABEL maintainer Example <example@example.com>
|
LABEL maintainer Example <example@example.com>
|
||||||
|
|
||||||
ARG TAG=master
|
ARG TAG=master
|
||||||
|
ARG REPO=https://github.com/WerWolv/ImHex.git
|
||||||
|
|
||||||
USER root
|
USER root
|
||||||
|
|
||||||
@@ -13,13 +14,12 @@ RUN apt-get update \
|
|||||||
git \
|
git \
|
||||||
cmake \
|
cmake \
|
||||||
curl \
|
curl \
|
||||||
libfuse2 \
|
squashfs-tools
|
||||||
file
|
|
||||||
|
|
||||||
# Fetch source and dependencies
|
# Fetch source and dependencies
|
||||||
RUN mkdir -p /source \
|
RUN mkdir -p /source \
|
||||||
&& cd /source \
|
&& cd /source \
|
||||||
&& git clone https://github.com/WerWolv/ImHex.git \
|
&& git clone $REPO \
|
||||||
&& cd ImHex \
|
&& cd ImHex \
|
||||||
&& git checkout $TAG \
|
&& git checkout $TAG \
|
||||||
&& git submodule update --init --recursive \
|
&& git submodule update --init --recursive \
|
||||||
@@ -35,27 +35,6 @@ RUN mkdir -p /source/ImHex/build \
|
|||||||
&& make -j
|
&& make -j
|
||||||
|
|
||||||
# Prepare for AppImage
|
# Prepare for AppImage
|
||||||
RUN mkdir -p /source/ImHex.AppDir/usr/bin \
|
RUN cd /source/ImHex/dist/AppImage \
|
||||||
&& mkdir -p /source/ImHex.AppDir/usr/lib \
|
&& ./package.sh /source/ImHex/build \
|
||||||
&& mkdir -p /source/ImHex.AppDir/usr/share/imhex/plugins \
|
&& mv /source/ImHex/build/ImHex-x86_64.AppImage /
|
||||||
&& cp /source/ImHex/build/imhex /source/ImHex.AppDir/usr/bin/imhex \
|
|
||||||
&& cp /source/ImHex/build/plugins/builtin/builtin.hexplug /source/ImHex.AppDir/usr/share/imhex/plugins
|
|
||||||
|
|
||||||
COPY AppRun ImHex.desktop imhex.png /source/ImHex.AppDir/
|
|
||||||
#RUN inkscape -z -o /source/ImHex.AppDir/imhex.png -w 128 -h 128 /source/ImHex/res/icon.svg
|
|
||||||
|
|
||||||
# Gather the needed libraries
|
|
||||||
RUN chmod a+x /source/ImHex.AppDir/AppRun \
|
|
||||||
&& ldd /source/ImHex/build/imhex | awk '/ => /{print $3}' | xargs -I '{}' cp '{}' /source/ImHex.AppDir/usr/lib
|
|
||||||
|
|
||||||
# Package the prepared AppDir
|
|
||||||
RUN cd /source \
|
|
||||||
&& curl -L https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage -o appimagetool-x86_64.AppImage \
|
|
||||||
&& chmod a+x appimagetool-x86_64.AppImage
|
|
||||||
|
|
||||||
# All that remains is the following. However, due to docker limitations with fuse
|
|
||||||
# this cannot be done in a build container.
|
|
||||||
#
|
|
||||||
# /source/appimagetool-x86_64.AppImage ImHex.AppDir
|
|
||||||
|
|
||||||
ENTRYPOINT sh -c '/source/appimagetool-x86_64.AppImage /source/ImHex.AppDir; sleep 60'
|
|
||||||
|
|||||||
23
dist/AppImage/README.md
vendored
23
dist/AppImage/README.md
vendored
@@ -1,3 +1,22 @@
|
|||||||
The environment variable TAG can be set to build for a specific git tag. Without the master branch is build.
|
# Building an AppImage
|
||||||
|
There are two ways of building an AppImage for ImHex, using the provided
|
||||||
|
tools here.
|
||||||
|
|
||||||
First run `build.sh` to create a docker image. Then run `extract.sh` to get an AppImage.
|
If you want to create an AppImage and do not have a build to work from
|
||||||
|
already, you can use docker to build ImHex and package an AppImage.
|
||||||
|
|
||||||
|
Alternatively you can create an AppImage using an existing build.
|
||||||
|
|
||||||
|
## Using docker
|
||||||
|
First run `build.sh` to create a docker image. Then run `extract.sh` to get the
|
||||||
|
AppImage out. This needs to be in two steps, as a docker build cannot copy
|
||||||
|
files out. Nor can docker build use volume mounts.
|
||||||
|
|
||||||
|
The environment variable TAG can be set to build for a specific git tag.
|
||||||
|
Without the master branch is build.
|
||||||
|
|
||||||
|
## Using an existing build
|
||||||
|
Run `package.sh` with the build dir as an argument. E.g.:
|
||||||
|
```
|
||||||
|
./package.sh ../../build
|
||||||
|
```
|
||||||
|
|||||||
14
dist/AppImage/build.sh
vendored
14
dist/AppImage/build.sh
vendored
@@ -1,14 +1,16 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Set the TAG environment variable to build a specific tag
|
# Set the TAG environment variable to build a specific tag
|
||||||
|
# Set the REPO environment variable to point at a different git repository
|
||||||
|
|
||||||
# Make sure we're in the same direcotry as this script
|
# Make sure we're in the same directory as this script
|
||||||
pushd $(dirname "$(realpath "$0")")
|
pushd $(dirname "$(realpath "$0")")
|
||||||
|
|
||||||
if [ -z "$TAG" ]; then
|
BUILDARG=""
|
||||||
docker build -t imhex-appimage-build .
|
SUFFIX=""
|
||||||
else
|
[ -n "${TAG}" ] && BUILDARG="${BUILDARG} --build-arg=TAG=${TAG}" && SUFFIX=":${TAG}"
|
||||||
docker build --build-arg=TAG=$TAG -t imhex-appimage-build-$TAG .
|
[ -n "${REPO}" ] && BUILDARG="${BUILDARG} --build-arg=REPO=${REPO}"
|
||||||
fi
|
|
||||||
|
docker build ${BUILDARG} -t imhex-appimage-build${SUFFIX} .
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
|||||||
18
dist/AppImage/extract.sh
vendored
18
dist/AppImage/extract.sh
vendored
@@ -2,25 +2,25 @@
|
|||||||
|
|
||||||
# Set the TAG environment variable to move to a versioned name while extracting
|
# Set the TAG environment variable to move to a versioned name while extracting
|
||||||
|
|
||||||
# Make sure we're in the same direcotry as this script
|
# Make sure we're in the same directory as this script
|
||||||
pushd $(dirname "$(realpath "$0")")
|
pushd $(dirname "$(realpath "$0")")
|
||||||
|
|
||||||
|
SUFFIX=""
|
||||||
|
[ -n "$TAG" ] && SUFFIX=":$TAG"
|
||||||
|
|
||||||
# Remove old containers
|
# Remove old containers
|
||||||
docker rm imhex 2>&1 > /dev/null
|
docker rm imhex 2>&1 > /dev/null
|
||||||
|
|
||||||
# AppImage uses FUSE, which makes --device /dev/fuse --cap-add SYS_ADMIN necessary here
|
docker run -d --name imhex imhex-appimage-build${SUFFIX} sleep 30 &
|
||||||
# on Debian --security-opt apparmor:unconfined is also needed
|
sleep 15
|
||||||
if [ -z "$TAG" ]; then
|
|
||||||
docker run -d --device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined --name imhex imhex-appimage-build
|
|
||||||
else
|
|
||||||
docker run -d --device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined --name imhex imhex-appimage-build-$TAG
|
|
||||||
fi
|
|
||||||
sleep 10
|
|
||||||
docker cp imhex:/ImHex-x86_64.AppImage .
|
docker cp imhex:/ImHex-x86_64.AppImage .
|
||||||
|
|
||||||
# Move to tagged name if $TAG set
|
# Move to tagged name if $TAG set
|
||||||
if [ -n "$TAG" ]; then
|
if [ -n "$TAG" ]; then
|
||||||
mv ImHex-x86_64.AppImage ImHex-${TAG}-x86_64.AppImage
|
mv ImHex-x86_64.AppImage ImHex-${TAG}-x86_64.AppImage
|
||||||
|
echo -e "\nThe created AppImage can be found here:\n $(pwd)/ImHex-${TAG}-x86_64.AppImage\n\n"
|
||||||
|
else
|
||||||
|
echo -e "\nThe created AppImage can be found here:\n $(pwd)/ImHex-x86_64.AppImage\n\n"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
|||||||
56
dist/AppImage/package.sh
vendored
Executable file
56
dist/AppImage/package.sh
vendored
Executable file
@@ -0,0 +1,56 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e # Exit on error
|
||||||
|
set -o pipefail # Bash specific
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "Tool to package an ImHex build into an AppImage"
|
||||||
|
echo
|
||||||
|
echo "Usage:"
|
||||||
|
echo "$0 <build dir>"
|
||||||
|
echo
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
MYDIR=$(dirname "$(realpath "$0")")
|
||||||
|
|
||||||
|
# Check is a build dir has been specified and it's a dir
|
||||||
|
[ -z "$1" ] && usage
|
||||||
|
[ -d "$1" ] || usage
|
||||||
|
|
||||||
|
set -u # Throw errors when unset variables are used
|
||||||
|
|
||||||
|
BUILDDIR=$1
|
||||||
|
APPDIR=${BUILDDIR}/ImHex.AppDir
|
||||||
|
APPIMAGE=${BUILDDIR}/ImHex-x86_64.AppImage
|
||||||
|
|
||||||
|
# Prepare for AppImage
|
||||||
|
## Fetch the needed AppImage binaries
|
||||||
|
curl -L https://github.com/AppImage/AppImageKit/releases/download/13/AppRun-x86_64 -o ${MYDIR}/AppRun-x86_64
|
||||||
|
curl -L https://github.com/AppImage/AppImageKit/releases/download/13/runtime-x86_64 -o ${MYDIR}/runtime-x86_64
|
||||||
|
|
||||||
|
## Setup directory structure
|
||||||
|
mkdir -p ${BUILDDIR}/ImHex.AppDir/usr/{bin,lib} ${BUILDDIR}/ImHex.AppDir/usr/share/imhex/plugins
|
||||||
|
|
||||||
|
## Add ImHex files to structure
|
||||||
|
cp ${BUILDDIR}/imhex ${APPDIR}/usr/bin
|
||||||
|
cp ${BUILDDIR}/plugins/builtin/builtin.hexplug ${APPDIR}/usr/share/imhex/plugins
|
||||||
|
cp ${MYDIR}/{AppRun-x86_64,ImHex.desktop,imhex.png} ${APPDIR}/
|
||||||
|
mv ${BUILDDIR}/ImHex.AppDir/AppRun-x86_64 ${APPDIR}/AppRun
|
||||||
|
chmod a+x ${BUILDDIR}/ImHex.AppDir/AppRun
|
||||||
|
|
||||||
|
## Add all dependencies
|
||||||
|
ldd ${BUILDDIR}/imhex | awk '/ => /{print $3}' | xargs -I '{}' cp '{}' ${APPDIR}/usr/lib
|
||||||
|
|
||||||
|
# Package it up as described here:
|
||||||
|
# https://github.com/AppImage/AppImageKit#appimagetool-usage
|
||||||
|
# under 'If you want to generate an AppImage manually'
|
||||||
|
# This builds a v2 AppImage according to
|
||||||
|
# https://github.com/AppImage/AppImageSpec/blob/master/draft.md#type-2-image-format
|
||||||
|
mksquashfs ${APPDIR} ${BUILDDIR}/ImHex.squashfs -root-owned -noappend
|
||||||
|
cat ${MYDIR}/runtime-x86_64 > ${APPIMAGE}
|
||||||
|
cat ${BUILDDIR}/ImHex.squashfs >> ${APPIMAGE}
|
||||||
|
chmod a+x ${APPIMAGE}
|
||||||
|
|
||||||
|
if [ ! -f /.dockerenv ]; then
|
||||||
|
echo -e "\nThe created AppImage can be found here:\n ${APPIMAGE}\n\n"
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user