Как стать автором
Поиск
Написать публикацию
Обновить

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

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

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

Теги:
Хабы:
Всего голосов 41: ↑39 и ↓2+51
Комментарии57

Публикации

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