Crystal & Alpine en la Raspberry Pi

Uniendo dos interesantes tecnologías:

  • Alpine Linux: una distribución de Linux de tamaño reducido y orientada a la seguridad
  • Crystal - un lenguaje compilado con una buena sintaxis (similar a Ruby)
  • en la Raspberry Pi (armhf / ARMv6, que también sería compatible con la Pi Zero W)

no es posible actualmente, a partir del 21.12.2018.

No existe (al menos no es fácil) una forma de compilar aplicaciones Crystal para la Raspberry Pi y Alpine Linux, desde, por ejemplo, plataformas x86, ya que el objetivo necesario arm-linux-musleabihf todavía no es compatible.

Información de fondo diversa

Desafortunadamente no es posible compilar crystal en Alpine/ARM/Raspberry usando gcc o similares, ya que "para compilar Crystal necesitas Crystal" - la compilación fallará:

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
-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

¡Necesitas tener un ejecutable de cristal en tu ruta!

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

La idea es que usted compile de forma cruzada crystal en otra arquitectura, y luego pueda utilizarlo para compilarlo de forma nativa.

Alpine Linux utiliza musl, una libc alternativa.

Para averiguar el nombre del objetivo (triple objetivo de LLVM), puede ejecutar llvm-config en el sistema objetivo, así:

llvm-config -host-target

Para poder ejecutar este comando en Alpine, hay que instalar dos paquetes:

apk add llvm

apk add llvm-dev

Al intentar un objetivo que Crystal no soporta todavía para la compilación cruzada, obtendrá este mensaje de error:

en /usr/share/crystal/src/callstack.cr:3: while requiring "c/dlfcn": can't find file 'c/dlfcn'

Estas bibliotecas se encuentran aquí:

/usr/share/crystal/src/lib_c

Crystal es compatible con Alpine, en las plataformas aarch64 (ARM 64bit) y x86_64. (y x86 a través de portalier.com)

En general, la compilación cruzada con Crystal funciona así:

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

le dará una línea de comando para ejecutar en la máquina de destino:

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

Consulte estas referencias: