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:
- 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 (prova de conceito de OS kernel escrita em Crystal)
- https://crystal-lang.org/docs/installation/on_alpine_linux.html
- http://public.portalier.com/alpine/ - pacotes também para x86
- 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 <- questão sobre braço-linux-musleabihf
- https://github.com/crystal-lang/crystal/issues/5467
- https://pkgs.alpinelinux.org/packages?name=crystal&branch=edge <- pacotes de Jakub Jirutka para Crystal, para Alpine. Ele tentou construí-la também para armhf, mas não conseguiu
- https://elinux.org/images/e/eb/Transitioning_From_uclibc_to_musl_for_Embedded_Development.pdf <- informação de fundo interessante sobre musl