Crystal & Alpine sur le Raspberry Pi

Réunir deux technologies intéressantes :

  • Alpine Linux - une distribution Linux de petite taille et orientée sécurité
  • Crystal - un langage compilé avec une belle syntaxe (similaire à Ruby)
  • sur le Raspberry Pi (armhf / ARMv6, qui supporterait également le Pi Zero W)

n'est pas possible actuellement, à compter du 21.12.2018.

Il n'y a pas de moyen (du moins pas de moyen facile) de compiler des applications Crystal pour le Raspberry Pi et Alpine Linux, à partir, par exemple, de plates-formes x86, car la cible nécessaire arm-linux-musleabihf n'est pas encore pris en charge.

Informations générales diverses

Malheureusement, il n'est pas possible de compiler Crystal sur Alpine/ARM/Raspberry en utilisant gcc ou autre, car "pour compiler Crystal, il faut Crystal" - la compilation échouera :

pitest:/usr/local/crystal/crystal# make
Utilisation de /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
-Wwrite-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

Vous devez avoir un exécutable crystal dans votre chemin !

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

L'idée est que vous compilez le cristal de manière croisée sur une autre architecture, et que vous pouvez ensuite l'utiliser pour le compiler de manière native.

Alpine Linux utilise musl, une alternative à libc.

Pour connaître le nom de la cible (LLVM target triple), vous pouvez exécuter llvm-config sur le système cible, comme ceci :

llvm-config -host-target

Pour pouvoir exécuter cette commande sur Alpine, vous devez installer deux paquets :

apk ajouter llvm

apk add llvm-dev

Lorsque vous essayez une cible que Crystal ne prend pas encore en charge pour la compilation croisée, vous obtenez ce message d'erreur :

dans /usr/share/crystal/src/callstack.cr:3 : while requiring "c/dlfcn" : can't find file 'c/dlfcn' (fichier introuvable)

Ces bibliothèques sont situées ici :

/usr/share/crystal/src/lib_c

Crystal est supporté sur Alpine, sur les plateformes aarch64 (ARM 64bit) et x86_64. (et x86 via portalier.com)

En général, la compilation croisée avec Crystal fonctionne comme suit :

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

il vous donnera une ligne de commande à exécuter sur la machine cible :

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

Voir ces références :