Кросс-компиляция в Gentoo

В данном руководстве мы будем собирать пакеты с хостовой системой x86_64 под гостевую систему на базе arm64.

Установка нужных пакетов

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

# emerge -v crossdev

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

/etc/portage/repos.conf
[crossdev]
location = /usr/local/portage-crossdev
priority = 10
masters = gentoo
auto-sync = no
# mkdir -p /usr/local/portage-crossdev/metadata
# mkdir -p /usr/local/portage-crossdev/layout
/usr/local/portage-crossdev/metadata/layout.conf
masters = gentoo
thin-manifests = true
# echo 'crossdev' > /usr/local/portage-crossdev/profiles/repo_name
# emerge --sync

После чего соберём тулчейн для работы с требуемой архитектурой

# crossdev --stable -t aarch64-unknown-linux-gnu

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

# ebuild <ebuild> digest

на нужные ебилды. Как минимум binutils и gcc.

Настройка целевого chroot

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

Начинаем с гостевого make.conf

/usr/aarch64-unknown-linux-gnu/etc/portage/make.conf
ARCH="arm64" # Мы ведь собираем по 64 арм
FEATURES=buildpkg # Поскольку собираем не для себя, будем складывать в ${ROOT}/packages
USE="${ARCH} -pam -acl"
MAKEOPTS="-j5"
CFLAGS="" # Или какие-нибудь свои флаги, если найдёте

И настраиваем профиль

# cd /usr/aarch64-unknown-linux-gnu/etc/portage
# rm make.profile
# ln -s /usr/portage/profiles/default/linux/arm64/17.0/desktop/ make.profile

Для ускорения сборки я лично использую RAM, но это на любителя

# mount -o size=4G -t tmpfs tmpfs /usr/aarch64-unknown-linux-gnu/tmp/portage

После чего собираем basesystem (первая итерация, которая не соберёт часть пакетов, но об этом дальше)

# emerge-aarch64-unknown-linux-gnu -vu --keep-going @system