Вместо вступления
Начнем с конца — немного ссылок:
- https://github.com/wfarr/pkgsrc/blob/master/doc/HOWTO-use-crosscompile
- https://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/doc/HOWTO-use-crosscompile
- https://www.netbsd.org/gallery/presentations/riastradh/asiabsdcon2015/pkgsrc-cross-paper.pdf
Ну и собственно, на сколько я понял, планы: https://wiki.netbsd.org/projects/project/cross_nb_pkgsrc/.
Ссылки расставлены, на мой взгляд, в порядке полезности. Из них следует что pkgsrc в частности и netbsd в целом кросс-компиляция находится в экспериментальном режиме, имеются известные проблемы, как то невозможность собрать perl, python и в следствии зависимостей от этих пакетов, еще примерно три четверти пакетной базы pkgsrc в режиме кросс-компиляции. Альтернативой может послужить сборка пакетов на bare metal, либо посредством qemu. Прямым следствием такого положения вещей, является отсутствие пакетов к примеру для hppa/hp700. Видимо, железа мало, qemu нет, и как результат — пакетов нет. К слову о железе, на Sparc Classic какой-нибудь Perl 5 собирается двое суток, QT4 — больше недели. Собирается без проблем.
Наши бараны
PA-RISC based машина у меня есть, равно как и Alpha based и Sparc64 based, но играю чаще всего я в Sparc32 (sparc) просто из-за того, что мой Sparc Classic очень маленький и не занимает много места, находясь под руками, поэтому, кросс-компиляцию я буду описывать на примере архитектуры sparc. Так же, выбор этой архитектуры связан с тем, что официально собранных пакетов (для pkgsrc-2020Q3 на момент написания статьи) для архитектуры amd64 аж 22369 штук, для sparc64 — 19848, а для sparc — менее 14 тысяч. Причем отсутствие Firefox или SuperPi в общем понятно, а вот отсутствие mc — нет. Лицензия? Так под amd64 это не помешало 🙂 В любом случае, кросс-компиляция позволит дополнительно собрать минимум три сотни пакетов, которые отсутствуют в официальном хранилище (в зависимости от версии ОС и pkgsrc у меня собиралось обычно около 4 тысяч пакетов, почти 4 сотни из которых отсутствовали в официальном наборе).
Построение системы
Шаг 0. Установка
В качестве базы я использовал виртуальную машину с четырьмя процессорными тредами, одним терабайтом дискового пространства и двумя гигабайтами оперативной памяти. Для попытки построения полного набора пакетов потребуется минимум 200GB дискового пространства, а вот много процессорных тредов или оперативной памяти совершенно не нужно. Так же, необходимо постоянное и не медленное подключение к сети Интернет.
Размер некоторых «пакетов» удивляет:
Здесь важно отметить, что pkgsrc это «как порты», а не «как сизиф». Непосредственно исходников в архиве pkgsrc-2020Q4.tar.gz нет, или почти нет, только правила для сборки. И для того, чтобы собрать тему оформления (icon theme) порой нужно собрать ImageMagick7… convert нужен. А для другой темы — ImageMagick 6. Тоже нужен convert, представляете? Ну да Бог им судья…
В качестве ОС использовалась NetBSD версии 9.1 для архитектуры x86-64. Установка штатная (всё место кроме свопа под корень), с включением ssh, созданием пользователя, настройкой сети на автоматическое получение реквизитов и пр. На этапе установки pkgsrc не конфигурировался. В общем, всё стандартно для NetBSD. Если на этапе установки возникают проблемы, наверное не стоит браться за реализацию кросс-компиляции.
Далее, в силу каких-то неведомых мне причин, скорость доступа до ftp.netbsd.org у меня очень маленькая, поэтому, я предварительно скачал sets, pkgsrc и пр. большие файлы и опубликовал их на своём ftp. Такой подход позволит сэкономить время в случае нескольких последовательных или параллельных разворачиваний системы. Тем не менее, далее, я буду использовать ссылки на официальные сайты netbsd.
Шаг 1. Заранее создаём mk.conf
mk.conf (/etc/mk.conf)
DISTDIR=/usr/distfiles
SKIP_LICENSE_CHECK=yes
ALLOW_VULNERABLE_PACKAGES=yes
USE_CROSS_COMPILE?= yes
USE_PKG_ADMIN_DIGEST?= no
PKG_DBDIR=/var/db/pkg
.if !empty(USE_CROSS_COMPILE:M[yY][eE][sS])
MACHINE_ARCH= sparc
TOOLDIR= /usr/obj/tooldir.NetBSD-9.1-amd64
CROSS_DESTDIR= /usr/obj/destdir.sparc
PACKAGES= ${PKGSRCDIR}/packages.${MACHINE_ARCH}
WRKDIR_BASENAME= work.${MACHINE_ARCH}
USE_CWRAPPERS= no
.endif
Шаг 2. Исходники
Делаем директории:
mkdir /usr/xsrc
mkdir /usr/obj
Качаем исходники
mget *.tgz
quit
Извлекаем:
> do
> tar -xzf $file -C /
> done
В результате /usr/src и /usr/xsrc заполнятся содержимым ПЯТИ архивов. Не надо извлекать только src.tgz и xsrc.tgz, оставшиеся три архива тоже извлекаются в /usr/src/
Необязательный момент
#mget *.tar.gz
#quit
#$ for file in *.tar.gz
#> do
#> tar -xzf $file -C /usr
#> done
Шаг 3. Собираем песочницу
./build.sh -m sparc tools
./build.sh -m sparc distribution
Шаг 4. Качаем и извлекаем pkgsrc
tar -xzvpf pkgsrc.tar.gz -C /usr
В результате /usr/pkgsrc заполнится содержимым архива pkgsrc-2020Q4.tar.gz
Шаг 5. Пробуем…
make package
pkg_add -m sparc /usr/pkgsrc/packages.sparc/All/cross-libtool-base-sparc-2.4.6nb5.tgz
Если сова натянулась на глобус и ничего нигде не затрещало, то всё должно работать. Можно сделать что-то типа:
и потом изредка посматривать на рост количества пакетов командой:
Да, не лишним будет отследить предложение системы сделать команду:
и собственно её сделать.
А вот если сова на глобус не натянулась то:
- Пробуем установить дайджест из /usr/pkgsrc/packages/All, а не из /usr/pkgsrc/packages.sparc/All, естественно удаляя прежний
- Если make package падает, пробуем «make package PKG_DBDIR=/var/db/pkg»
- Если забыли сделать unset PKG_PATH, то… надо сделать unset PKG_PATH
- И др. и пр. в зависимости от вывода системы и логов…
Известные проблемы:
- Perl
- Python
- Fortran
Выводы
Для себя я выбор сделал в пользу того, что на картинке ниже, но шпаргалка по кросс-компиляции тоже нужна…
[UPD]
Небольшая статистика по NetBSD 8.1 и pkgsrc 2019Q3:
1. Официально под архитектуру sparc собрано 13027 пакетов.
2. Кросс-компиляция на x86_64 машине позволила собрать 3985 пакетов (355 пакетов отсутствуют в официальном наборе).
3. Примерно за то же время нативно (qemu) собрано 2803 пакета (344 пакета отсутствуют как в официальном наборе, так и в наборе после кросс-компиляции).
Важно отметить что команда make package в директории /usr/pkgsrc в случае кросс-компиляции отработала полностью и неоднократно, в то время как компиляция посредством qemu просто была остановлена. В итоге получилось 13725 (на 698 больше чем 13027 официальных) пакетов и есть потенциал для увеличения их количества. В подсчёте количества пакетов могут быть небольие неточности в силу использованных инструментов, но в целом, было 13 тысяч, а стало на 700 больше, и это не предел… а вот три с половиной сотни прироста для кросс-компиляции — это наверное предел.
По результатам сборки pkgsrc 2020Q4 в среде NetBSD 9.1 запись будет дополнена, либо написана новая.