X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-util.git;a=blobdiff_plain;f=cross-compile%2Fappimage%2Fcontrib%2Ffunctions.sh;h=d8f93381bf9a31ec2ef7761e82b84e8b9f1e3933;hp=3306fda4c5b9727eb4151117efe25be202c517c6;hb=ca369dfa9d2872b8b642b32cbc0c2fecacc8ed2e;hpb=1f369f0cb732c133cf43cc936ad1b15f5b2c7aac diff --git a/cross-compile/appimage/contrib/functions.sh b/cross-compile/appimage/contrib/functions.sh index 3306fda..d8f9338 100644 --- a/cross-compile/appimage/contrib/functions.sh +++ b/cross-compile/appimage/contrib/functions.sh @@ -1,11 +1,18 @@ # This file is supposed to be sourced by each Recipe # that wants to use the functions contained herein # like so: -# wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./functions.sh +# wget -q https://github.com/AppImage/AppImages/raw/${PKG2AICOMMIT}/functions.sh -O ./functions.sh # . ./functions.sh # RECIPE=$(realpath "$0") +# Specify a certain commit if you do not want to use master +# by using: +# export PKG2AICOMMIT= +if [ -z "$PKG2AICOMMIT" ] ; then + PKG2AICOMMIT=master +fi + # Options for apt-get to use local files rather than the system ones OPTIONS="-o Debug::NoLocking=1 -o APT::Cache-Limit=125829120 @@ -22,6 +29,33 @@ OPTIONS="-o Debug::NoLocking=1 -o APT::Install-Suggests=0 " +# Detect system architecture to know which binaries of AppImage tools +# should be downloaded and used. +case "$(uname -i)" in + x86_64|amd64) +# echo "x86-64 system architecture" + SYSTEM_ARCH="x86_64";; + i?86) +# echo "x86 system architecture" + SYSTEM_ARCH="i686";; +# arm*) +# echo "ARM system architecture" +# SYSTEM_ARCH="";; + unknown|AuthenticAMD|GenuineIntel) +# uname -i not answer on debian, then: + case "$(uname -m)" in + x86_64|amd64) +# echo "x86-64 system architecture" + SYSTEM_ARCH="x86_64";; + i?86) +# echo "x86 system architecture" + SYSTEM_ARCH="i686";; + esac ;; + *) + echo "Unsupported system architecture" + exit 1;; +esac + # Either get the file from remote or from a static place. # critical for builds without network access like in Open Build Service cat_file_from_url() @@ -48,8 +82,8 @@ patch_usr() # Download AppRun and make it executable get_apprun() { - # wget -c https://github.com/probonopd/AppImageKit/releases/download/5/AppRun -O ./AppRun # 64-bit - wget -c https://github.com/probonopd/AppImageKit/releases/download/6/AppRun_6-x86_64 -O AppRun # 64-bit + TARGET_ARCH=${ARCH:-$SYSTEM_ARCH} + wget -c https://github.com/AppImage/AppImageKit/releases/download/continuous/AppRun-${TARGET_ARCH} -O AppRun chmod a+x AppRun } @@ -81,16 +115,15 @@ move_lib() # Delete blacklisted files delete_blacklisted() { - BLACKLISTED_FILES=$( cat_file_from_url https://github.com/probonopd/AppImages/raw/master/excludelist | sed '/^\s*$/d' | sed '/^#.*$/d') + BLACKLISTED_FILES=$(cat_file_from_url https://github.com/AppImage/AppImages/raw/${PKG2AICOMMIT}/excludelist | sed 's|#.*||g') echo $BLACKLISTED_FILES for FILE in $BLACKLISTED_FILES ; do - FOUND=$(find . -xtype f -name "${FILE}" 2>/dev/null) - if [ ! -z "$FOUND" ] ; then - echo "Deleting blacklisted ${FOUND}" - rm -f "${FOUND}" - fi + FILES="$(find . -name "${FILE}" -not -path "./usr/optional/*")" + for FOUND in $FILES ; do + rm -vf "$FOUND" "$(readlink -f "$FOUND")" + done done - + # Do not bundle developer stuff rm -rf usr/include || true rm -rf usr/lib/cmake || true @@ -101,14 +134,15 @@ delete_blacklisted() # Echo highest glibc version needed by the executable files in the current directory glibc_needed() { - find . -name *.so -or -name *.so.* -or -type f -executable -exec readelf -s '{}' 2>/dev/null \; | sed -n 's/.*@GLIBC_//p'| awk '{print $1}' | sort --version-sort | tail -n 1 + find . -name *.so -or -name *.so.* -or -type f -executable -exec strings {} \; | grep ^GLIBC_2 | sed s/GLIBC_//g | sort --version-sort | uniq | tail -n 1 + # find . -name *.so -or -name *.so.* -or -type f -executable -exec readelf -s '{}' 2>/dev/null \; | sed -n 's/.*@GLIBC_//p'| awk '{print $1}' | sort --version-sort | tail -n 1 } # Add desktop integration # Usage: get_desktopintegration name_of_desktop_file_and_exectuable get_desktopintegration() { REALBIN=$(grep -o "^Exec=.*" *.desktop | sed -e 's|Exec=||g' | cut -d " " -f 1 | head -n 1) - cat_file_from_url https://raw.githubusercontent.com/probonopd/AppImageKit/master/desktopintegration > ./usr/bin/$REALBIN.wrapper + cat_file_from_url https://raw.githubusercontent.com/AppImage/AppImageKit/master/desktopintegration > ./usr/bin/$REALBIN.wrapper chmod a+x ./usr/bin/$REALBIN.wrapper sed -i -e "s|^Exec=$REALBIN|Exec=$REALBIN.wrapper|g" $1.desktop @@ -117,6 +151,11 @@ get_desktopintegration() # Generate AppImage; this expects $ARCH, $APP and $VERSION to be set generate_appimage() { + # Download AppImageAssistant + URL="https://github.com/AppImage/AppImageKit/releases/download/6/AppImageAssistant_6-${SYSTEM_ARCH}.AppImage" + wget -c "$URL" -O AppImageAssistant + chmod a+x ./AppImageAssistant + # if [[ "$RECIPE" == *ecipe ]] ; then # echo "#!/bin/bash -ex" > ./$APP.AppDir/Recipe # echo "# This recipe was used to generate this AppImage." >> ./$APP.AppDir/Recipe @@ -142,37 +181,64 @@ generate_appimage() exit 1 fi fi - wget -c "https://github.com/probonopd/AppImageKit/releases/download/6/AppImageAssistant_6-x86_64.AppImage" -O AppImageAssistant # (64-bit) - chmod a+x ./AppImageAssistant + mkdir -p ../out || true - rm ../out/$APP"-"$VERSION"-x86_64.AppImage" 2>/dev/null || true - ./AppImageAssistant ./$APP.AppDir/ ../out/$APP"-"$VERSION"-"$ARCH".AppImage" + rm ../out/$APP"-"$VERSION".glibc"$GLIBC_NEEDED"-"$ARCH".AppImage" 2>/dev/null || true + GLIBC_NEEDED=$(glibc_needed) + ./AppImageAssistant ./$APP.AppDir/ ../out/$APP"-"$VERSION".glibc"$GLIBC_NEEDED"-"$ARCH".AppImage" } # Generate AppImage type 2 +# Additional parameters given to this routine will be passed on to appimagetool +# +# If the environment variable NO_GLIBC_VERSION is set, the required glibc version +# will not be added to the AppImage filename generate_type2_appimage() { # Get the ID of the last successful build on Travis CI - # ID=$(wget -q https://api.travis-ci.org/repos/probonopd/appimagetool/builds -O - | head -n 1 | sed -e 's|}|\n|g' | grep '"result":0' | head -n 1 | sed -e 's|,|\n|g' | grep '"id"' | cut -d ":" -f 2) + # ID=$(wget -q https://api.travis-ci.org/repos/AppImage/appimagetool/builds -O - | head -n 1 | sed -e 's|}|\n|g' | grep '"result":0' | head -n 1 | sed -e 's|,|\n|g' | grep '"id"' | cut -d ":" -f 2) # Get the transfer.sh URL from the logfile of the last successful build on Travis CI # Only Travis knows why build ID and job ID don't match and why the above doesn't give both... # URL=$(wget -q "https://s3.amazonaws.com/archive.travis-ci.org/jobs/$((ID+1))/log.txt" -O - | grep "https://transfer.sh/.*/appimagetool" | tail -n 1 | sed -e 's|\r||g') # if [ -z "$URL" ] ; then # URL=$(wget -q "https://s3.amazonaws.com/archive.travis-ci.org/jobs/$((ID+2))/log.txt" -O - | grep "https://transfer.sh/.*/appimagetool" | tail -n 1 | sed -e 's|\r||g') # fi - URL="https://github.com/probonopd/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" + URL="https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-${SYSTEM_ARCH}.AppImage" wget -c "$URL" -O appimagetool chmod a+x ./appimagetool + appimagetool=$(readlink -f appimagetool) + + if [ "$DOCKER_BUILD" ]; then + appimagetool_tempdir=$(mktemp -d) + mv appimagetool "$appimagetool_tempdir" + pushd "$appimagetool_tempdir" &>/dev/null + ls -al + ./appimagetool --appimage-extract + rm appimagetool + appimagetool=$(readlink -f squashfs-root/AppRun) + popd &>/dev/null + _appimagetool_cleanup() { [ -d "$appimagetool_tempdir" ] && rm -r "$appimagetool_tempdir"; } + trap _appimagetool_cleanup EXIT + fi + + if [ -z ${NO_GLIBC_VERSION+true} ]; then + GLIBC_NEEDED=$(glibc_needed) + VERSION_EXPANDED=$VERSION.glibc$GLIBC_NEEDED + else + VERSION_EXPANDED=$VERSION + fi + set +x + GLIBC_NEEDED=$(glibc_needed) if ( [ ! -z "$KEY" ] ) && ( ! -z "$TRAVIS" ) ; then - wget https://github.com/probonopd/AppImageKit/files/584665/data.zip -O data.tar.gz.gpg + wget https://github.com/AppImage/AppImageKit/files/584665/data.zip -O data.tar.gz.gpg ( set +x ; echo $KEY | gpg2 --batch --passphrase-fd 0 --no-tty --skip-verify --output data.tar.gz --decrypt data.tar.gz.gpg ) tar xf data.tar.gz sudo chown -R $USER .gnu* mv $HOME/.gnu* $HOME/.gnu_old ; mv .gnu* $HOME/ - VERSION=$VERSION ./appimagetool -n -s --bintray-user $BINTRAY_USER --bintray-repo $BINTRAY_REPO -v ./$APP.AppDir/ + VERSION=$VERSION_EXPANDED "$appimagetool" $@ -n -s --bintray-user $BINTRAY_USER --bintray-repo $BINTRAY_REPO -v ./$APP.AppDir/ else - VERSION=$VERSION ./appimagetool -n --bintray-user $BINTRAY_USER --bintray-repo $BINTRAY_REPO -v ./$APP.AppDir/ + VERSION=$VERSION_EXPANDED "$appimagetool" $@ -n --bintray-user $BINTRAY_USER --bintray-repo $BINTRAY_REPO -v ./$APP.AppDir/ fi set -x mkdir -p ../out/ || true @@ -180,14 +246,14 @@ generate_type2_appimage() } # Generate status file for use by apt-get; assuming that the recipe uses no newer -# ingredients than what would require more recent dependencies than what we assume +# ingredients than what would require more recent dependencies than what we assume # to be part of the base system generate_status() { mkdir -p ./tmp/archives/ mkdir -p ./tmp/lists/partial touch tmp/pkgcache.bin tmp/srcpkgcache.bin - wget -q -c "https://github.com/probonopd/AppImages/raw/master/excludedeblist" + wget -q -c "https://github.com/AppImage/AppImages/raw/${PKG2AICOMMIT}/excludedeblist" rm status 2>/dev/null || true for PACKAGE in $(cat excludedeblist | cut -d "#" -f 1) ; do printf "Package: $PACKAGE\nStatus: install ok installed\nArchitecture: all\nVersion: 9:999.999.999\n\n" >> status @@ -200,6 +266,13 @@ get_desktop() find usr/share/applications -iname "*${LOWERAPP}.desktop" -exec cp {} . \; || true } +fix_desktop() { + # fix trailing semicolons + for key in Actions Categories Implements Keywords MimeType NotShowIn OnlyShowIn; do + sed -i '/'"$key"'.*[^;]$/s/$/;/' $1 + done +} + # Find the icon file and copy it to the AppDir get_icon() { @@ -218,24 +291,22 @@ get_version() if [ -z "$THEDEB" ] ; then echo "Version could not be determined from the .deb; you need to determine it manually" fi - VER1=$(echo $THEDEB | cut -d "~" -f 1 | cut -d "_" -f 2 | cut -d "-" -f 1 | sed -e 's|1%3a||g' | sed -e 's|+dfsg||g' ) - GLIBC_NEEDED=$(glibc_needed) - VERSION=$VER1.glibc$GLIBC_NEEDED + VERSION=$(echo $THEDEB | cut -d "~" -f 1 | cut -d "_" -f 2 | cut -d "-" -f 1 | sed -e 's|1%3a||g' | sed -e 's|.dfsg||g' ) echo $VERSION } # transfer.sh -transfer() { if [ $# -eq 0 ]; then echo "No arguments specified. Usage:\necho transfer /tmp/test.md\ncat /tmp/test.md | transfer test.md"; return 1; fi +transfer() { if [ $# -eq 0 ]; then echo "No arguments specified. Usage:\necho transfer /tmp/test.md\ncat /tmp/test.md | transfer test.md"; return 1; fi tmpfile=$( mktemp -t transferXXX ); if tty -s; then basefile=$(basename "$1" | sed -e 's/[^a-zA-Z0-9._-]/-/g'); curl --progress-bar --upload-file "$1" "https://transfer.sh/$basefile" >> $tmpfile; else curl --progress-bar --upload-file "-" "https://transfer.sh/$1" >> $tmpfile ; fi; cat $tmpfile; rm -f $tmpfile; } # Patch binary files; fill with padding if replacement is shorter than original # http://everydaywithlinux.blogspot.de/2012/11/patch-strings-in-binary-files-with-sed.html # Example: patch_strings_in_file foo "/usr/local/lib/foo" "/usr/lib/foo" -function patch_strings_in_file() { +patch_strings_in_file() { local FILE="$1" local PATTERN="$2" local REPLACEMENT="$3" - # Find all unique strings in FILE that contain the pattern + # Find all unique strings in FILE that contain the pattern STRINGS=$(strings ${FILE} | grep ${PATTERN} | sort -u -r) if [ "${STRINGS}" != "" ] ; then echo "File '${FILE}' contain strings with '${PATTERN}' in them:" @@ -251,7 +322,7 @@ function patch_strings_in_file() { while [ ${#NEW_STRING_HEX} -lt ${#OLD_STRING_HEX} ] ; do NEW_STRING_HEX="${NEW_STRING_HEX}00" done - # Now, replace every occurrence of OLD_STRING with NEW_STRING + # Now, replace every occurrence of OLD_STRING with NEW_STRING echo -n "Replacing ${OLD_STRING} with ${NEW_STRING}... " hexdump -ve '1/1 "%.2X"' ${FILE} | \ sed "s/${OLD_STRING_HEX}/${NEW_STRING_HEX}/g" | \