Сайт | Скачать | Видео | Wiki

Автор Тема: Создание портативных приложений своими руками.  (Прочитано 4519 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 926
  • Репутация: +24/-0
  • Автор темы
Так как в последнее время использую дистрибутив Minois пример буду приводить используя apt2sb, но создание портативного приложения будет работать на всех дистрибутвах где предусмотрено создание модулей с помощью утилит apt2sfs, в  Minois как уже упомянул apt2sb. Способ получил обратным инжинирингом ( :D) портативных приложений полученых с сайта https://www.protopage.com/pp4mnkt3am#Public_Category/%40mikewalsh_PORTABLES . Очень уж загорелся понять как они всё это делают.
  Итак получаю модуль скажем audacity, ввожу в терминал команду
Код
sudo apt2sb audacity

на выходе в корневом каталоге получаю модуль audacity.sb
  Далее создаем в ~/ каталог portapps  а в нем каталог audacity,и  перемещаем audacity.sb в него ,он станет донором для моей портативной программы с audacity, для этого его нужно распаковать командой
Код
unsquashfs ./audacity.sb
после распаковки в каталоге ~/portapps/audacity появится каталог squashfs-root, заходим в него и переносим нужные компоненты в ~/portapps/audacity обычно зачастую это каталог /usr, но на всякий случай, анализируем и другие каталоги на предмет присутствия библиотек либо конфиг файлов если есть таковые, то обязательно копируем и их.
 А теперь мы должны создать файл запуска LAUNC, это обычный bash скрипт в котором заданы параметры запуска привожу пример для LAUNC файла для Audacity
Код
#!/bin/sh
HERE="$(dirname "$(readlink -f "$0")")"
module=$HERE/usr/lib/audacity/modules/ mime=$HERE/usr/lib/mime/ audacity=$HERE/usr/lib/audacity/  LD_LIBRARY_PATH=$HERE/usr/lib/x86_64-linux-gnu $HERE/usr/bin/audacity
опций приведенных в скрипте достаточно для запуска программы Audacity
как видим все предельно просто строка HERE="$(dirname "$(readlink -f "$0")")" считывает полный путь из которого был запущен файл запуска и присваевает его переменой HERE, далее во второй строке задаются пути библиотек до бинарника программы Audacity, то есть мы должны создать связь между всеми нужными компонентами и бинарником, тут все просто в переменные пишем пути до компонентов а последним должен идти путь до бинарного файла. Теперь скрипту нужно присвоить права на исполнение и запустить его хоть из терминала хоть из desktop файла.
  Теперь отвечу на вопрос зачем, это все для дистрибутивов использующих overlay , чтоб избавится с неприятностями со слоями чтоб не городить огороды с горячим подключением,  , я много в этом способе еще не понял например еще не щупал как ведет себя desktop файл, как нужно прописывать в него опции ,чтоб это заработало, но мне способ понравился, и потому рассказал о нём.
вот ссылка на архив с портативной audacity, https://disk.yandex.ru/d/AJ7Qh-_wN0FaBA  , чтоб поглядеть как это устроено.
« Последнее редактирование: 06 Октябрь 2023, 08:21:08 от totiks2012 »

Оффлайн knn

  • Ветеран
  • *****
  • Сообщений: 2612
  • Репутация: +33/-0
- мне пришлось подойти поближе к Теме когда собирал модуль для 'MyTetra'.
  В portable версии 'MyTetra' скрипт запуска (mytetra.run) может выглядеть так:
Код
#!/bin/sh

PROGDIR=$(dirname $(readlink -e $0))
LD_LIBRARY_PATH=$PROGDIR/lib:${LD_LIBRARY_PATH}
export QT_QPA_PLATFORM_PLUGIN_PATH=$PROGDIR/platforms
export LD_LIBRARY_PATH
$PROGDIR/mytetra "${@}"

-----------------

+ sfs портирует модули
------------

как понимаю, ~= "степени самодостаточности библиотек" обуславливают "степени отвязанности" от конкретной сборки
( :) как-то заумно высказался, но как чтоб меньше букв набирать - не знаю...  )
===========
зы
вариант порт-сборок -
mytetra download (сборки от энтузиастов) .
( здесь на данное время я пользую ( на различных puppy-сборках ) mytetra_1.44.34_old_linux_32bit.tar.gz и mytetra_1.44.165_linux_amd64.tar.gz.  [  >> подробнее ] )
« Последнее редактирование: 02 Октябрь 2023, 17:47:34 от knn »
Gr4D, Grub2; HP Mini 210 VT - Intel Atom N470  @ 1.83GHz, Intel GMA3150, RAM=2 ГБ ;
Sams-n110: N270 - 1,6 ГГц, Intel GMA 950, RAM=2 ГБ.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 926
  • Репутация: +24/-0
  • Автор темы
