Crystal & Alpine op de Raspberry Pi

Het samenbrengen van twee interessante technologieën:

  • Alpine Linux - een kleinschalige en op beveiliging gerichte Linux-distributie
  • Crystal - een gecompileerde taal met een mooie syntaxis (vergelijkbaar met Ruby)
  • op de Raspberry Pi (armhf / ARMv6, die ook de Pi Zero W zou ondersteunen)

is momenteel, per 21.12.2018, niet mogelijk.

Er is geen (althans geen gemakkelijke) manier om Crystal applicaties te cross-compileren voor de Raspberry Pi en Alpine Linux, van bijvoorbeeld x86 platformen, aangezien het noodzakelijke doel arm-linux-musleabihf wordt nog niet ondersteund.

Diverse achtergrondinformatie

Helaas is het niet mogelijk om Crystal op Alpine/ARM/Raspberry te compileren met gcc of iets dergelijks, omdat "om Crystal te compileren je Crystal nodig hebt" - de compilatie zal mislukken:

pitest:/usr/local/crystal/crystal# make
Gebruik makend van /usr/bin/llvm-config [version=5.0.1]
g++ -c -o src/llvm/ext/llvm_ext.o src/llvm/ext/llvm_ext.cc -I/usr/lib/llvm5/include -Os -founused-parameter
-Write-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-fdata-sections -Os
-fomit-frame-pointer -Os -DNDEBUG -fno-exceptions -DLLVM_BUILD_GLOBAL_ISD__STDC_LIMIT_MACROS
cc -fPIC -c -o src/ext/sigfault.o src/ext/sigfault.c
ar -rcs src/ext/libcrystal.a src/ext/sigfault.o
CRYSTAL_CONFIG_PATH="/usr/local/crystal/crystal/src" CRYSTAL_CONFIG_BUILD_COMMIT="74c65ce6b" lib

Je moet een kristal executable in je pad hebben!

make: *** [Makefile:123: .build/crystal] Fout 1

Het idee is dat je kristal cross-compileert op een andere architectuur, en het dan kan gebruiken om het natively te compileren.

Alpine Linux gebruikt musl, een alternatief libc.

Om de naam van de target te achterhalen (LLVM target triple), kan je llvm-config uitvoeren op het target systeem, zoals dit:

llvm-config -host-doel

Om dit commando op Alpine te kunnen uitvoeren, installeer je twee packages:

apk toevoegen llvm

apk toevoegen llvm-dev

Als je een doel probeert dat Crystal nog niet ondersteunt voor cross-compilatie, dan krijg je deze foutmelding:

in /usr/share/crystal/src/callstack.cr:3: while requiring "c/dlfcn": kan bestand 'c/dlfcn' niet vinden

Deze bibliotheken bevinden zich hier:

/usr/share/crystal/src/lib_c

Crystal wordt ondersteund op Alpine, op de aarch64 (ARM 64bit) en x86_64 platformen. (en x86 via portalier.com)

In het algemeen werkt cross-compileren met Crystal als volgt:

crystal build -release -cross-compile -target "aarch64-linux-musl" src/armtest.cr

het zal je een commandoregel geven om uit te voeren op de doelmachine:

cc 'armtest.o' -o 'armtest' -rdynamic -lpcre -lgc -lpthread /usr/share/crystal/src/ext/libcrystal.a -levent -lrt -L/usr/lib -L/usr/local/lib

Zie deze referenties: