Первый релиз скрипта сборки AppImage

This commit is contained in:
Alexander Zhirov 2024-03-12 02:55:36 +03:00
commit 8b0a2d5f91
15 changed files with 424 additions and 0 deletions

234
src/appimage-builder.sh Executable file
View file

@ -0,0 +1,234 @@
#!/bin/bash
# title :appimage-builder.sh
# description :Script for building AppImage
# author :Alexander Zhirov
# date :20240312
# version :0.1.0
# usage :bash appimage-builder.sh
#===============================================================================
# Пакеты AppImageTool
# https://github.com/AppImage/appimagetool/releases
# Среда выполнения
# https://github.com/AppImage/type2-runtime/releases
set -e
version="0.1.0"
# Определения по умолчанию
# Приложение для сборки AppImage
appimage_tool=$(which appimagetool-x86_64.AppImage)
# Среда выполнения
appimage_runtime=$(which runtime-x86_64)
# Output
appimage_output="${HOME}"
# Директория с рецептами
appimage_input="./apps"
# Директория с кэшем
appimage_cache="${HOME}/appimage_cache"
# Список приложений для сборки
appimage_apps=()
# Дополнительные необходимые утилиты
rpm2cpio=$(which rpm2cpio)
cpio=$(which cpio)
if [ ! -x ${rpm2cpio} ]; then
echo "Отсутствует утилита rpm2cpio"
exit 1
fi
if [ ! -x ${cpio} ]; then
echo "Отсутствует утилита cpio"
exit 1
fi
extrpm() {
local rpm="${1}"
local destination_path="${2}"
${rpm2cpio} ${rpm} | ${cpio} -idmvD ${destination_path}
}
build_appimage() {
local pkg="${1}"
local name=$(basename ${pkg})
local build="${pkg}/build.sh"
local sources="${pkg}/sources"
local files="${pkg}/files"
local cache="${appimage_cache}/${name}"
# Временные директории для сборки
local tmp="/tmp/appimage_${name}_$(date "+%Y%m%d%H%M%S")"
local src="${tmp}/src"
local app="${tmp}/app"
if [ ! -f ${sources} ]; then
echo "${name}: не найдено исходных файлов для упаковки"
return
fi
if [ ! -s ${sources} ]; then
echo "${name}: не найдено ни одного источника"
return
fi
if [ ! -d ${files} ]; then
echo "${files}: не найдена директория с файлами"
return
fi
if ! [ "$(ls -A ${files})" ]; then
echo "${files}: отсутствуют файлы для сборки AppImage"
return
fi
# Создание директорий для сборки AppImage
mkdir -pv ${src} ${app} ${cache}
# Список файлов для скачивания
local source_files="$(cat ${sources} | grep -v "^#")"
for source_file in ${source_files}; do
wget -N -P ${cache} ${source_file}
done
# Извлечение из rpm пакетов внутренностей
for rpm in $(find ${cache} -name "*.rpm"); do
extrpm ${rpm} ${app}
done
# Извлечение из deb пакетов внутренности data.tar.* архивов
for deb in $(find ${cache} -name "*.deb"); do
local tar_name=$(ar t ${deb} | grep data)
local tar_archive="${src}/${tar_name}"
ar xv ${deb} ${tar_name} --output ${src}
tar xvf ${tar_archive} -C ${app}
rm -v ${tar_archive}
done
# Перенос необходмых файлов для сборки AppImage в директорию сборки
cp -rv ${files}/* ${app}
# Запуск внутреннего скрипта сборки (если имеется)
if [ -f ${build} ]; then
export current_path=$(dirname ${build})
export app_path=${app}
${build}
unset ${current_path}
unset ${app_path}
fi
local name_appimage=$(grep "Name" ${files}/*.desktop | sed 's/Name=//' | tr ' ' '_')-x86_64.AppImage
${appimage_tool} -v --runtime-file ${appimage_runtime} ${app} ${appimage_output}/${name_appimage}
rm -rvf ${tmp}
}
help_scritp() {
echo -e "\n" \
"Использование: ${0} [ОПЦИИ]... [СПИСОК ПАКЕТОВ ДЛЯ СБОРКИ]\n" \
"Основные опции:\n" \
"\t-t\t--appimage-tool\t\tИнструмент сборки AppImage\n" \
"\t-r\t--appimage-runtime\tИнструмент времени выполнения\n" \
"\t-i\t--input-path\t\tДиректория с пакетами исходных файлов\n" \
"\t-o\t--output-path\t\tДиректория сохранения собранных AppImage\n" \
"\t-c\t--cache-path\t\tДиректория кеша для пакетов sources\n" \
"Дополнительно:\n" \
"\t-h\t--help\t\t\tПоказать справку\n" \
"\t-v\t--version\t\tВерсия скрипта\n"
}
main() {
while [[ $# -gt 0 ]]; do
key="${1}"
value="${2}"
case "${key}" in
-t|--appimage-tool)
appimage_tool="${value}"
shift
;;
-r|--appimage-runtime)
appimage_runtime="${value}"
shift
;;
-i|--input-path)
appimage_input="${value}"
shift
;;
-o|--output-path)
appimage_output="${value}"
shift
;;
-c|--cache-path)
appimage_cache="${value}"
shift
;;
-h|--help)
help_scritp
exit 0
;;
-v|--version)
echo "Версия скрипта: ${version}"
exit 0
;;
*)
appimage_apps+=("${key}")
;;
esac
shift
done
if [ ! -f ${appimage_tool} ]; then
echo "Отсутствует инструмент сборки $(basename ${appimage_tool})"
exit 1
fi
if [ ! -x ${appimage_tool} ]; then
echo "Инструмент сборки $(basename ${appimage_tool}) должен быть исполняемым"
exit 1
fi
if [ ! -f ${appimage_runtime} ]; then
echo "Отсутствует инструмент времени выполнения $(basename ${appimage_runtime})"
exit 1
fi
if [ ! -x ${appimage_runtime} ]; then
echo "Инструмент времени выполнения $(basename ${appimage_runtime}) должен быть исполняемым"
exit 1
fi
if [ ! -d ${appimage_input} ]; then
echo "Не установлена директория исхоных файлов для сборки AppImage"
exit 1
fi
if [ ! -d ${appimage_output} ]; then
echo "Не установлена директория для сохранения AppImage"
exit 1
fi
if [ ! -d ${appimage_cache} ]; then
echo "Не определена директория для кеша. Будет использована директория по умолчанию"
appimage_cache="/tmp/appimage_cache"
mkdir -p "${appimage_cache}"
fi
echo "Инструмент сборки: ${appimage_tool}"
echo "Инструмент времени выполнения: ${appimage_runtime}"
echo "Директория исходных файлов: ${appimage_input}"
echo "Директория для сохранения AppImage: ${appimage_input}"
echo "Директория для кеша: ${appimage_cache}"
echo "Список собираемых пакетов: ${appimage_apps[@]}"
local pkgs=$(printf "%s\n" "${appimage_apps[@]}" | xargs -I {} find ${appimage_input} -name {} -mindepth 1 -maxdepth 1 -type d)
for pkg in ${pkgs}; do
build_appimage ${pkg}
done
}
main "${@}"