Иногда хочется просто так пописать код под что-то экзотичное, ограниченное в ресурсах для расширения сознания. А в случае с PlayStation1 можно программировать и 3D графику, что вдвойне более весело.
Официальный PS1 SDK Psy-Q не удаётся удобно использовать, т.к. многие из утилит в тулчейне собраны под DOS, который был удалён из Windows 10+. Писать код в виртуальной машине не очень здорово, поэтому собрал себе GCC тулчейн для удобного программирования.
Собрал тулчейн на основе newlib со стандартной библиотекой C++. Изначально я так же собирал с поддержкой компилятора С++, но без стандартной библиотеки, что не очень удобно, т.к. многие стандартные файлы здорово иметь под рукой. Например, <new>, для использования placement new, или <type_traits>, <array> и т.п.
Так случается в жизни, что небходимо собрать С++ код, написанный по самым свежим стандартам, под систему, в которой (или для которой) доступны только компиляторы устаревшей версии.
В моём случае появилась необходимость получить cross компилятор GCC 11+ версии, собранный с glibc версии именно 2.27. И он обязательно должен знать о Debian multiarch для правильной сборки приложений под Ubuntu, RaspberryPi OS и т.п.
Конфиги в мануале собирают тулчейн с такими компонентами: gcc: 11.2.0 [C/C++] Linux kernel: 4.9.301 glibc: 2.27 gdb: 11.2
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.25.0.tar.bz2
tar -xf crosstool-ng-1.25.0.tar.bz2
rm crosstool-ng-1.25.0.tar.bz2
cd crosstool-ng-1.25.0
./configure --enable-local
make
Получение патча поддержки debian multiarch для binutils
Мои конфиги установят собранные тулчейны в директорию /crossbuild/toolchain Её необходимо предварительно создать и изменить владельца/разрешения так, чтоб пользователь, от имени которого будет запущен билд, имел доступ на запись и чтение в этой директории. Иначе можно поменять эту директорию в конфиге самостоятельно.
Проблемы во время сборки
После чего можно приступать уже к сборке тулчейнов, однако, она скорее всего не будет успешной конкретно с используемой мной версией crosstool-ng, т.к. он не сможет скачать исходники zlib. Выглядит это примерно так:
Исходники crosstool-ng я не хочу править, поэтому просто скачал требующуюся версию zlib сам и положил в папку кеша. Как видно из скриншота, crosstool-ng хочет zlib-1.2.12, качаем:
# В директории crosstool-ng-1.25.0
wget https://zlib.net/fossils/zlib-1.2.12.tar.gz -P .build/tarballs
cd /crossbuild/toolchain
tar -czf gcc11.2.0-aarch64-linux-gnu-kernel4.9.301-glibc2.27-gdb11.2.tar.gz ./gcc11.2.0-aarch64-linux-gnu-kernel4.9.301-glibc2.27-gdb11.2
tar -czf gcc11.2.0-arm-linux-gnueabihf-kernel4.9.301-glibc2.27-gdb11.2.tar.gz ./gcc11.2.0-arm-linux-gnueabihf-kernel4.9.301-glibc2.27-gdb11.2
Позже я расширю описание. Сейчас сохранил мануал для себя, чтоб не потерять результаты трудов )