From 35e6e15038bc1a4d78eadb433a540cd72a02e341 Mon Sep 17 00:00:00 2001 From: q3aql Date: Sun, 23 Jun 2024 19:09:38 +0200 Subject: [PATCH] packelf-appimage.sh --- packelf-appimage.sh | 110 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100755 packelf-appimage.sh diff --git a/packelf-appimage.sh b/packelf-appimage.sh new file mode 100755 index 0000000..6f91e70 --- /dev/null +++ b/packelf-appimage.sh @@ -0,0 +1,110 @@ +#!/bin/bash + +# Author: q3aql@duck.com +# Pack elf binary and it's dependencies into standalone executable using appimagetool +# License: GPLv2.0 +# Require: https://github.com/AppImage/appimagetool/releases +# +# Note: packelf-appimage was inspired by https://github.com/oufm/packelf + +# Check dependencies +path_check="/usr/bin /bin /usr/local/bin ${HOME}/.local/bin $(brew --prefix 2> /dev/null)/bin" +dependencies="ldd grep sed basename bash echo appimagetool mktemp pwd" +dependencies_found="" +dependencies_not_found="" +for checkPath in ${path_check} ; do + for checkDependencies in ${dependencies} ; do + if [ -f ${checkPath}/${checkDependencies} ] ; then + dependencies_found="${dependencies_found} ${checkDependencies}" + fi + done +done +for notFound in ${dependencies} ; do + check_found_one=$(echo ${dependencies_found} | grep " ${notFound}") + check_found_two=$(echo ${dependencies_found} | grep "${notFound} ") + if_not_found="${check_found_one}${check_found_two}" + if [ -z "${if_not_found}" ] ; then + dependencies_not_found="${dependencies_not_found} ${notFound}" + fi +done +# Show if all tools are installed +if [ -z "${dependencies_not_found}" ] ; then + echo > /dev/null +else + echo "${0}: Some required tools are not installed:${dependencies_not_found}" + exit 1 +fi + +# Create desktop file for appimage +# Sintax: create_desktop_file +create_desktop_file() { + desktop_file_path="${1}" + desktop_file_name="${2}" + # Create desktop file + echo "[Desktop Entry]" > ${desktop_file_path}/${desktop_file_name}.desktop + echo "Type=Application" >> ${desktop_file_path}/${desktop_file_name}.desktop + echo "Name=${desktop_file_name}" >> ${desktop_file_path}/${desktop_file_name}.desktop + echo "Icon=${desktop_file_name}" >> ${desktop_file_path}/${desktop_file_name}.desktop + echo "Exec=${desktop_file_name}" >> ${desktop_file_path}/${desktop_file_name}.desktop + echo "Terminal=false" >> ${desktop_file_path}/${desktop_file_name}.desktop + echo "Categories=System;" >> ${desktop_file_path}/${desktop_file_name}.desktop + echo "StartupWMClass=mpv" >> ${desktop_file_path}/${desktop_file_name}.desktop + # Create icon for desktop file + echo '' > ${desktop_file_path}/${desktop_file_name}.svg + echo ' ' >> ${desktop_file_path}/${desktop_file_name}.svg + echo ' ' >> ${desktop_file_path}/${desktop_file_name}.svg + echo ' ' >> ${desktop_file_path}/${desktop_file_name}.svg + echo ' ' >> ${desktop_file_path}/${desktop_file_name}.svg + echo ' ' >> ${desktop_file_path}/${desktop_file_name}.svg + echo ' ' >> ${desktop_file_path}/${desktop_file_name}.svg + echo ' ' >> ${desktop_file_path}/${desktop_file_name}.svg + echo ' ' >> ${desktop_file_path}/${desktop_file_name}.svg + echo ' ' >> ${desktop_file_path}/${desktop_file_name}.svg + echo '' >> ${desktop_file_path}/${desktop_file_name}.svg +} + +# Check if file exist +if [ ! -z "${1}" ] ; then + if [ ! -f "${1}" ] ; then + echo "${0}: File ${1} does not exist" + exit 1 + else + libs="$(ldd "${1}" | grep -F '/' | sed -E 's|[^/]*/([^ ]+).*?|/\1|')" + ld_so="$(echo "$libs" | grep -F '/ld-linux-' || echo "$libs" | grep -F '/ld-musl-')" + ld_so="$(basename "$ld_so")" + program="$(basename "${1}")" + fi +else + echo "Usage: ${0} " + exit 0 +fi + +# Check if destination file exist +if [ -z "${2}" ] ; then + echo "Usage: ${0} " + exit 0 +else + temp_dir=$(mktemp -d) + echo "Creating static binary ${2} from ${1}" + cp -L ${1} ${temp_dir}/ + for libraries in ${libs} ; do + echo "Linking library ${libraries}" + cp -L ${libraries} ${temp_dir}/ + done + echo "Creating executable linker" + echo "#!/usr/bin/env sh" > ${temp_dir}/AppRun + echo "" >> ${temp_dir}/AppRun + echo "\$(dirname \$0)/${ld_so} --library-path \$(dirname \$0) \$(dirname \$0)/${program} \$@" >> ${temp_dir}/AppRun + create_desktop_file "${temp_dir}" "${program}" + chmod 777 -R "${temp_dir}" + echo "Building static binary in ${2}" + appimagetool ${temp_dir} "${2}" &> /dev/null + rm -rf ${temp_dir} + if [ -f "${2}" ] ; then + echo "Created successfully" + else + echo "FAILED!" + exit 1 + fi +fi +