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:
- 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 (prueba de concepto del núcleo del sistema operativo escrito en Crystal)
- https://crystal-lang.org/docs/installation/on_alpine_linux.html
- http://public.portalier.com/alpine/ - paquetes para x86 también
- 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 <- cuestión sobre arm-linux-musleabihf
- https://github.com/crystal-lang/crystal/issues/5467
- https://pkgs.alpinelinux.org/packages?name=crystal&branch=edge <- paquetes de Jakub Jirutka para Crystal, para Alpine. Intentó construirlo para armhf también, pero no tuvo éxito
- https://elinux.org/images/e/eb/Transitioning_From_uclibc_to_musl_for_Embedded_Development.pdf <- información de fondo interesante sobre el musl