Crystal & Alpine no Raspberry Pi

Juntando duas tecnologias interessantes:

  • Alpine Linux - uma distribuição Linux de pequeno porte e orientada para a segurança
  • Crystal - uma linguagem compilada com uma sintaxe agradável (semelhante ao Ruby)
  • no Raspberry Pi (armhf / ARMv6, que também suportaria o Pi Zero W)

não é possível actualmente, a partir de 21.12.2018.

Não existe uma forma (pelo menos não fácil) de compilação cruzada de aplicações Crystal para o Raspberry Pi e Alpine Linux, a partir, por exemplo, de plataformas x86, como o alvo necessário arm-linux-musleabihf ainda não é suportado.

Informações gerais diversas

Infelizmente não é possível compilar cristal em Alpine/ARM/Raspberry usando o gcc ou similares, como "para compilar Cristal você precisa de Cristal" - a compilação irá falhar:

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-inicializadores -pedantic -Wno-fdata-sections -Os
-fomit-frame-pointer -Os -DNDEBUG -fno-excepções -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

Você precisa de ter um executável de cristal no seu caminho!

...fazer: *** Erro 1

A idéia é que você cruze o cristal em outra arquitetura, e então possa usá-lo para compilá-lo nativamente.

O Alpine Linux usa musl, uma libc alternativa.

Para descobrir o nome do alvo (LLVM target triple), você pode executar llvm-config no sistema de destino, desta forma:

llvm-config -host-target

Para poder executar este comando no Alpine, você instala dois pacotes:

apk add llvm

apk add llvm-dev

Ao tentar um alvo que o Crystal ainda não suporta para cruzamento de dados, você receberá esta mensagem de erro:

in /usr/share/crystal/src/callstack.cr:3: enquanto requer "c/dlfcn": não encontra o ficheiro 'c/dlfcn'.

Estas bibliotecas estão localizadas aqui:

/usr/share/crystal/src/lib_c

O Crystal é suportado nas plataformas Alpine, aarch64 (ARM 64bit) e x86_64. (e x86 via portalier.com)

Em geral, o crosscompilar com Crystal funciona assim:

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

ele lhe dará uma linha de comando para executar na máquina alvo:

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

Veja estas referências: