Crystal und Alpine auf dem Raspberry Pi
Zwei interessante Technologien werden zusammengeführt:
- Alpine Linux - eine kleinformatige und sicherheitsorientierte Linux-Distribution
- Crystal - eine kompilierte Sprache mit einer schönen Syntax (ähnlich wie Ruby)
- auf dem Raspberry Pi (armhf / ARMv6, was auch den Pi Zero W unterstützen würde)
ist derzeit nicht möglich, Stand: 21.12.2018.
Es gibt keine (zumindest keine einfache) Möglichkeit, Crystal-Anwendungen für den Raspberry Pi und Alpine Linux zu kompilieren, z. B. von x86-Plattformen, da das erforderliche Ziel arm-linux-musleabihf wird noch nicht unterstützt.
Sonstige Hintergrundinformationen
Leider ist es nicht möglich, Crystal auf Alpine/ARM/Raspberry mit gcc oder ähnlichem zu kompilieren, denn "um Crystal zu kompilieren, braucht man Crystal" - die Kompilierung wird fehlschlagen:
pitest:/usr/local/crystal/crystal# make
Mit /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
-Write-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
Sie müssen eine ausführbare Datei von crystal in Ihrem Pfad haben!
make: *** [Makefile:123: .build/crystal] Fehler 1
Die Idee ist, dass Sie crystal auf einer anderen Architektur crosscompilieren und es dann für die native Kompilierung verwenden können.
Alpine Linux verwendet musl, eine alternative libc.
Um den Namen des Targets (LLVM target triple) herauszufinden, können Sie llvm-config auf dem Zielsystem wie folgt ausführen:
llvm-config -host-target
Um diesen Befehl auf Alpine ausführen zu können, müssen Sie zwei Pakete installieren:
apk llvm hinzufügen
apk hinzufügen llvm-dev
Wenn Sie ein Ziel ausprobieren, das Crystal noch nicht für die Crosskompilierung unterstützt, erhalten Sie diese Fehlermeldung:
in /usr/share/crystal/src/callstack.cr:3: while requiring "c/dlfcn": can't find file 'c/dlfcn'
Diese Bibliotheken befinden sich hier:
/usr/share/crystal/src/lib_c
Crystal wird auf Alpine, auf den Plattformen aarch64 (ARM 64bit) und x86_64 unterstützt. (und x86 über portalier.com)
Im Allgemeinen funktioniert die Crosskompilierung mit Crystal wie folgt:
crystal build -release -cross-compile -target "aarch64-linux-musl" src/armtest.cr
erhalten Sie eine Befehlszeile, die Sie auf dem Zielcomputer ausführen können:
cc 'armtest.o' -o 'armtest' -rdynamisch -lpcre -lgc -lpthread /usr/share/crystal/src/ext/libcrystal.a -levent -lrt -L/usr/lib -L/usr/local/lib
Siehe diese Referenzen:
- 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 (Proof of Concept OS-Kernel geschrieben in Crystal)
- https://crystal-lang.org/docs/installation/on_alpine_linux.html
- http://public.portalier.com/alpine/ - Pakete auch für 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 <- Problem mit arm-linux-musleabihf
- https://github.com/crystal-lang/crystal/issues/5467
- https://pkgs.alpinelinux.org/packages?name=crystal&branch=edge <- Pakete von Jakub Jirutka für Crystal, für Alpine. Er hat versucht, es auch für armhf zu bauen, aber es ist ihm nicht gelungen
- https://elinux.org/images/e/eb/Transitioning_From_uclibc_to_musl_for_Embedded_Development.pdf <- Interessante Hintergrundinformationen über Muslime