Разработка

Crystal 0.26 на Raspberry PI (raspbian)


Опубликовано 16 октября, 2018

Установка Crystal 0.26 на Raspberry PI (raspbian).

Решил я на выходных поиграться с Arduino и построением веб-интерфейса к моим механизмам на платформе Rasberry PI. Можно было бы наклепать сайтик на Ruby и не писать эту статью, но по определенным причинам, я решил делать веб-сайт на Crystal — компилируемым ruby-like языке. Засучил рукава, открыл гугл и наткнулся на отличный ответ на stackoverflow, который мне здорово помог в моих изысканиях. Можно было бы удовлетвориться semi-официальному зеркалу Crystal и успокоиться, благо он встал в RPi словно всегда там и стоял. Но так как в репозитории была старая версия, то по определенным причинам, я решил пользоваться современнейшими технологиями и быть на острие прогресса, поэтому передо мной встала задача внедрить новейший Crystal в этот миниатюрно-мигающий, процессинговый оплот моих будущих экспериментов. Итоги моих мытарств я сейчас и изложу в кратком виде.

В нашем распоряжении

  • Компьютер с Debian GNU/Linux 9 (stretch), llvm-3.8
  • Raspberry Pi Zero, Raspbian GNU/Linux 9 (stretch), llvm-3.8
  • Решимость во что бы то ни стало пройти сквозь тернии к установленному Crystal-у

Общая схема действий такова: мы на нашем Debian скомпилируем object файл, перенесём его на raspbian, скомпилируем его там и наслаждаемся результатом. Самая главная мысль, которая проходит сквозь весь туториал — надо держать версии софта на обоих системах одинаковыми. Я кучу времени убил, пытаясь установить более новое ПО то тут, то там, но в итоге оставил софт, который уже был в пакетах.

Сначала установим на наш Debian Crystal нужной версии. Далее нужно провести предварительные ласки для Debian и для raspbian в виде установки обязательного программного обеспечения, общий список которых находится — тут.

Принимаем во внимание, что нам не нужно ставить BOEHM GC из исходников, у нас этим занимается пакет libgc-dev, который нужно поставить, если его нет.

Debian
  • Клонируем исходники crystal

user@debian ~/src $ git clone https://github.com/crystal-lang/crystal

user@debian ~/src $ cd crystal

  • Переключаемся из мастера в стабильную ветку

user@debian ~/src/crystal $ git checkout 0.26.1

  • Собираем объектный файл компилятора

user@debian ~/src/crystal $ make deps

user@debian ~/src/crystal $ ./bin/crystal build src/compiler/crystal.cr --cross-compile --target "armv6-unknown-linux-gnueabihf" --release -s -D without_openssl -D without_zlib

Если всё сделано правильно, то у нас в директории появится файл crystal.o. Половина дела сделана. Переходим к raspbian.

Raspbian
  • Повторяем действия как на debian

user@raspbian ~/src $ git clone https://github.com/crystal-lang/crystal

user@raspbian ~/src $ cd crystal

user@raspbian ~/src/crystal $ git checkout 0.26.1

user@raspbian ~/src/crystal $ make deps

  • Бережно переносим файл crystal.o на raspbian с debian.

user@raspbian ~/src/crystal $ scp user@debian:~/src/crystal/crystal.o .

  • Я решил взять расположение файлов как в Debian, чтобы было удобнее пользоваться компилятором (это обусловлено динамической линковкой компилятора — ему потребуется доступ к библиотекам и исходникам)

user@raspbian ~/src/crystal $ mkdir -p /usr/share/crystal /usr/lib/crystal/bin

user@raspbian ~/src/crystal $ cp -R src /usr/share/crystal/src

  • Компилируем! (обратите внимание, что строка линковки отличается от предлагаемой после создания crystal.o, потому что у нас несколько другое расположение папок и файлов)

user@raspbian ~/src/crystal $ cc 'crystal.o' -o '/usr/lib/crystal/bin/crystal' -rdynamic /usr/share/crystal/src/llvm/ext/llvm_ext.o `/usr/bin/llvm-config-3.8 --libs --system-libs --ldflags 2> /dev/null` -lstdc++ -lpcre -lm -lgc -lpthread /usr/share/crystal/src/ext/libcrystal.a -levent -lrt -ldl -L/usr/lib -L/usr/local/lib

В идеале здесь у вас должен скомпилироваться компилятор, если нет, проверьте шаги ранее, а может я просто ошибся в последовательности действий или забыл что-то очень важное. Но, предположим, что всё идёт по плану. Дальше нужно дать доступ другим пользователям до бинарника и добавить shards (bundler в кристальном мире).

  • Забираем shell-обвязку к компилятору c Debian (из-за динамической линковки компилятора)

user@raspbian ~/src/crystal $ scp user@debian:/usr/bin/crystal /usr/bin/crystal

user@raspbian ~/src/crystal $ cd ..

user@raspbian ~/src $ git clone https://github.com/crystal-lang/shards.git

user@raspbian ~/src $ cd shards

user@raspbian ~/src/shards $ git checkout v0.8.1

user@raspbian ~/src/shards $ crystal build src/shards.cr -o /usr/lib/crystal/bin/shards --release

user@raspbian ~/src/shards $ ln -s /usr/lib/crystal/bin/shards /usr/bin

Вуаля.

user@raspbian ~/src/shards $ crystal -v

user@raspbian ~/src/shards $ shards --version

Сноски

* так как я люблю создавать себе проблемы на пустом месте