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: