diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b28f9690c..b51857402 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,8 +50,7 @@ jobs: - name: Package run: | cmake --build build --target install - cmake --build build --target appimage \ - || (cat build/appimage.log && false) + cmake --build build --target appimage - name: Upload artifacts uses: actions/upload-artifact@v3 with: diff --git a/cmake/linux/package_linux.sh.in b/cmake/linux/package_linux.sh.in index a1f9ff865..89e500060 100644 --- a/cmake/linux/package_linux.sh.in +++ b/cmake/linux/package_linux.sh.in @@ -6,9 +6,6 @@ # Notes: Will attempt to fetch linuxdeployqt automatically (x86_64 only) # See Also: https://github.com/probonopd/linuxdeployqt/blob/master/BUILDING.md -set -e - -LINUXDEPLOYQT="@CMAKE_BINARY_DIR@/linuxdeployqt" VERBOSITY=2 # 3=debug LOGFILE="@CMAKE_BINARY_DIR@/appimage.log" APPDIR="@CMAKE_BINARY_DIR@/@PROJECT_NAME_UCASE@.AppDir/" @@ -40,8 +37,21 @@ function skipped { echo -e " ${PLAIN}[${YELLOW}skipped${PLAIN}] ${1}" } +# Exit with error message if any command fails +trap "error 'Failed to generate AppImage'; exit 1" ERR + +# Run a command silently, but print output if it fails +function run_and_log { + echo -e "\n\n>>>>> $1" >> "$LOGFILE" + output="$("$@" 2>&1)" + status=$? + echo "$output" >> "$LOGFILE" + [[ $status != 0 ]] && echo "$output" + return $status +} + # Blindly assume system arch is appimage arch -ARCH=$(arch) +ARCH=$(uname -m) export ARCH # Check for problematic install locations @@ -50,35 +60,39 @@ if [ "$INSTALL" == "/usr/local" ] || [ "$INSTALL" == "/usr" ] ; then error "Incompatible CMAKE_INSTALL_PREFIX for creating AppImage: @CMAKE_INSTALL_PREFIX@" fi -echo -e "\nWriting verbose output to \"${LOGFILE}\"" - # Ensure linuxdeployqt uses the same qmake version as cmake -PATH="$(pwd -P)/squashfs-root/usr/bin:$(dirname "@QT_QMAKE_EXECUTABLE@")":$PATH +PATH="$(dirname "@QT_QMAKE_EXECUTABLE@"):$PATH" export PATH +# Use linuxdeployqt from env or in PATH +[[ $LINUXDEPLOYQT ]] || LINUXDEPLOYQT="$(which linuxdeployqt 2>/dev/null)" || true +[[ $APPIMAGETOOL ]] || APPIMAGETOOL="$(which appimagetool 2>/dev/null)" || true + # Fetch portable linuxdeployqt if not in PATH -APPIMAGETOOL="squashfs-root/usr/bin/appimagetool" -echo -e "\nDownloading linuxdeployqt to ${LINUXDEPLOYQT}..." -if env -i which linuxdeployqt > /dev/null 2>&1; then - skipped "System already provides this utility" -else - filename="linuxdeployqt-continuous-$(uname -p).AppImage" +if [[ -z $LINUXDEPLOYQT || -z $APPIMAGETOOL ]]; then + filename="linuxdeployqt-continuous-$ARCH.AppImage" url="https://github.com/probonopd/linuxdeployqt/releases/download/continuous/$filename" - down_file="$(pwd)/$filename" - if [ ! -f "$LINUXDEPLOYQT" ]; then - ln -s "$down_file" "$LINUXDEPLOYQT" - fi - echo " [.......] Downloading ($(uname -p)): ${url}" - wget -N -q "$url" || (rm "$filename" && false) - chmod +x "$LINUXDEPLOYQT" - success "Downloaded $LINUXDEPLOYQT" + echo " [.......] Downloading: ${url}" + wget -N -q "$url" && err=0 || err=$? + case "$err" in + 0) success "Downloaded $PWD/$filename" ;; + # 8 == server issued 4xx error + 8) error "Download failed (perhaps no package available for $ARCH)" ;; + *) error "Download failed" ;; + esac + # Extract AppImage and replace LINUXDEPLOYQT variable with extracted binary # to support systems without fuse # Also, we need to set LD_LIBRARY_PATH, but linuxdepoyqt's AppRun unsets it # See https://github.com/probonopd/linuxdeployqt/pull/370/ - "$LINUXDEPLOYQT" --appimage-extract > /dev/null 2>&1 - LINUXDEPLOYQT="squashfs-root/usr/bin/linuxdeployqt" - success "Extracted $APPIMAGETOOL" + chmod +x "$filename" + ./"$filename" --appimage-extract >/dev/null + success "Extracted $filename" + + # Use the extracted linuxdeployqt and appimagetool + PATH="$(pwd -P)/squashfs-root/usr/bin:$PATH" + [[ $LINUXDEPLOYQT ]] || LINUXDEPLOYQT="$(which linuxdeployqt)" + [[ $APPIMAGETOOL ]] || APPIMAGETOOL="$(which appimagetool)" fi # Make skeleton AppDir @@ -149,12 +163,14 @@ executables="${executables} -executable=${APPDIR}usr/lib/lmms/ladspa/imbeq_1197. executables="${executables} -executable=${APPDIR}usr/lib/lmms/ladspa/pitch_scale_1193.so" executables="${executables} -executable=${APPDIR}usr/lib/lmms/ladspa/pitch_scale_1194.so" +echo -e "\nWriting verbose output to \"${LOGFILE}\"" +echo -n > "$LOGFILE" + # Bundle both qt and non-qt dependencies into appimage format echo -e "\nBundling and relinking system dependencies..." -echo -e ">>>>> linuxdeployqt" > "$LOGFILE" # shellcheck disable=SC2086 -"$LINUXDEPLOYQT" "$DESKTOPFILE" $executables -bundle-non-qt-libs -verbose=$VERBOSITY $STRIP >> "$LOGFILE" 2>&1 +run_and_log "$LINUXDEPLOYQT" "$DESKTOPFILE" $executables -bundle-non-qt-libs -verbose=$VERBOSITY $STRIP success "Bundled and relinked dependencies" # Link to original location so lmms can find them @@ -187,8 +203,7 @@ ln -sr "${APPDIR}/usr/bin/lmms" "${APPDIR}/AppRun" # Create AppImage echo -e "\nFinishing the AppImage..." -echo -e "\n\n>>>>> appimagetool" >> "$LOGFILE" -"$APPIMAGETOOL" "${APPDIR}" "@APPIMAGE_FILE@" >> "$LOGFILE" 2>&1 +run_and_log "$APPIMAGETOOL" "${APPDIR}" "@APPIMAGE_FILE@" success "Created @APPIMAGE_FILE@" echo -e "\nFinished"