diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..8aa29be --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +## [0.2.0](https://git.zhirov.kz/alexander/appimage-builder/compare/0.1.0...0.2.0) - 2024-05-22 +### Added +- Добавлен флаг `-l|--log-path` для указания директории сохранения вывода процесса сборки в журнал `appimage_build.log` +### Fixed +- Добавлены проверки на наличие инструментов сборки AppImage +- Добавлены проверки на наличие указанных путей, передаваемых через флаги + +## [0.1.0](https://git.zhirov.kz/alexander/appimage-builder/commit/8b0a2d5f9194e67d2eb805a4631261ca23cfa013) - 2024-03-12 +### Added +- Релиз diff --git a/README.md b/README.md index 4374add..c16e075 100644 --- a/README.md +++ b/README.md @@ -25,3 +25,10 @@ - `current_path` - текущая директория пакета - `app_path` - временная директория сборки пакета (иерархия будущего AppImage) + +## Необходимые инструменты для сборки пакета AppImage + +- [AppImageTool](https://github.com/AppImage/appimagetool) - инструмент низкого уровня для создания AppImage из существующего AppDir +- [type2-runtime](https://github.com/AppImage/type2-runtime) - среда выполнения - исполняемая часть каждого AppImage. Он монтирует полезную нагрузку через FUSE и выполняет точку входа +- [rpm2cpio](https://www.opennet.ru/man.shtml?topic=rpm2cpio&category=8&russian=0) - извлекает архив cpio из RPM пакета +- [cpio](https://www.opennet.ru/man.shtml?topic=cpio&category=8&russian=0) - инструмент копирования файлов в архив и из архива diff --git a/src/appimage-builder.sh b/src/appimage-builder.sh index 9d5cfa3..e95a022 100755 --- a/src/appimage-builder.sh +++ b/src/appimage-builder.sh @@ -2,9 +2,9 @@ # title :appimage-builder.sh # description :Script for building AppImage # author :Alexander Zhirov -# date :20240312 -# version :0.1.0 -# usage :bash appimage-builder.sh +# date :20240522 +# version :0.2.0 +# usage :bash appimage-builder.sh --help #=============================================================================== # Пакеты AppImageTool @@ -14,32 +14,32 @@ set -e -version="0.1.0" +version="0.2.0" # Определения по умолчанию # Приложение для сборки AppImage -appimage_tool=$(which appimagetool-x86_64.AppImage) +appimage_tool="" # Среда выполнения -appimage_runtime=$(which runtime-x86_64) +appimage_runtime="" # Output -appimage_output="${HOME}" +appimage_output="" # Директория с рецептами -appimage_input="./apps" +appimage_input="$(dirname $(realpath ${0}))/apps" # Директория с кэшем -appimage_cache="${HOME}/appimage_cache" +appimage_cache="" # Список приложений для сборки appimage_apps=() # Дополнительные необходимые утилиты -rpm2cpio=$(which rpm2cpio) -cpio=$(which cpio) +rpm2cpio_tool=$(which rpm2cpio 2>/dev/null) +cpio_tool=$(which cpio 2>/dev/null) -if [ ! -x ${rpm2cpio} ]; then +if [ ! -x "${rpm2cpio_tool}" ]; then echo "Отсутствует утилита rpm2cpio" exit 1 fi -if [ ! -x ${cpio} ]; then +if [ ! -x "${cpio_tool}" ]; then echo "Отсутствует утилита cpio" exit 1 fi @@ -48,7 +48,7 @@ extrpm() { local rpm="${1}" local destination_path="${2}" - ${rpm2cpio} ${rpm} | ${cpio} -idmvD ${destination_path} + ${rpm2cpio_tool} ${rpm} | ${cpio_tool} -idmvD ${destination_path} } build_appimage() { @@ -66,22 +66,22 @@ build_appimage() { if [ ! -f ${sources} ]; then echo "${name}: не найдено исходных файлов для упаковки" - return + return 1 fi if [ ! -s ${sources} ]; then echo "${name}: не найдено ни одного источника" - return + return 1 fi if [ ! -d ${files} ]; then echo "${files}: не найдена директория с файлами" - return + return 1 fi if ! [ "$(ls -A ${files})" ]; then echo "${files}: отсутствуют файлы для сборки AppImage" - return + return 1 fi # Создание директорий для сборки AppImage @@ -125,17 +125,20 @@ build_appimage() { ${appimage_tool} -v --runtime-file ${appimage_runtime} ${app} ${appimage_output}/${name_appimage} rm -rvf ${tmp} + + return 0 } help_scritp() { echo -e "\n" \ - "Использование: ${0} [ОПЦИИ]... [СПИСОК ПАКЕТОВ ДЛЯ СБОРКИ]\n" \ + "Использование: $(basename ${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" \ + "\t-l\t--log-path\t\tДиректория для сохранения журнала сборки\n" \ "Дополнительно:\n" \ "\t-h\t--help\t\t\tПоказать справку\n" \ "\t-v\t--version\t\tВерсия скрипта\n" @@ -166,6 +169,10 @@ main() { appimage_cache="${value}" shift ;; + -l|--log-path) + appimage_log="${value}" + shift + ;; -h|--help) help_scritp exit 0 @@ -181,53 +188,76 @@ main() { shift done - if [ ! -f ${appimage_tool} ]; then - echo "Отсутствует инструмент сборки $(basename ${appimage_tool})" + if [ -z "${appimage_tool}" ] ; then + appimage_tool=$(which appimagetool-x86_64.AppImage 2>/dev/null) + fi + + if [ ! -f "${appimage_tool}" ]; then + echo "Отсутствует инструмент сборки: https://github.com/AppImage/appimagetool" exit 1 fi - if [ ! -x ${appimage_tool} ]; then + if [ ! -x "${appimage_tool}" ]; then echo "Инструмент сборки $(basename ${appimage_tool}) должен быть исполняемым" exit 1 fi - if [ ! -f ${appimage_runtime} ]; then - echo "Отсутствует инструмент времени выполнения $(basename ${appimage_runtime})" + if [ -z "${appimage_runtime}" ] ; then + appimage_runtime=$(which runtime-x86_64 2>/dev/null) + fi + + if [ ! -f "${appimage_runtime}" ]; then + echo "Отсутствует инструмент времени выполнения: https://github.com/AppImage/type2-runtime" exit 1 fi - if [ ! -x ${appimage_runtime} ]; then + if [ ! -x "${appimage_runtime}" ]; then echo "Инструмент времени выполнения $(basename ${appimage_runtime}) должен быть исполняемым" exit 1 fi - if [ ! -d ${appimage_input} ]; then + if [ ! -d "${appimage_input}" ]; then echo "Не установлена директория исхоных файлов для сборки AppImage" exit 1 fi - if [ ! -d ${appimage_output} ]; then - echo "Не установлена директория для сохранения AppImage" + if [ "$(find ${appimage_input} -maxdepth 1 -type d | wc -l)" -eq 1 ]; then + echo "Директория не содержит исхоных файлов для сборки AppImage: ${appimage_input}" exit 1 fi - if [ ! -d ${appimage_cache} ]; then - echo "Не определена директория для кеша. Будет использована директория по умолчанию" + if [ ! -d "${appimage_output}" ]; then + appimage_output="${HOME}/AppImages" + mkdir -p "${appimage_output}" + echo "Не установлена директория для сохранения AppImage. Будет использована директория по умолчанию: ${appimage_output}" + fi + + if [ ! -d "${appimage_cache}" ]; then appimage_cache="/tmp/appimage_cache" mkdir -p "${appimage_cache}" + echo "Не определена директория для кеша. Будет использована директория по умолчанию: ${appimage_cache}" + fi + + if [ ! -d "${appimage_log}" ]; then + appimage_log="${appimage_output}" + echo "Не определена директория для журнала. Будет использована директория по умолчанию: ${appimage_output}" fi echo "Инструмент сборки: ${appimage_tool}" echo "Инструмент времени выполнения: ${appimage_runtime}" echo "Директория исходных файлов: ${appimage_input}" - echo "Директория для сохранения AppImage: ${appimage_input}" + echo "Директория для сохранения AppImage: ${appimage_output}" 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} + if build_appimage ${pkg} > "${appimage_log}/appimage_build.log" 2>&1 ; then + echo "AppImage $(basename ${pkg}) был собран" + else + echo "AppImage $(basename ${pkg}) не был собран" + fi done }