doom2d.org

Главная база плоских морпехов
It is currently 05 Oct 2022, 09:45

All times are UTC + 3 hours




Post new topic Reply to topic  [ 4 posts ] 
Author Message
PostPosted: 20 Jun 2022, 15:55 
Offline
User avatar

Joined: 26 Jan 2020, 13:11
Posts: 13
Сборка Doom 2D: Forever под OS X. Часть 1 - Нативная Сборка

Итак, спустя полтора года с того момента, как я начал работать по этой теме (да, увы, так долго :roll: ), я наконец-то готов предоставить мануал, как собирать DF под OS X. Мануал будет разделен на две части, первая из которых будет описывать процесс сборки непосредственно на OS X, вторая - процесс кросс-компиляции под Linux'ом.

Небольшое предисловие

Сборка игры под OS X сопряжена с некоторыми проблемами, которые присущи данной платформе. Дело в том, что в OS X приложения чаще всего распространяются в формате готовых собранных бандлов - особым образом структурированных каталогов, содержащих бинарники, а также некоторые дополнительные необходимые файлы. DF требует для работы сторонние динамические библиотеки, которые, в случае дистрибутивов Linux можно установить из репозиториев пакетов. Поскольку в OS X нет встроенного менеджера пакетов, нам придется таскать библиотеки с собой, в составе бандла. Таким образом мы сможем получить переносимое приложение, которое можно просто скачать и запустить. Однако просто скопировать зависимые библиотеки и положить рядом с бинарником игры недостаточно, требуется явно указать для объектного файла Mach-O (будь то исполнимый файл или динамическая библиотека), где находятся его зависимости. Можно указывать пути вручную при помощи одного из инструментов Xcode Commandline Tools - install_name_tool, однако есть утилиты, позволяющие сделать это автоматически, заодно же и поместить нужные бинарники в указанный каталог внутри банлда. Одну из таких утилит - macdylibbundler, я буду использовать в этом мануале.

Переходим к практике. Все действия я произвожу на macOS 10.12.6 Sierra, с установленным Xcode Commandline Tools, git, MacPorts в качестве менеджера пакетов, fpc 3.0.4 (минимальная поддерживаемая версия, с fpc 3.2.2 (актуальный на момент написания этого мануала) все тоже должно работать).

Для начала необходимо получить необходимые библиотеки. Я буду собирать вариант с SDL2, SDL2_mixer и miniupnpc, также необходимо установить утилиту macdylibbundler. Для MacPorts команда на загрузку данных пакетов выглядит так:

Code:
$ sudo port install libsdl2 libsdl2_mixer miniupnpc macdylibbundler


Кроме данных библиотек, нам понадобится libenet. В пакетной базе MacPorts есть пакет libenet, но он не предоставляет динамической библиотеки, поэтому нам придется скомпилировать libenet вручную. Можно действовать прямо в соответствии с readme, за исключением скрипта configure - я указываю префикс /opt/local, чтобы библиотека после установки была рядом с остальными, установленными из MacPorts

Code:
$ git clone https://github.com/lsalzman/enet.git && cd enet
$ autoreconf -vfi
$ ./configure --prefix="/opt/local/" && make && make install


После этого можно собирать проект игры, копировать все необходимые файлы (бинарники, библиотеки и ресурсы игры) в бандл, по желанию его можно упаковать в DMG. Для автоматизации сборки на этом этапе я написал скрипт builder.sh, довольно корявый с моей точки зрения, но со своей функцией справляется. Его можно найти в моем репозитории вместе с некоторыми другими утилитами, написанными для сборки DF под OS X: https://github.com/fl0atingzero/df_osx_utils.git При запуске скрипта без флагов или с флагом -h появится краткое пояснение, как пользоваться скриптом. Перед использованием требуется минимальная модификация - можно указать, какую утилиту для упаковывания DMG использовать (mkisofs (пакет cdrtools в MacPorts) или genisoimage (в MacPorts не представлен)), а также расположение tmp и бандла. По умолчанию бандл будет внутри каталога macosx в корне проекта. При использовании скрипта требуется указать расположение каталога проекта и каталога ресурсов (можно распаковать win32-d2df-latest.zip):

Code:
./builder.sh -s /Users/vlad/projects/d2df-sdl/ -r /Users/vlad/windf/ -p -y


Вторая часть мануала несколько сложнее, она будет опубликована позже.

_________________
i486-linux-gnu

aka fl0atingzero


Top
 Profile  
 
PostPosted: 02 Jul 2022, 23:38 
Offline
User avatar

Joined: 26 Jan 2020, 13:11
Posts: 13
Сборка Doom 2D: Forever под OS X. Часть 2 - Кросс-компиляция под Linux'ом

Пришло время для второй части, в которой я рассмотрю кросс-компиляцию игры. Процесс будет немного более сложным, так как предварительно потребуется собрать кросс-компилятор и тулчейн. Все действия я буду производить на Arch Linux.

