LINUX.ORG.RU

Сборка игры в бинарник для распространения

 , , ,


0

1

Предыстория: cделал игру на C++, Allegro5, OpenGL.

Что хочу: хочу сделать сборку для запуска юзерами без компиляции, максимизируя число компьютеров, на котором она запустится, и минимизируя объём затраченных усилий.

Как собираю: использую AppImage для сборки используемых .so-шников в папку с игрой, затем делаю скрипт для запуска бинарника игры и переопределения LD_LIBRARY_PATH (+плюс ещё перенаправляет выход игры в лог-файл)

Соответственно, продолжаю поиски подводных камней. На доступных компах игра вроде запустилась, но хотелось бы увеличить выборку. Буду благодарен за проверку работоспособности и отзывы. Ссылка: https://the.itch.io/ne-boiatsia

Принятая стратегия:
устанавливаем виртуальную старенькую систему, собираем под неё, проверяем на нескольких других виртуальных системах (Ubuntu 12.04 или типа того), дополнительно на досуге выпускаем сорцы, с тем и живём.


Ответ на: комментарий от Harald

не удовлетворяет критерию минимизации объёма затраченных усилий, да и в целом вот прямо сейчас настроение платформы уничтожать существующие, а не запиливать новые

eta ()

Существует какой-то способ линковать бинарники с более старой версией Glibc, чем та, которая установлена в системе. Посмотри например на этот Release Notes:

https://store.steampowered.com/news/app/953490/view/2735326880613325280?l=rus...

Также в какой-то версии Qt (если я не ошибаюсь, Qt 4.3) в ChangeLog была инфа о том, что библиотеку научили не привязываться к конкретной версии libpng.

ZenitharChampion ★★★★★ ()

Лично я использую старый дистрибутив Linux, чтобы создать бинарники, которые не зависят от слишком новой версии Glibc. При этом, компилятор GCC я использую новый.

А вот оказывается, можно прям в новой системе скомпилировать бинарник так, чтобы он зависел от Glibc 2.2.5.

ZenitharChampion ★★★★★ ()
Ответ на: комментарий от anonymous

.exe - это шеловские скрипты, которые есть обёртка для запуска бинарника игры и остального. AppImage использую только для того, чтобы собрать динамически слинкованные библиотеки в одном месте, тащемта этот вопрос в посте уточнён был

eta ()

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

Выкинь «без компиляции» и ответ станет очевиден.

t184256 ★★★★★ ()
Ответ на: комментарий от anonymous

да, должен признать по другим ещё отзывам, что людей это конфузит, хотя должно было наоборот определённо указывать на то, что запускать, больше так делать не буду

eta ()
Ответ на: комментарий от MOPKOBKA

telegram

И флатпак.

vscode

Ненужно, есть вскодиум. Вскод тоже есть во флатпаке, хоть и неофициально.

jetbrains

Только недавно устанавливал пиэйчпишторм, скачал архив, распаковал, запустил, создал desktop entry (или как оно называется). Всё. Не понимаю, зачем им вообще нужен снап.

mail.ru

Знаю ровно 1 их программу.

letsencrypt

А у них там что?

snap

Мне нравится технология (хотя у неё есть недостатки), но снап централизован и не работает на системах без системд (хоть мне она и нравится, но я хотел бы, чтобы у людей был выбор).

fernandos ★★ ()
Ответ на: комментарий от fernandos

Только недавно устанавливал пиэйчпишторм, скачал архив, распаковал, запустил, создал desktop entry (или как оно называется). Всё. Не понимаю, зачем им вообще нужен снап.

Я вот тоже не понимаю, чем плох такой подход. Многие программы запускаются просто из распакованного архива. Зачастую в папке есть скрипт, который помещает .десктоп файл в локал/шаре/апликасьонс.

utanho ★★ ()
Ответ на: комментарий от utanho

Я вот тоже не понимаю, чем плох такой подход

Виндовс-вэй. Но я с вами согласен, если в этот архив запакованы все зависимости, то это неплохой способ дистрибуции ПО. Недостаток в том, что, чтобы получить программу, надо идти на сайт разработчика. Я считаю, что разработчикам стоит поддерживать такой способ установки программ + флатпак, не фокусируясь на дистрибутивоспецифичных пакетах.

fernandos ★★ ()

Делать пакеты - не дело автора. Выкладывай исходники, дистрибутивы сами опакетят. А твоим кривым и недоверенным пакетом никто пользоваться не будет.

slovazap ★★★★★ ()

В 2009 году я пользовался openSUSE 11.2. Мне не нравилось, что 11.2 стала первой версией системы, в которой нет KDE 3. А в GNOME2 почему-то нельзя выключить PulseAudio. Я думал, что PulseAudio это самое главное зло! Кто же знал, что потом появится Systemd.

Так вот, я так возмущался этому факту, что решил продолжать пользоваться openSUSE 10.2, которая была у меня установлена на другом разделе жёсткого диска. Ещё 32-битная даже.

Пользовался я пользовался, вдруг браузера нового не хватает. Я скачал с http://ftp.mozilla.org/pub/ - новую версию браузера. Распаковал в /usr/lib/firefox, заменив старую версию. Всё стало хорошо.

Но вот понадобилась мне программка Filezilla. На главной странице было написано, что бинарные сборки собраны в Debian 5. И я убедился в этом, попробовав запустить их. Ошибка! Требуется более новый Glibc или GCC, не помню.

Я пересобрал программу вручную. Она запустилась. И я подумал: а почему все разработчики программ не собирают свои программы в старых системах? Тогда бы они охватили диапазон систем, от новых, до старых!

Потом не запустилась игра Teeworlds. Я её тоже пересобрал. Потом не запустилась игра Вангеры. Тут уже ничего не поделаешь (исходники недоступны), и я обновился до актуальной на тот момент openSUSE 11.4. Когда мне Nxx сказал, что KDE 3 есть в репозитории KDE:KDE3.

Актуальная версия системы позволяла запускать любые новые программы. Заработал Google Chrome, Skype, движок Irrlicht для Minetest, движок Love для mari0. Когда вышел Steam, я подумывал обновиться до openSUSE 12.2, но оказалось достаточным установить Glibc из новой системы в старую.

Я задумался: почему нельзя просто пользоваться одной и той же системой лет 10, 20, без обновления. как Windows XP? Зачем, блин, постоянно обновляться? Я же не надрачиваю на новые версии системы, я в ней работаю - я, как пользователь, вообще не должен знать, что где-то там, в глубине, есть операционная система! Что такое операционная система? Скопировать файл, примонтировать флешку? А работаю я ежедневно в прикладном ПО, которое может вообще не меняться все эти годы!

Я уже вдоволь наобновлялся и нарадовался новым версиям системы. Стадия «обновления ради обновлений» для меня закончилась. Я когда-то самым первым скачивал Ubuntu 7.10, 8.04, 8.10, 9.04, 9.10. Потом надоело.

Я решил освоить технику сборки ПО таким образом, чтобы оно работало как в старой, так и в новой версии системы. Я решил посмотреть, как это делают другие.

Например игры из бандлов Humble Bundle. World of Goo, Gish, Braid, Aquaria, Cogs, VVVVVV, Osmos, Darwinia, UPLINK и прочие. Как их собирали?

Я увидел, что лежит скрипт запуска run_game.sh и директории lib32 и lib64. Внутри - libSDL и libopenal.

Что ж, формула успеха понятна. Компилируем бинарники в старом дистре, чтобы бинарники зависели от старой версии Glibc (2.4, 2.12 или 2.17). А также кладём вместе с ними - все нестандартные зависимости, которых может не оказаться у конечного пользователя!

В качестве базовой системы я выбрал CentOS 5. Для неё существовал прекрасный репозиторий, содержащий в себе актуальную на тот момент версию компилятора GCC. При этом, собирая программы при помощи нового GCC, мы получаем бинарники, которые работают даже в «ванильном» CentOS 5, в котором нет нового GCC. Магия какая-то...

Так я собрал dosbox-daum, pcsx2, firefox 45 и ещё пару прог. Мою сборку, кстати, нахваливал один пользователь ЛОРа. У него была Ubuntu 15.04, и официальные бинарники pcsx2 в ней не работали. А мои работали безупречно. Жаль, что потом этот пользователь начал меня обсирать из-под анонимуса, мол «пользуется старыми системами и собирает себе софт самостоятельно - не модный и отстойный чувак».

Короче, берёшь CentOS 7 и подключаешь репозиторий devtoolset. Специальной командой переключаешься на новый компилятор. Зависимости для сборки берёшь из репозитория EPEL. Готовый бинарник прогоняешь через ldd, получив список библиотек-зависимостей. Тебе не нужно тащить с программой - библиотеки Glibc, Xorg, GTK и много чего ещё, что и так обязано быть в системе у каждого. А какие-нибудь нестандартные библиотеки, такие как libboost, libicu, Qt6 - ты можешь упаковать вместе с программой, подцепляя их скриптом run.sh. И будет тебе максимально портабельная программа.

Отдельно стоит сказать про библиотеки libpng и libjpeg. Традиционно в Debian использовалась библиотека libpng12, даже если уже были доступны более новые libpng14, libpng15 и libpng16. Если ты слинковал программу с libpng12 - считай что в любой системе твоя программа будет работать. А теперь Debian мало того что перешёл на новую версию библиотеки, а ещё и старую удалил. Ну сволочи. Столько программ из-за этого «отвалилось». Как линковаться с libpng, я не знаю.

ZenitharChampion ★★★★★ ()
Последнее исправление: ZenitharChampion (всего исправлений: 6)
Ответ на: комментарий от ZenitharChampion

Традиционно в Debian использовалась библиотека libpng12, даже если уже были доступны более новые libpng14, libpng15 и libpng16. Если ты слинковал программу с libpng12 - считай что в любой системе твоя программа будет работать. А теперь Debian мало того что перешёл на новую версию библиотеки, а ещё и старую удалил.

Linux-way

Nxx ★★★★★ ()
Ответ на: комментарий от ZenitharChampion

Я задумался: почему нельзя просто пользоваться одной и той же системой лет 10, 20, без обновления. как Windows XP? Зачем, блин, постоянно обновляться?

не, так а вон, вся эта оцифровка информации производит иллюзию долговечности, но по факту ту же книгу там или картину можно через поколения передавать без потери качества, а приложение/игру спустя десять лет без эмулятора можно и не запустить, пробуй-компилируй код, если есть доступ. А языки тоже уходит в небытие, взяли, дропнули поддержку Python2.7, теперь тут гаврики бегают вокруг для которых это «устаревшее», хотя скока на нём понаписано ёмкого, что переписывать уже не будут, получится состояние навроде фортрана. И ладно бы к чему-то хорошему, но додуматься заставлять людей втыкать две лишние скобки вокруг распечатываемой информации - просто несправедливо, несправедливость, которую я чувствую при написании почти любой программы по много раз и не чувствую, когда мне нужен print() в качестве built-in function, то есть пока никогда

eta ()
Ответ на: комментарий от eta

не, так а вон, вся эта оцифровка информации производит иллюзию долговечности, но по факту ту же книгу там или картину можно через поколения передавать без потери качества, а приложение/игру спустя десять лет без эмулятора можно и не запустить,

Была такая хохма с какой-то древней книгой. Оцифровали ее, чтобы не утратить. Прошло 15 лет и цифровую копию не на чем почитать, в то время как оригинал прекрасно себя чувствует

utanho ★★ ()