если бы всё было так просто, попытался взять плеер sayonara , там дичь с qt и не захотел запускаться ибо битые ссылки , далее попробовал взять vlc этот запустился но проблемы со значками, всё таки нужно более глубоко понять как это работает.
upd: Я невероятно наивный человек, действительно многое упирается с какими  зависимостями были собраны программы, если с qt то это атас, мне в обед удалось собрать два портативных пакета , так у них в зависмостях все в порядке было, при запуске кнопки нормально отбражались, программа сделана с тулкитом gtk, я audacity пробовал... в общем чего-то с пылу с жару мне показалось что счастье вот оно близко... а тут случился маленький облом.
В итоге можно заморочится взять модуль с qt и вытащить библиотеки из него , но чего-то я резко охладел к о всему этому.
« Последнее редактирование: 02 Октябрь 2023, 20:44:31 от totiks2012 »

Оффлайн krasnyh

  • Ветеран
  • *****
  • Сообщений: 5395
  • Репутация: +143/-1
Архив audacity.tar.gz не смог запустить, что-то там недокручено в LAUNCH. А вот качнул VLC-portable64.tar.gz с вышеупомянутого сайта, там уже все ок, запустился.


Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 926
  • Репутация: +24/-0
  • Автор темы
Архив audacity.tar.gz не смог запустить, что-то там недокручено в LAUNCH. А вот качнул VLC-portable64.tar.gz с вышеупомянутого сайта, там уже все ок, запустился.
всё правильно архив с  audacity.tar.gz сделан мной, и не удивительно что он у вас не запустился, а сайтик с портативками действительно хороший. ...буду потихоньку копать причины

Оффлайн krasnyh

  • Ветеран
  • *****
  • Сообщений: 5395
  • Репутация: +143/-1
У sfs похожее организовано, https://mirror.yandex.ru/puppyrus/puppyrus-a64/pfs-portable/.

На примере mplayer-light-int-p-38184_64-sf06.pfs, который правда уже старый и скорее всего не заведется, но сам принцип. Он не из любой гипотетической папки, а конкретно заточен на запуск из /opt:
Код
#!/bin/sh
#141215 sfs http://forum.puppyrus.org/index.php/topic,16173.0.html
p="`basename $0`"
p1=ffmpeg43
#LD_LIBRARY_PATH="/opt/$p1/lib" exec "/opt/$p1/bin/$p" "$@"
LD_LIBRARY_PATH="/usr/lib:/usr/lib/x86_64-linux-gnu:/opt/$p1/lib" exec "/opt/$p1/bin/$p" "$@"
#-vc ffmpeg12vdpau,ffwmv3vdpau,ffvc1vdpau,ffh264vdpau,ffodivxvdpau

--------------------------------------------------------------------------------

upd. Да, пример немного не верный, все же речь в теме о способе обхода "горячего подключения" для overlay.
« Последнее редактирование: 02 Октябрь 2023, 23:22:26 от krasnyh »

Оффлайн krasnyh

  • Ветеран
  • *****
  • Сообщений: 5395
  • Репутация: +143/-1
Цитата
который правда уже старый и скорее всего не заведется
Запустился.
« Последнее редактирование: 02 Октябрь 2023, 23:38:13 от krasnyh »

Оффлайн RoDoN

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 6306
  • Репутация: +141/-0
конкретно заточен на запуск из /opt
ИМХО, правильный вариант размещения
Lenovo G500 (i3-3110M, 8 Гб, Intel + Radeon HD 8570)
PRA 16.12 JWM, Runtu 22.04 x64 XFCE

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 34089
  • Репутация: +233/-0
    • PuppyRus-A
Немного дополнил https://wiki.puppyrus.org/setups/portable?&#chroot2pfs
Про самопальное портирование - дописал про mkport и chroot2pfs (тут принципиально другой подход, но наверное более ресурсоемко)
Основные проблема тут :
1. Для либ с модулями типа /usr/lib/alsa-lib придется перекомпилить их с новым путем /opt/$1/usr/lib/alsa-lib или воспользоваться утилитой, которая меняет пути внутри бинарников
забыл название этой утилиты. Никто не помнит?
2. свежий qt5 не пойдет на системе с qt5 меньшей версии. Аналогично с glibc

Т.к. почти во всех дистрах почти все популярные проги есть - надо понимать зачем заниматься портированием:
1. Сам перекомпилил прогу . Чтобы в прочих дистрах не компилить по новой . Я так и делаю. Плюс в арче компилить (мне) проще, чем в дебиане
2. Для псевдогорячего подключений overlayfs модулей. AUFS жив, хоть и менее популярен. Пока жив - не вижу смысла

В прочих случаях получим дополнительные глюки и раздувание размера модулей за счет повтора либ

Оффлайн krasnyh

  • Ветеран
  • *****
  • Сообщений: 5395
  • Репутация: +143/-1
Никто не помнит?
Вот кому бы и помнить, так автору цитаты. Это же так просто. :)
Оказывается есть утилита https://github.com/NixOS/patchelf c помощью которой можно менять в бинарниках и либах пути к зависимым либам

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 34089
  • Репутация: +233/-0
    • PuppyRus-A
Уже нагуглил patchelf , но пример с его использованием уже удален
Нашел на чем можно протестировать : evince-gtk3-p-41.4_64-sf01.pfs
Пока не пойму как переместить evince-gtk3-p-41.4_64-sf01.pfs в /opt

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 926
  • Репутация: +24/-0
  • Автор темы
Вот что к этому моменту понял, портативные приложения возможны. В Launc.sh Для указания нахождения библиотек например программы для чтения рсс в ~/liferea/usr/lib/x86_64-linux-gnu/ используем переменную LD_LIBRARY_PATH , для указания схем для glib-2.0 используем переменую GSETTINGS_SCHEMA_DIR , эти имена важны и их не менять, вот пример кода для запуска rss readera liferea
Код
#!/bin/sh
set -x
HERE="$(dirname "$(readlink -f "$0")")"
last_dir=$(basename "$HERE")
usr="$HERE"
 # Запускаем программу
GSETTINGS_SCHEMA_DIR=$HERE/usr/share/glib-2.0/schemas/ LD_LIBRARY_PATH=$HERE/usr/lib/x86_64-linux-gnu  $HERE/usr/bin/$last_dir

и вот еще один вариант кода для этого же
Код
#!/bin/bash
set -x
HERE="$(dirname "$(readlink -f "$0")")"
#HERE=$(dirname $(readlink -f "${0}"))
export liferea_DIR="${HERE}"/usr
GSETTINGS_SCHEMA_DIR=$HERE/usr/share/glib-2.0/schemas/ LD_LIBRARY_PATH=$HERE/usr/lib/x86_64-linux-gnu exec "${HERE}"/usr/bin/liferea "$@"
exec "${HERE}"/usr/bin/liferea "$@"
но не всё так радужно никак не смог добится того чтоб прописать опцию чтоб связать бинарник с компонентами из ~/liferea/usr/share/liferea что в один момент отчаялся и сделал символическую ссылку на ~/liferea/usr/share/liferea/ в /usr/share/  и естествено программа заработала но это ведь не по честному, да и залез в систему , если кто подскажет как прописать опцию чтоб бинарник увидел файл  ~/liferea/usr/share/liferea/mainwindow.ui  , буду премного благодарен, вот где я застрял , <переменая в которую можно присваивать путь к файлу>, имена переменных я смотрю тут не произвольны... такое чувство сегодня как будто посмотрел увлекательный детектив.
« Последнее редактирование: 03 Октябрь 2023, 15:39:52 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 926
  • Репутация: +24/-0
  • Автор темы
patchelf
patchelf как ни крутил так и не смог добиться от него искомого, так и не понял как он работает

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 926
  • Репутация: +24/-0
  • Автор темы
Более того вот скрипт который может в полуавтоматическом режиме создавать эти приложения, делал для minios , но легко переделать и для тех дистрибутивов которые могут в apt2sfs, естественно скрипт придется адаптровать, там не трудно apt2sb поменять на apt2sfs вот код
Код
#!/bin/bash

echo "введите имя портативной программы которую вы хотите получить"
read nameProg
mkdir ~/portApps
cd ~/portApps
mkdir ./$nameProg
cd ./$nameProg
sudo apt2sb "$nameProg"
sudo mv /$nameProg.sb ./
unsquashfs ./$nameProg.sb
find squashfs-root -mindepth 1 -maxdepth 1 -type d -not -name 'var' -exec mv {} . \;

HERE="$(dirname "$(readlink -f "$0")")"

# Очищаем файл перед заполнением
echo "" > LAUNC2

echo "#!/bin/sh" >> LAUNC2

echo 'HERE="$(dirname "$(readlink -f "$0")")"' >> LAUNC2
echo 'last_dir=$(basename "$HERE")' >> LAUNC2
echo 'usr="$HERE"' >> LAUNC2

echo "GSETTINGS_SCHEMA_DIR=$HERE/usr/share/glib-2.0/schemas/ LD_LIBRARY_PATH=\$HERE/usr/lib:$HERE/usr/lib/x86_64-linux-gnu \$HERE/usr/bin/\$last_dir" >> LAUNC2
chmod +x ./LAUNC2
echo "файлы для портативной программы добыты и перемещены"
echo "не факт что портативка запустится, нужно проверять по зависимостям"


скрипт сырой , каковы знания и умения таков и скрипт уж простите, но буду улучшать. ибо я не могу уже остановится, хочу следующую, серию этого детективного сериала :)
« Последнее редактирование: 05 Октябрь 2023, 14:56:59 от totiks2012 »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 34089
  • Репутация: +233/-0
    • PuppyRus-A
как прописать опцию чтоб бинарник увидел файл  ~/liferea/usr/share/liferea/mainwindow.ui
Перекомпилить с нужным prefix
скрипт сырой
Посмотрите мой mkport.
Код
#!/bin/sh                                                                                                             
#231003 sfs                                                                                                           
[ ! "$1" ] && echo "Use $0 портируемый_бинарник                                                                       
    Бинарник должен находиться в дирректории с распакованным модулем, а не в системе                                 
    Подробнее : http://wiki.puppyrus.org/setups/portable" && exit.                                                   
cd ../../ && mkdir -p opt/"$1"                                                                                       
p="$(dirname  "`realpath opt`")"                                                                                     
mv  "$p/usr/bin" "$p/usr/lib" "$p/opt/$1/"                                                                           
mkdir -p "$p/usr/bin" && echo \                                                                                       
'#!/bin/sh                                                                                                           
#141215 sfs http://forum.puppyrus.org/index.php/topic,16173.0.html                                                   
p="`basename $0`"                                                                                                     
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/$p/lib" GSETTINGS_SCHEMA_DIR="/opt/$p/usr/share/glib-2.0/schemas/" exec "/opt/$
' >"$p/usr/bin/$1" && chmod 755 "$p/usr/bin/$1"