Для начала нам нужно собрать кросс-тулчейн osxcross. Общее описание сборки представлено в README.md в корне репозитория (https://github.com/tpoechtrager/osxcross), я рассмотрю процедуру для Arch. Для начала нужно установить зависимости:

Code:
# pacman -S base-devel fpc clang cmake libxml2 openssl cpio


После этого необходимо поместить в каталог tarballs запакованный Mac OS X SDK. Архив с SDK можно получить многими способами, но с моей точки зрения, проще всего взять нужный архив из данного репозитория - https://github.com/phracker/MacOSX-SDKs. Можно скачать уже заархивированный SDK: https://github.com/phracker/MacOSX-SDKs/releases, либо склонировать репозиторий и воспользоваться скриптом, который запакует все версии SDK, которые есть в репозитории:

Code:
$ git clone https://github.com/phracker/MacOSX-SDKs
$ cd MacOSX-SDKs
$ ./make-tarballs.sh


Я буду использовать SDK Mac OS X 10.8 (x86_64-apple-darwin12)
После того, как SDK скопирован в tarballs, можно собирать тулчейн, указав целевой каталог. Я буду устанавливать в /usr/local/osxcross:

Code:
$ cd osxcross
# TARGET_DIR=/usr/local/osxcross ./build.sh


Добавим /usr/local/osxcross в PATH

Теперь нужно собрать кросс-fpc. Для этого я скачаю исходники нужной мне версии и, собственно, соберу ее. CROSSBINDIR - путь к каталогу кросс-компилятора, CPU_TARGET и BINUTILSPREFIX зависят от выбранного SDK, целевой каталог установки в моем случае - /opt/cross:

Code:
$ curl -O ftp://ftp.hu.freepascal.org/pub/fpc/dist/3.2.2/source/fpc-3.2.2.source.tar.gz
$ tar -xzvf fpc-3.2.2.source.tar.gz
$ cd fpc-3.2.2
# make distclean && FPC=ppcx64 make crossall crossinstall \
CPU_TARGET=x86_64 OS_TARGET=darwin \
CROSSBINDIR=/usr/local/osxcross/bin/ BINUTILSPREFIX=x86_64-apple-darwin12- \
INSTALL_PREFIX=/opt/cross \
OPT="-gl -gw -godwarfsets -XX -CX -Xd -Fl/usr/local/osxcross/SDK/MacOSX10.8.sdk/usr/lib"


После этого нужно отредактировать fpc.cfg, добавив в него строки:

Code:
#IFDEF darwin
-Fu/opt/cross/lib/fpc/$fpcversion/units/x86_64-darwin/
-Fu/opt/cross/lib/fpc/$fpcversion/units/x86_64-darwin/*
-Fu/opt/cross/lib/fpc/$fpcversion/units/x86_64-darwin/rtl
-FD/usr/local/osxcross/bin/
#ENDIF


Также добавим /opt/cross/lib/fpc/3.2.2/ в PATH

Теперь склонируем репозиторий df_osx_utils с некоторыми sh-скриптами, удобными для кросс-компиляции:

Code:
$ git clone https://github.com/fl0atingzero/df_osx_utils.git


macportsutil.sh - скрипт, который может скачать нужные библиотеки под нужную версию Darwin и поместить их в указанный каталог. Кроме того, он может пропатчить скачиваемые библиотеки, заменяя пути зависимостей. Это временное, но необходимое решение, если требуется поместить библиотеки не в /opt/local/lib. Отредактируем скрипт, указав OUTDIR (в моем случае это ~/dfcross/libs), а также установив FLAG_D в 1, чтобы скрипт пропатчил библиотеки после загрузки и распаковки, после чего запустим его.

Далее нужно собрать dylibbundler и создать символические ссылки на otool и install_name_tool для его корректной работы:

Code:
$ git clone https://github.com/auriamg/macdylibbundler.git
$ cd macdylibbundler
$ make
$ sudo cp dylibbundler /usr/local/bin
$ ln -s /usr/local/osxcross/bin/{x86_64-apple-darwin12-otool,otool}
$ ln -s /usr/local/osxcross/bin/{x86_64-apple-darwin12-install_name_tool,install_name_tool}


После этого, как и в предыдущей части, нужно вручную собрать enet. Я указываю выходной каталог ~/dfcross/libs, чтобы собранные библиотеки оказались рядом с теми, что были скачаны при помощи macportsutil:

Code:
$ git clone https://github.com/lsalzman/enet/commits/master
# pacman -S autoconf
$ cd enet
$ autoreconf -vfi
$ ./configure \
    --host="x86_64-apple-darwin12" \
    --target="x86_64-apple-darwin12" \
    --prefix="/home/vlad/dfcross/libs" \
    --with-sysroot="/usr/local/osxcross/SDK/MacOSX10.8.sdk/" \
    CC=x86_64-apple-darwin12-clang


Теперь наконец-то можно собрать игру. Перед этим нужно отредактировать crossbuilder.sh, указав каталог с исходниками игры, каталог ресурсов (обычно это распакованный архив win32-d2df-latest.zip), каталог временных файлов, выходной каталог, а также утилиту для упаковки DMG (mkisofs или genisoimage).

После этого запускаем crossbuilder.sh
Code:
$ crossbuilder.sh

_________________
i486-linux-gnu

aka fl0atingzero


Top
 Profile  
 
PostPosted: 12 Jul 2022, 22:07 
Offline
Site Admin
User avatar

Joined: 17 Oct 2009, 23:43
Posts: 6820
Location: \\NEGRO
А сильно ли отличается вариант сборки для РРС-маков?

_________________
И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.


Top
 Profile  
 
PostPosted: 13 Jul 2022, 14:26 
Offline
User avatar

Joined: 04 Feb 2010, 14:42
Posts: 439
Location: Equestria
Jabberwock wrote:
А сильно ли отличается вариант сборки для РРС-маков?
для линукса нету готовых тулчейнов. на современных маках проще, там можно заюзать тулчейн из старого сдк.
но я уже работают над тулчейном. и уже имею рабочие кросскомпилированные сборки дф.
в целом действия примерно одинаковые.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 4 posts ] 

All times are UTC + 3 hours


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
doom2d.org, since 2007