2024-07-16 05:00:58 +02:00
|
|
|
#!/usr/bin/env sh
|
2024-06-23 19:09:38 +02:00
|
|
|
|
|
|
|
# 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 <DESKTOP_FILE_PATH> <NAME_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
|
2024-07-16 05:00:58 +02:00
|
|
|
echo 'pngfile' > ${desktop_file_path}/${desktop_file_name}.png
|
2024-06-23 19:09:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
# 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|')"
|
2024-06-23 22:50:43 +02:00
|
|
|
ld_so="$(echo "$libs" | grep -F '/ld-linux-' || echo "$libs" | grep -F '/ld-musl-' || echo "$libs" | grep -F '/ld.so')"
|
2024-06-23 19:09:38 +02:00
|
|
|
ld_so="$(basename "$ld_so")"
|
|
|
|
program="$(basename "${1}")"
|
2024-06-23 19:55:40 +02:00
|
|
|
if [ -z "${libs}" ] ; then
|
|
|
|
echo "${0}: Not a dynamic executable"
|
|
|
|
exit 1
|
|
|
|
fi
|
2024-06-23 19:09:38 +02:00
|
|
|
fi
|
|
|
|
else
|
|
|
|
echo "Usage: ${0} <ELF_SRC_PATH> <ELF_DST_PATH>"
|
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Check if destination file exist
|
|
|
|
if [ -z "${2}" ] ; then
|
|
|
|
echo "Usage: ${0} <ELF_SRC_PATH> <ELF_DST_PATH>"
|
|
|
|
exit 0
|
|
|
|
else
|
|
|
|
temp_dir=$(mktemp -d)
|
|
|
|
echo "Creating static binary ${2} from ${1}"
|
|
|
|
cp -L ${1} ${temp_dir}/
|
2024-07-16 05:00:58 +02:00
|
|
|
echo "Linking libraries ${libraries}"
|
2024-06-23 19:09:38 +02:00
|
|
|
for libraries in ${libs} ; do
|
|
|
|
cp -L ${libraries} ${temp_dir}/
|
|
|
|
done
|
|
|
|
echo "Creating executable linker"
|
|
|
|
echo "#!/usr/bin/env sh" > ${temp_dir}/AppRun
|
|
|
|
echo "" >> ${temp_dir}/AppRun
|
2024-06-24 13:17:13 +02:00
|
|
|
echo "\$(dirname \$0)/${ld_so} --library-path \$(dirname \$0) \$(dirname \$0)/${program} \"\$@\"" >> ${temp_dir}/AppRun
|
2024-06-23 19:09:38 +02:00
|
|
|
create_desktop_file "${temp_dir}" "${program}"
|
2024-07-18 16:45:53 +02:00
|
|
|
chmod 777 -R "${temp_dir}" 2> /dev/null
|
2024-06-23 19:09:38 +02:00
|
|
|
echo "Building static binary in ${2}"
|
2024-07-16 05:00:58 +02:00
|
|
|
appimagetool ${temp_dir} "${2}" > /dev/null 2> /dev/null
|
2024-06-23 19:09:38 +02:00
|
|
|
rm -rf ${temp_dir}
|
|
|
|
if [ -f "${2}" ] ; then
|
|
|
|
echo "Created successfully"
|
|
|
|
else
|
|
|
|
echo "FAILED!"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|