diff --git a/tools/Dockerfile b/tools/Dockerfile new file mode 100644 index 0000000..1b0e706 --- /dev/null +++ b/tools/Dockerfile @@ -0,0 +1,72 @@ +# trusty +FROM ubuntu:14.04 as appimage_intermediate + +# install dependencies + +RUN apt-get update && \ + apt-get -y upgrade && \ + apt-get install -y software-properties-common build-essential curl git wget \ + autotools-dev autoconf libtool liblzma-dev libz-dev gettext && \ + add-apt-repository ppa:beineri/opt-qt593-trusty -y && \ + apt-get update && \ + apt-get install -y qt59base qt59svg qt59x11extras cmake3 libdwarf-dev mesa-common-dev \ + libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev + +WORKDIR /opt + +# download prebuild KF5 libraries and ECM + +RUN wget -c "https://github.com/chigraph/precompiled-kf5-linux/releases/download/precompiled/kf5-gcc6-linux64-release.tar.xz" && \ + tar --strip-components=2 -xf kf5-gcc6-linux64-release.tar.xz + +# download AppImage tools and extract them, to remove fuse dependency + +RUN wget -c "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" -O /tmp/linuxdeployqt && \ + wget -c "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" -O /tmp/appimagetool && \ + chmod a+x /tmp/linuxdeployqt /tmp/appimagetool && \ + /tmp/linuxdeployqt --appimage-extract && mv squashfs-root linuxdeployqt && \ + ln -s /opt/linuxdeployqt/AppRun /opt/bin/linuxdeployqt && \ + /tmp/appimagetool --appimage-extract && mv squashfs-root appimagetool && \ + ln -s /opt/appimagetool/AppRun /opt/bin/appimagetool + +# setup env + +ENV PATH="/opt/bin:/opt/qt59/bin:${PATH}" +ENV PKG_CONFIG_PATH="/opt/qt59/lib/pkgconfig:${PKG_CONFIG_PATH}" +ENV LD_LIBRARY_PATH="/opt/qt59/lib:/opt/lib/x86_64-linux-gnu" + +# grab sources + +RUN git clone git://git.sv.gnu.org/libunwind.git && \ + git clone https://github.com/facebook/zstd.git && \ + git clone git://anongit.kde.org/kdiagram + +# build libunwind + +WORKDIR /opt/libunwind + +RUN autoreconf -vfi && \ + ./configure --prefix /usr/local --enable-debug-frame --enable-minidebuginfo && \ + make -j$(nproc) && make install + +# build zstd + +WORKDIR /opt/zstd + +RUN make -j$(nproc) && make install + +# build kdiagram + +WORKDIR /opt/kdiagram + +RUN cmake -DBUILD_TESTING=OFF -DCMAKE_INSTALL_PREFIX=/opt -DCMAKE_BUILD_TYPE=Release && \ + make -j$(nproc) && make install + +# setup heaptrack build environment + +FROM appimage_intermediate + +ADD . /opt/heaptrack +WORKDIR /opt/heaptrack + +CMD ./tools/build_appimage.sh /opt /artifacts diff --git a/tools/build_appimage.sh b/tools/build_appimage.sh new file mode 100755 index 0000000..41c7a5a --- /dev/null +++ b/tools/build_appimage.sh @@ -0,0 +1,62 @@ +#!/bin/sh + +cd $(dirname $0)/../ + +OUTDIR=$PWD + +PREFIX=/opt + +if [ ! -z "$1" ]; then + PREFIX=$1 +fi + +if [ ! -z "$2" ]; then + OUTDIR="$2" +fi + +ZSTD=$(which zstd) + +if [ -z "$ZSTD" ]; then + echo "ERROR: cannot find zstd in PATH" + exit 1 +fi + +if [ -z "$(which linuxdeployqt)" ]; then + echo "ERROR: cannot find linuxdeployqt in PATH" + exit 1 +fi + +if [ -z "$(which appimagetool)" ]; then + echo "ERROR: cannot find appimagetool in PATH" + exit 1 +fi + +if [ ! -d build-appimage ]; then + mkdir build-appimage +fi + +cd build-appimage + +cmake -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_BUILD_TYPE=Release .. +make -j$(nproc) +make DESTDIR=appdir install + +linuxdeployqt "./appdir/$PREFIX/share/applications/org.kde.heaptrack.desktop" \ + -executable="./appdir/$PREFIX/lib/heaptrack/libexec/heaptrack_interpret" \ + -executable="./appdir/$PREFIX/lib/heaptrack/libheaptrack_preload.so" \ + -executable="./appdir/$PREFIX/lib/heaptrack/libheaptrack_inject.so" \ + -executable="$ZSTD" \ + -bundle-non-qt-libs + +# Ensure we prefer the bundled libs also when calling dlopen, cf.: https://github.com/KDAB/hotspot/issues/89 +mv "./appdir/$PREFIX/bin/heaptrack_gui" "./appdir/$PREFIX/bin/heaptrack_gui_bin" +printf '#!/bin/bash\nf="$(readlink -f "${0}")"\nd="$(dirname "$f")"\nLD_LIBRARY_PATH="$d/../lib:$LD_LIBRARY_PATH" "$d/heaptrack_gui_bin" "$@"\n' > ./appdir/$PREFIX/bin/heaptrack_gui + +chmod +x ./appdir/$PREFIX/bin/heaptrack_gui + +# use the shell script as AppRun entry point +rm ./appdir/AppRun +ln -sr ./appdir/$PREFIX/bin/heaptrack ./appdir/AppRun + +# Actually create the final image +appimagetool ./appdir $OUTDIR/heaptrack-$(git describe)-x86_64.AppImage diff --git a/tools/build_appimage_in_docker.sh b/tools/build_appimage_in_docker.sh new file mode 100755 index 0000000..740f467 --- /dev/null +++ b/tools/build_appimage_in_docker.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +cd $(dirname $0)/../ + +if [ ! -d /tmp/heaptrack-appimage-artifacts ]; then + mkdir /tmp/heaptrack-appimage-artifacts +fi + +sudo docker build -t heaptrack_appimage -f tools/Dockerfile . || exit 1 +sudo docker run -v /tmp/heaptrack-appimage-artifacts:/artifacts -it heaptrack_appimage +mv /tmp/heaptrack-appimage-artifacts/heaptrack-*.AppImage . +ls -latr heaptrack-*.AppImage | tail -n 1