Crystal e Alpine su Raspberry Pi
Riunendo due tecnologie interessanti:
- Alpine Linux - una distribuzione Linux di piccole dimensioni e orientata alla sicurezza
- Crystal - un linguaggio compilato con una bella sintassi (simile a Ruby)
- sul Raspberry Pi (armhf / ARMv6, che supporterebbe anche il Pi Zero W)
non è possibile attualmente, a partire dal 21.12.2018.
Non c'è (almeno non c'è un modo facile) di cross-compilare applicazioni Crystal per il Raspberry Pi e Alpine Linux, da, per esempio, piattaforme x86, poiché il target necessario arm-linux-musleabihf non è ancora supportato.
Informazioni varie di sfondo
Purtroppo non è possibile compilare crystal su Alpine/ARM/Raspberry usando gcc o simili, poiché "per compilare Crystal hai bisogno di Crystal" - la compilazione fallirà:
pitest:/usr/local/crystal/crystal# make
Usando /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
Devi avere un eseguibile di cristallo nel tuo percorso!
make: *** [Makefile:123: .build/crystal] Errore 1
L'idea è che si compila in modo incrociato il cristallo su un'altra architettura, e poi lo si può usare per compilarlo nativamente.
Alpine Linux usa musl, una libc alternativa.
Per scoprire il nome del target (LLVM target triple), potete eseguire llvm-config sul sistema target, in questo modo:
llvm-config -host-target
Per poter eseguire questo comando su Alpine, si installano due pacchetti:
apk aggiungere llvm
apk add llvm-dev
Quando si prova un obiettivo che Crystal non supporta ancora per la compilazione incrociata, si ottiene questo messaggio di errore:
in /usr/share/crystal/src/callstack.cr:3: mentre richiede "c/dlfcn": impossibile trovare il file 'c/dlfcn'
Queste biblioteche si trovano qui:
/usr/share/crystal/src/lib_c
Crystal è supportato su Alpine, sulle piattaforme aarch64 (ARM 64bit) e x86_64. (e x86 via portalier.com)
In generale, la compilazione incrociata con Crystal funziona così:
crystal build -release -cross-compile -target "aarch64-linux-musl" src/armtest.cr
vi darà una linea di comando da eseguire sulla macchina di destinazione:
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
Vedere questi riferimenti:
- 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 (kernel del sistema operativo di prova scritto in Crystal)
- https://crystal-lang.org/docs/installation/on_alpine_linux.html
- http://public.portalier.com/alpine/ - anche i pacchetti per x86
- 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 <- problema su arm-linux-musleabihf
- https://github.com/crystal-lang/crystal/issues/5467
- https://pkgs.alpinelinux.org/packages?name=crystal&branch=edge <- pacchetti di Jakub Jirutka per Crystal, per Alpine. Ha provato a costruirlo anche per armhf, ma non ci è riuscito
- https://elinux.org/images/e/eb/Transitioning_From_uclibc_to_musl_for_Embedded_Development.pdf <- interessanti informazioni di base sui musulmani