LINUX.ORG.RU

Дистрибутивы с кросс-компиляцией

 


1

1

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

Однако обнаружил, что, похоже, в классических дистрибутивах, поимимо deb-based, в целом нет поддержки одновременной установки пакетов/библиотек разных архитектур и встроенных инструментов кросс-компиляции в сборочной системе и пакетном менеджере.

Так ли это, или я недостаточно хорошо искал?

Иными словами, в Debian я могу собрать пакет на x86_64 для ARM64 с помощью двух команд:

apt build-dep hello:arm64
dpkg-buildpackage -a arm64

Первая установит зависимости для сборки пакета под архитектуру ARM64 из репозиториев, вторая — соберёт его кросс-компилятором и упакует в пакет.

Для этого не нужно бутстрапить отдельный ARM chroot, gcc sysroot; библиотеки для arm64 установятся в /usr/lib/aarch64-linux-gnu и не будут мешать нативным, находящимся в /usr/lib/x86_64-linux-gnu/. Все программы, исполняющиеся во время сборки, скомпилированы под нативную архитектуру.

Вопрос: есть ли подобное в других дистрибутивах? Более широко: как эффективно кросс-компилировать пакеты в Fedora/RHEL/AlmaLinux и других, т.е. использовать бинарные зависимости из репозиториев, а не компилировать их самостоятельно в своём sysroot, и не запускать компиляторы в qemu-user?

★★★★★

Последнее исправление: ValdikSS (всего исправлений: 2)

В Arch Linux есть:

Репозиторий          : extra
Название             : aarch64-linux-gnu-gcc
Версия               : 15.1.0-2
Описание             : The GNU Compiler Collection - cross compiler for ARM64 target
Архитектура          : x86_64
URL                  : https://gcc.gnu.org/
Лицензии             : GPL  LGPL  FDL
Группы               : Нет
Предоставляет        : Нет
Зависит от           : aarch64-linux-gnu-binutils  aarch64-linux-gnu-glibc  libmpc  zlib  libisl  zstd
Доп. зависимости     : Нет
Конфликтует с        : Нет
Заменяет             : Нет
Размер загрузки      : 82,96 MiB
Установленный размер : 378,21 MiB
Сборщик              : Robin Candau <antiz@archlinux.org>
Дата сборки          : Чт 17 июл 2025 14:09:34
Проверен             : SHA-256  Подпись

Репозиторий          : extra
Название             : arm-none-eabi-gcc
Версия               : 14.2.0-1
Описание             : The GNU Compiler Collection - cross compiler for ARM EABI (bare-metal) target
Архитектура          : x86_64
URL                  : https://gcc.gnu.org/
Лицензии             : GPL  LGPL  FDL
Группы               : Нет
Предоставляет        : Нет
Зависит от           : arm-none-eabi-binutils  zlib  libmpc  libisl  zstd
Доп. зависимости     : arm-none-eabi-newlib: Standard C library optimized for embedded systems
Конфликтует с        : Нет
Заменяет             : Нет
Размер загрузки      : 237,83 MiB
Установленный размер : 1769,30 MiB
Сборщик              : Anatol Pomozov <anatolik@archlinux.org>
Дата сборки          : Пн 25 ноя 2024 03:41:15
Проверен             : SHA-256  Подпись

Репозиторий          : extra
Название             : lm32-elf-gcc
Версия               : 14.1.0-1
Описание             : The GNU Compiler Collection - cross compiler for LatticeMico32 (bare-metal) target
Архитектура          : x86_64
URL                  : https://gcc.gnu.org/
Лицензии             : GPL-3.0-with-GCC-exception AND GFDL-1.3-or-later
Группы               : Нет
Предоставляет        : Нет
Зависит от           : lm32-elf-binutils  zlib  libmpc  libisl  zstd
Доп. зависимости     : lm32-elf-newlib: Standard C library optimized for embedded systems
Конфликтует с        : Нет
Заменяет             : Нет
Размер загрузки      : 38,71 MiB
Установленный размер : 554,43 MiB
Сборщик              : Filipe Laíns <lains@archlinux.org>
Дата сборки          : Ср 05 июн 2024 03:35:44
Проверен             : SHA-256  Подпись

