Adapted from https://tttapa.github.io/Pages/Raspberry-Pi/C++-Development/Building-The-Toolchain.html
Note that it is very difficult to just -v mapping the files on Windows and ditch the image building completely because crosstool-ng enforces strict file name cases.
SH4 Cross compilation environment for MAG 250 docker image!
My friend asked me if I can build a tiny C program for his Arduino pet project to be used on MAG250 TV set-top box which is quite old platform based on Renesas SH4 CPU and old Linux 2.6 environment with GLIBC 2.10, sure why not... Archeology is fun isn't it? So the first thing was that I haven't found any working tools, so in the process of hacking this stuff I made this docker image.
Fun facts discovered in the process:
- Because of environment restrictions I have to target GLIBC 2.10, the newest compiler that supports it is GCC 4.8.
- Stick with
libusb v1.0.22
, later versions requires C11 standard support which is not available in this setup - In this build I used
crosstool-ng v1.20.0
which seems to be the oldest version that supports building GLIBC 2.10 - Some older downloads are moved to a new locations, luckily crosstool-ng can use already downloaded archives
The following text is for my client but you should be able to understand the commands.
Доп пакеты apt install: (при ручной установке)
git cmake gcc flex bison bzip2 xz-utils unzip texinfo help2man wget file gawk libtool libtool-bin libncurses-dev
docker build ./ctng -t sh4cc
Далее дорабатываем напильником конфиг кросс компилятора если потребуется (идея взята с https://tttapa.github.io/Pages/Raspberry-Pi/C++-Development/Building-The-Toolchain.html)
# Rename the old configuration
cp /mnt/sh4-gcc48.config .config
# Upgrade the configuration
ct-ng upgradeconfig
# Customize the configuration
ct-ng menuconfig
# Overwrite the old configuration
cp .config /mnt/sh4-gcc48.config
exit
Кстати говоря исходный конфиг можно найти в crosstool-ng/samples/sh4-unknown-linux-gnu/crosstool.config
В меню нужно будет настроить версии системы и библиотек, это уже сделано в версии в репозитории.
Реальная сборка контейнера который будет содержать компиляторы
docker build . --build-arg="NGCONFIG=sh4-gcc48.config" -t sh4builder
После ДОООООЛГОЙ сборки можно либо установить полученный тулчейн на своей линукс системе либо просто собирать в докере
Собираем в докере:
- Качаем libusb и чекаутим в v1.0.22, в моем случае он будет находится в
D:/prog/cpp/libusb
Для начала монтируем локальный пути для доступа из докера, также понадобится собрать libusb
docker run -it --rm -v ${pwd}:/mnt/proj -v D:/prog/cpp/libusb:/mnt/libusb -v D:/prog/cpp/magtest/magtest:/mnt/magtest -t sh4builder bash
Большинство инструментов используют алиас CC в первую очередь и только потом ищут gcc в PATH, нам нужен именно наш кросс компилятор так что делаем так
export CC=/home/develop/x-tools/sh4-unknown-linux-gnu/bin/sh4-unknown-linux-gnu-gcc
Для сборки libusb придется отключить udev т.к. в старых ядрах его может тупо не быть
cd /mnt/libusb
mkdir build
cd build
../configure --host=x86_64-linux-gnu --target=sh4-unknown-linux-gnu --enable-udev=no --prefix=../.install
make
make install
Теперь можно собрать наш проект (пробный)
$CC -I/mnt/libusb/.install/include/libusb-1.0 main.c /mnt/libusb/.install/lib/libusb-1.0.a -std=c99 -lpthread -lrt -o testusb_sh4
с HTTP POST клиентом
$CC -I/mnt/libusb/.install/include/libusb-1.0 /mnt/magtest/magtest.c /mnt/magtest/ip.h /mnt/magtest/ip.c /mnt/libusb/.install/lib/libusb-1.0.a -std=c99 -lpthread -lrt -o testusb011
Тут можно было бы сделать makefile или еще что, но из-за 2 файлов и 1 библиотеки не хочется возиться с этим.