Не так давно МЦСТ опубликовали кросскомпилятор для Эльбрусов. Это действительно важное событие в развитии платформы. Теперь для разработки под e2k не нужен ни свой Эльбрус, ни даже доступ к серверу на нем.
Для справки, кросскомпиляция — компиляция, при которой компилятор создает код для платформы, отличной от хостовой. Это удобно, так как процесс компиляции можно проводить на любом компьютере, а не только на устройстве с целевой архитектурой. В плане Эльбруса это позволяет проверять компилируемость вашего кода под e2k, добавлять сборку в свои ci/cd пайплайны, публиковать артефакты и релизы, не покупая свой сервер.
Это очень хороший шаг со стороны МЦСТ, ведущий к увеличению интереса к платформе. Теперь любой человек может собрать свой код под e2k и даже проверить его работу у себя на ПК. А о том, как сделать это, будет ниже. Я сделал Docker - контейнер со всем необходимым, так что вы можете развернуть всю среду в одну команду, и даже на Windows. Также я сделал скрипт для установки, если вы не любите контейнеры. И это не все, я сделал action для гитхаба, чтобы максимально упростить настройку ci.
Если вы итак все знаете и вам не интересно читать статью, то можете сразу перейти в репозиторий.
Ручная настройка среды
Установка компилятора
Сперва компилятор нужно скачать. Сделать это можно с сайта МЦСТ. В контейнере и в скрипте используется версия 5.5, так как сервера, к которым МЦСТ предоставляет доступ, собраны на E8C2, и для этих процессоров нужна эта версия компилятора. В ручной установке используется версия 6.5 для Е2С3.

Установите компилятор

Это можно сделать с помощью команды:
wget https://dev.mcst.ru/downloads/2025-03-30/cross-sp-rel-1.27.21.e2k-v6.5.10-e2c3_64.tgz
Скрытый текст
Если вы будете читать эту статью через какое-то время, то версия компилятора скорее всего изменится, и команды будут нуждаться в корректировке.
Дополнительно можете проверить хэш - суммы архива:
Стрибог:

Sha512:

После скачивания архива распакуйте его. В архиве будет каталог opt, в котором будет папка mcst. Вы должны поместить mcst в свою директорию opt.

Для этого выполните следующие команды:
tar -xzvf cross-sp-rel-1.27.21.e2k-v6.5.10-e2c3_64.tgz
sudo mv opt/mcst /opt
Теперь для проверки установки можно написать простую программу и попробовать собрать ее, но предварительно нужно обновить path. Для этого выполните следующую команду:
export PATH=$PATH:/opt/mcst/lcc-1.27.21.e2k-v6.5.10-e2c3/bin/
Она обновит path вашей терминальной сессии. Для проверки вызовите команду lcc
и посмотрите на вывод.

Теперь можно написать простую программу и попробовать скомпилировать ее.

Отлично, мы ее собрали, но как запустить ее? У меня есть доступ к серверу на Эльбрусе, получить его достаточно просто. Нужно просто подать заявку на сайте. Этот процесс может затянуться до 7 дней. Я советую получить доступ, но сейчас можно обойтись и без этого.
Установка qemu-e2k
Для запуска программ, собранных под e2k можно использовать qemu-e2k. Это не совсем e2k. Посмотрим ALT Linux Wiki.
На x86 можно воспользоваться программным эмулятором qemu-e2k от сообщества, который, по словам сотрудника МЦСТ, "эмулирует что-то напоминающее архитектуру эльбрус" (при этом для ряда практических задач уже вполне пригоден).
Но для нас, скорее всего, этого будет достаточно. Поэтому расскажу про этот способ. К сожалению, готовых бинарных файлов нет даже в aur, поэтому придется собирать руками. Но это на самом деле несложно.
Перейдите на гитхаб проекта и склонируйте его с помощью команды:
git clone https://github.com/OpenE2K/qemu-e2k.git
Для сборки требуется ninja.
Скрытый текст
Список необходимых на Ubuntu пакетов:
build-essential
ninja-build
python3
python3-pip
libglib2.0-dev
Теперь можно собрать проект с помощью следующих команд:
cd qemu-e2k
git checkout e2k
mkdir build
cd build
../configure --target-list=e2k-linux-user --static --disable-capstone --disable-werror
nice ninja
Можно добавить бинарный файл qemu-e2k в /usr/local/bin, чтобы он был доступен из любого места.
sudo cp qemu-e2k /usr/local/bin
Теперь можно запускать нашу программу:

Что-то не получилось. Дело в том, что программа собрана не статически и она пытается подгрузить системные библиотеки. Они загружаются по стандартным путям, по которым у нас в системе лежат библиотеки под нашу архитектуру. Если мы соберем программу с ключом -static, то все заработает.

Но для динамической линковки тоже есть выход, нужно использовать ключ -L при вызове qemu-e2k и передать путь к директории fs внутри компилятора.

Команда для запуска:
qemu-e2k -L /opt/mcst/lcc-1.27.21.e2k-v6.5.10-e2c3/fs/ a.out
Вместо использования ключа, можно использовать переменную окружения QEMU_LD_PREFIX. Поместите в нее путь к fs вашего компилятора.
Если вы не хотите каждый раз устанавливать руками системные переменны, то можете добавить все эти настройки в ваш .bashrc или .zshrc. Также можно создать алиас для вызова qemu, например так:
alias e2k='qemu-e2k -L /opt/mcst/lcc-1.27.21.e2k-v6.5.10-e2c3/fs'
Скрипт
Склонируйте репозиторий к себе на компьютер.
git clone https://gitflic.ru/project/mrognor/lcc-env.git

Теперь нужно перейти в репозиторий и вызвать скрипт install.sh. Установка может занять довольно много времени.
cd lcc-env
sudo ./install.sh

Установка удалась

Прочитаем новый enviroment и попробуем запустить и собрать программку.

Контейнер
Из репозитория вам потребуется скрипт для удобного запуска контейнера. Вы можете использовать только скрипт, но я буду использовать весь репо.
Установите контейнер из registry с помощью команды:
docker pull registry.gitflic.ru/project/mrognor/lcc-env/lcc-container

Теперь можно запустить контейнер с помощью скрипта container.sh или container.bat и собрать программку.


Github Actions
Для гитхаба добавления в Github Actions можно взять готовый action, доступный в маркетплейсе. Если он вас не устраивает, то я расскажу как можно сделать всё руками.
Action из маркетплейса
Создайте новый action через сайт и найдите в поиске lcc env.

После этого вам надо будет скопировать содержимое action и вставить в шаги вашей джобы.

После этого ваш yml файл будет выглядеть примерно так:
name: C/C++ CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: lcc env
uses: mrognor/lcc-env-action@0.1.0
# Amd 64 section
- name: Build amd64 code
run: make
- name: Run amd64 code
run: ./main
- name: Check file info
run: file main
# E2k section
- name: Build e2k code
run: |
export CC=lcc
export CXX=l++
make
- name: Run e2k code
run: e2k main
- name: Check file info
run: file main
Этот action скачает и установит все необходимое в ваш контейнер, после него можно будет пользоваться командами lcc, l++ и e2k.
Ручное использование
Большая часть повторяет создание Dockerfile или скрипта, но тут добавляется передача нужных файлов из одной джобы в другую. Это делается через cache.
name: C/C++ CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
lcc_env:
env:
lcc_link: https://dev.mcst.ru/downloads/2025-03-30/cross-sp-rel-1.27.21.e2k-v5.5.10_64.tgz
lcc_tarname: cross-sp-rel-1.27.21.e2k-v5.5.10_64.tgz
lcc_dirname: lcc-1.27.21.e2k-v5.5.10
name: Install lcc and qemu-e2k
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Install all requirements
- name: Install packages
run: |
sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt-get install -y build-essential ninja-build git python3 python3-pip pkg-config libglib2.0-dev && pip install tomli
# Install lcc crosscompiler
- name: Download lcc
run: wget ${lcc_link}
- name: Unzip lcc
run: tar -xzvf ${lcc_tarname}
- name: Install lcc
run: mv ./opt/mcst /opt
- name: Clear after lcc install
run: rm -r ${lcc_tarname} opt
- name: Add lcc bin dir to PATH
run: |
ln -sf /opt/mcst/${lcc_dirname}/bin/lcc /usr/local/bin/lcc
ln -sf /opt/mcst/${lcc_dirname}/bin/l++ /usr/local/bin/l++
# Install qemu-e2k
- name: Clone qemu-e2k
run: git clone https://github.com/OpenE2K/qemu-e2k.git && cd qemu-e2k && git checkout e2k
- name: Configure qemu-e2k
run: cd qemu-e2k && mkdir build && cd build && ../configure --target-list=e2k-linux-user --static --disable-capstone --disable-werror
- name: Build qemu-e2k
run: cd qemu-e2k/build && nice ninja
- name: Install qemu-e2k
run: |
cp qemu-e2k/build/qemu-e2k /usr/local/bin
echo "#!/bin/bash" > /usr/local/bin/e2k
echo "qemu-e2k -L /opt/mcst/${lcc_dirname}/fs \$1" >> /usr/local/bin/e2k
chmod +x /usr/local/bin/e2k
- name: Clear qemu-e2k
run: rm -r qemu-e2k
# Save all files to cache
- uses: actions/cache@v4
with:
path: |
/opt/mcst
/usr/local/bin/e2k
/usr/local/bin/qemu-e2k
/usr/local/bin/lcc
/usr/local/bin/l++
key: cache-${{ github.run_id }}-${{ github.run_attempt }}
build:
needs: lcc_env
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/cache/restore@v4
with:
path: |
/opt/mcst
/usr/local/bin/e2k
/usr/local/bin/qemu-e2k
/usr/local/bin/lcc
/usr/local/bin/l++
key: cache-${{ github.run_id }}-${{ github.run_attempt }}
- name: Make gcc-amd64
run: make && mkdir gcc-amd64 && mv main gcc-amd64
- name: Run tests on amd64
run: ./gcc-amd64/main
- name: Make lcc-e2k
run: |
export CXX=l++
export CC=lcc
make
mkdir lcc-e2k
mv main lcc-e2k
- name: Run tests on e2k
run: e2k ./lcc-e2k/main
- uses: actions/upload-artifact@v4
with:
name: BuildArtifacts
path: .
Используйте джобу lcc_env для установки всего необходимого, а для переноса файлов в ваши джобы используйте actions/cache/restore@v4.
Вывод
Я попробовал пособирать разные свои проекты, и многое собирается и даже работает в qemu, но без проблем не обошлось. Соберется ли и заработает ли ваш проект? Попробуйте собрать и запустить, только так можно узнать.
В любом случае это большой шаг вперед для всей платформы и, я надеюсь, МЦСТ и дальше будет открываться людям.
Источники
Сайт для разработчиков от МЦСТ - тут
Исходный код qemu-e2k - тут
Инструкция по настройке qemu-e2k - тут