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:
- https://github.com/crystal-lang/crystal/issues/4391
- https://crystal-lang.org/docs/installation/from_source_repository.html
- https://irclog.whitequark.org/crystal-lang/2017-08-12
- https://github.com/TheKernelCorp/NuummiteOS (proof of concept OS kernel geschreven in Crystal)
- https://crystal-lang.org/docs/installation/on_alpine_linux.html
- http://public.portalier.com/alpine/ - pakketten voor x86 ook
- https://github.com/ysbaddaden/crystal-alpine
- https://wiki.musl-libc.org/supported-platforms.html
- https://github.com/ysbaddaden/crystal-alpine/issues/6
- https://github.com/crystal-lang/crystal/pull/5862 <- probleem over arm-linux-musleabihf
- https://github.com/crystal-lang/crystal/issues/5467
- https://pkgs.alpinelinux.org/packages?name=crystal&branch=edge <- pakketten door Jakub Jirutka voor Crystal, voor Alpine. Hij probeerde het ook voor armhf te bouwen, maar dat lukte niet
- https://elinux.org/images/e/eb/Transitioning_From_uclibc_to_musl_for_Embedded_Development.pdf <- interessante achtergrondinformatie over moslims