Как стать автором
Обновить

Эльбрус стал намного ближе

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров15K

Не так давно МЦСТ опубликовали кросскомпилятор для Эльбрусов. Это действительно важное событие в развитии платформы. Теперь для разработки под 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:

Sha хэш
Sha хэш

После скачивания архива распакуйте его. В архиве будет каталог 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 и посмотрите на вывод.

Рабочий lcc
Рабочий 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 и собрать программку.

Рабочий контейнер на Linux
Рабочий контейнер на Linux
Рабочий контейнер на Windows
Рабочий контейнер на Windows

Github Actions

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

Action из маркетплейса

Создайте новый action через сайт и найдите в поиске lcc env.

Установка lcc env action
Установка lcc env action

После этого вам надо будет скопировать содержимое 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 - тут

Теги:
Хабы:
+45
Комментарии50

Публикации

Истории

Работа

QT разработчик
6 вакансий
Программист С
41 вакансия
Программист C++
100 вакансий

Ближайшие события

19 марта – 28 апреля
Экспедиция «Рэйдикс»
Нижний НовгородЕкатеринбургНовосибирскВладивостокИжевскКазаньТюменьУфаИркутскЧелябинскСамараХабаровскКрасноярскОмск
23 апреля
Meetup DevOps 43Tech
Санкт-ПетербургОнлайн
24 апреля
VK Go Meetup 2025
Санкт-ПетербургОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань
14 мая
LinkMeetup
Москва
5 июня
Конференция TechRec AI&HR 2025
МоскваОнлайн
20 – 22 июня
Летняя айти-тусовка Summer Merge
Ульяновская область