Репозиторий          : extra
Название             : nds32le-elf-gcc
Версия               : 14.1.0-1
Описание             : The GNU Compiler Collection - cross compiler for Andes 32 little-endian (bare-metal) target
Архитектура          : x86_64
URL                  : https://gcc.gnu.org/
Лицензии             : GPL-3.0-with-GCC-exception AND GFDL-1.3-or-later
Группы               : Нет
Предоставляет        : Нет
Зависит от           : nds32le-elf-binutils  zlib  libmpc  libisl  zstd
Доп. зависимости     : nds32le-elf-newlib: Standard C library optimized for embedded systems
Конфликтует с        : Нет
Заменяет             : Нет
Размер загрузки      : 58,41 MiB
Установленный размер : 353,66 MiB
Сборщик              : Filipe Laíns <lains@archlinux.org>
Дата сборки          : Ср 05 июн 2024 03:37:13
Проверен             : SHA-256  Подпись

Репозиторий          : extra
Название             : or1k-elf-gcc
Версия               : 14.1.0-1
Описание             : The GNU Compiler Collection - cross compiler for OpenRISC 1000 (bare-metal) target
Архитектура          : x86_64
URL                  : https://gcc.gnu.org/
Лицензии             : GPL-3.0-with-GCC-exception AND GFDL-1.3-or-later
Группы               : Нет
Предоставляет        : Нет
Зависит от           : or1k-elf-binutils  zlib  libmpc  libisl  zstd
Доп. зависимости     : or1k-elf-newlib: Standard C library optimized for embedded systems
Конфликтует с        : Нет
Заменяет             : Нет
Размер загрузки      : 30,53 MiB
Установленный размер : 335,39 MiB
Сборщик              : Filipe Laíns <lains@archlinux.org>
Дата сборки          : Ср 05 июн 2024 03:37:27
Проверен             : SHA-256  Подпись

Репозиторий          : extra
Название             : riscv64-elf-gcc
Версия               : 14.1.0-1
Описание             : The GNU Compiler Collection - cross compiler for RISCV64 (bare-metal) target
Архитектура          : x86_64
URL                  : https://gcc.gnu.org/
Лицензии             : GPL-3.0-with-GCC-exception AND GFDL-1.3-or-later
Группы               : Нет
Предоставляет        : Нет
Зависит от           : riscv64-elf-binutils  zlib  libmpc  libisl  zstd
Доп. зависимости     : riscv64-elf-newlib: Standard C library optimized for embedded systems
Конфликтует с        : Нет
Заменяет             : Нет
Размер загрузки      : 117,05 MiB
Установленный размер : 667,18 MiB
Сборщик              : Filipe Laíns <lains@archlinux.org>
Дата сборки          : Ср 05 июн 2024 03:37:19
Проверен             : SHA-256  Подпись

Репозиторий          : extra
Название             : riscv64-linux-gnu-gcc
Версия               : 15.1.0-2
Описание             : Cross compiler for 32-bit and 64-bit RISC-V
Архитектура          : x86_64
URL                  : https://gcc.gnu.org/
Лицензии             : GPL  LGPL  FDL
Группы               : risc-v
Предоставляет        : Нет
Зависит от           : riscv64-linux-gnu-binutils  riscv64-linux-gnu-glibc  gcc-libs  glibc  gmp  libisl  libisl.so=23-64  libmpc  mpfr  libmpfr.so=6-64  zlib  libz.so=1-64  zstd  libzstd.so=1-64
Доп. зависимости     : Нет
Конфликтует с        : Нет
Заменяет             : Нет
Размер загрузки      : 96,77 MiB
Установленный размер : 556,24 MiB
Сборщик              : Robin Candau <antiz@archlinux.org>
Дата сборки          : Чт 17 июл 2025 16:00:54
Проверен             : SHA-256  Подпись

Репозиторий          : extra
Название             : ruby-rake-compiler-dock
Версия               : 1.10.0-1
Описание             : Easy to use and reliable cross compiler environment for building Windows, Linux, Mac and JRuby binary gems
Архитектура          : any
URL                  : https://github.com/rake-compiler/rake-compiler-dock
Лицензии             : MIT
Группы               : Нет
Предоставляет        : Нет
Зависит от           : ruby
Доп. зависимости     : Нет
Конфликтует с        : Нет
Заменяет             : Нет
Размер загрузки      : 44,21 KiB
Установленный размер : 188,01 KiB
Сборщик              : Andreas Schleifer <segaja@archlinux.org>
Дата сборки          : Сб 25 окт 2025 15:01:31
Проверен             : SHA-256  Подпись

Но проще это организовать в source-based дистрибутивах, там уже под кросс-комиляцию многое подготовлено обычно. Вот один из случаев кросс-компиляции в Арче, но то было организовать сравнительно просто – всё необходимое было в репозиториях.

yars068 ★★★★★
()
Ответ на: комментарий от yars068

Т.е. из коробки полноценного multi-arch нет более нигде? В других дистрибутивах придётся что-то дополнительно собирать руками и патчить спецификации сборки пакетов имеющейся архитектуры под целевую?

Кроме разве что ubuntu, но в данном ключе этот тот же Debian.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от Pierre_Dolle

Для другой архитектуры, эмулировать через qemu-user? Это очень медленно, примерно в 5-6 раз медленней нативного выполнения. Сильно повлияет на скорость компиляции.

ValdikSS ★★★★★
() автор топика
Ответ на: комментарий от yars068

Это же только кросс-компилятор, он есть в любом более-менее устоявшемся дистрибутиве.

У меня есть программа с 3 зависимостями, присутствующая в репозитории ArchLinux. Что мне сделать, чтобы собрать её на x86_64 для ARM64, не компилируя эти зависимости вручную для ARM64 (не создавая свой sysroot)?

В Debian достаточно указать архитектуру пакета при apt install, чтобы он скачался и установился. Библиотеки и заголовочные файлы разных архитектур не конфликтуют.

ValdikSS ★★★★★
() автор топика
Ответ на: комментарий от ValdikSS

В общем, нужно установить binutils, gcc, glibc, linux-api-headers для целевой платформы на машину, на которой будет производиться компиляция, для aarch64, например, это следующие пакеты:

aarch64-linux-gnu-binutils
aarch64-linux-gnu-gcc
aarch64-linux-gnu-glibc
aarch64-linux-gnu-linux-api-headers

Нужно установить их, внести необходимые изменения в PKGBUILD-ы пакетов и makepkg.conf и собрать, как в шаге 7 выше по ссылке.

yars068 ★★★★★
()
Последнее исправление: yars068 (всего исправлений: 3)
Ответ на: комментарий от yars068

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

Ваш пример по ссылке показывает, что архитектурно кросс-компиляция не поддерживается: makepkg не может сам указать PKGBUILD’у нужный компилятор в переменных окружения, удостовериться, что будут использоваться правильные заголовочные файлы, а вам приходится модифицировать файл вручную.

В Debian не нужно редактировать сборочные файлы, за настройку среды сборки отвечает dpkg-buildpackage. Он делает буквально всё: от конфигурирования пакета до его сборки и установки.
Система сборки Debian сама определяет сборочную среду пакета (autotools, cmake, qmake, meson/ninja, ant, python distutils, и т.п.), настраивает переменные окружения с компиляторами и флагами, а если нужна кросс-компиляция, подсовывает необходимые настройки сама (для cmake/qmake это toolchain-файл, для других систем это необходимые флаги).

Но ДО процесса компиляции нужно ещё установить зависимости. В Debian библиотеки собраны так, что каждая использует свой архитектурно-зависимый путь в /usr/lib/[arch], и поэтому не конфликтует с такими же библиотеками другой архитектуры. В ArchLinux, полагаю, придётся либо компилировать библиотеку самостоятельно и указывать её путь флагами компиляции, либо скачивать готовую и распаковывать в нестандартную папку, и также указывать её путь в -I, -L.

В Fedora, например, есть поддержка x86_64 и i686 multilib: первые устанавливаются в /usr/lib64, вторые в /usr/lib. Но, похоже, третью архитектуру, aarch64, так не установить, в пакетах используются те же /usr/lib[64].

ValdikSS ★★★★★
() автор топика
Ответ на: комментарий от yars068

Нужно установить их, внести необходимые изменения в PKGBUILD-ы пакетов и makepkg.conf и собрать, как в шаге 7 выше по ссылке.

Вы хотите пересобрать Firefox под ARM64 с дополнительным патчем, на вашем Intel-компьютере. У Firefox 56 зависимостей. Как вы поступите?

ValdikSS ★★★★★
() автор топика
Ответ на: комментарий от ValdikSS

Ну, тут особых вариантов нету, разве что distcc прикрутить, и то, не факт, что он прям сильно увеличит скорость компиляции всего этого добра. Да, придётся либо ставить виртуалку с бинарниками под целевую платформу, либо собирать-ставить все необходимые зависимости в виде пакетов. Наверное, лучше всё же именно последнее, так как это не добавит накладных расходов по сравнению с виртуалкой.

yars068 ★★★★★
()
Последнее исправление: yars068 (всего исправлений: 1)
Ответ на: комментарий от yars068

Вот, к примеру я собирал asterisk на Debian под armhf (RPI3) с Debian 12.

# Добавить srс репозитории
vim /etc/apt/sources.list.d/debian.sources
dpkg --add-architecture armhf
apt update
apt install -y dpkg-dev devscripts debhelper dirmngr build-essential crossbuild-essential-armhf gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf pkg-config
mkdir src
cd src
dget http://ftp.debian.org/debian/pool/main/a/asterisk/asterisk_22.6.0~dfsg+~cs6.15.60671435-1.dsc
cd asterisk-22.6.0~dfsg+~cs6.15.60671435/
apt-get build-dep -y --arch-only -a armhf .
apt-cache policy libc6:armhf
apt-cache policy libopenr2-dev:armhf
apt-cache policy binutils-dev:armhf
apt-cache policy perl:armhf
apt-cache policy portaudio19-dev:armhf
apt-cache policy systemd-dev:armhf
apt install -y libxml2-dev libxml2-dev:armhf libxml2:armhf
vim debian/control
dpkg-checkbuilddeps
debuild -B -a armhf -b -uc -us

Какие-то нюансы пропустил, но в целом примерно так. Ничего собирать отдельно не пришлось. С учётом, что asterisk в репозитории Debian 12 вообще нет. Все патчи применились, проверки так же прошли успешно. Правки в control - убрана зависимость systemd-dev или что-то вроде того, в 12 версии по другому. dsc файл был или из sid или из unstable.

Ещё правки changes, чтобы написано было то, что мне нужно.

Сборка проводилась в docker контейнере, чтобы потом из основной системы не нужно было удалять более не требующиеся мне пакеты, образ контейнера на базе Debian 12.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Я собираю под отдельным юзером, а пакеты легко и непринуждённо удаляются pacman -Rncs, или pacman -Rnd. Впрочем, у pacman есть ключ --arch, но я им не пользовался, так как в документации, в частности, в man его описание крайне скупо.

Ну и, насколько вижу, править сборочные файлы есть нужда, так она частенько нужна.

yars068 ★★★★★
()
Последнее исправление: yars068 (всего исправлений: 1)
Ответ на: комментарий от firkax

Так в любом линуксе можно, вопрос только в размере напильника. Это хорошо, что в Debian разработчики провели такую большую работу по облегчению кросс-компиляции (и компиляции в целом), но иногда лучше-проще сделать всю работу самому, и для этого подходят source-based дистрибутивы, вот там всё максимально оптимизировано для сборки из исходников.

yars068 ★★★★★
()