树莓派上的水晶和阿尔卑斯山
汇集了两种有趣的技术。
- Alpine Linux - 一个小尺寸和安全导向的Linux发行版
- Crystal - 一种具有良好语法的编译语言(类似于Ruby)。
- 在Raspberry Pi(armhf / ARMv6,这也将支持Pi Zero W)上。
截至2018年12月21日,目前不可能。
没有(至少没有简单的)方法来交叉编译Raspberry Pi和Alpine Linux的Crystal应用程序,例如,从X86平台,作为必要的目标 arm-linux-musleabihf 还不支持。
杂项背景资料
不幸的是,不可能在Alpine/ARM/Raspberry上用gcc或类似的方法编译水晶,因为 "要编译水晶,你需要水晶"--编译会失败。
pitest:/usr/local/crystal/crystal# make
使用/usr/bin/llvm-config [版本=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
-写字符串 -广播--平等 -无缺失的字段初始化器 -语义学 -无数据段 -O
-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
你需要在你的路径上有一个水晶可执行文件!你需要有一个水晶可执行文件。
make:*** [Makefile:123: .build/crystal] 错误 1
这个想法是,你在另一个架构上交叉编译水晶,然后可以用它来进行原生编译。
Alpine Linux使用musl,一个替代libc的工具。
要想知道目标的名称(LLVM目标三重),你可以在目标系统上执行llvm-config,像这样。
llvm-config -host-target
为了能够在Alpine上运行这个命令,你要安装两个软件包。
apk添加llvm
apk添加llvm-dev
当尝试一个Crystal还不支持交叉编译的目标时,你会得到这个错误信息。
in /usr/share/crystal/src/callstack.cr:3: while requiring "c/dlfcn": can't find file 'c/dlfcn' 。
这些图书馆位于这里。
/usr/share/crystal/src/lib_c
Crystal支持Alpine,在arch64(ARM 64bit)和x86_64平台上。(和x86通过portalier.com)
一般来说,与Crystal交叉编译的工作方式是这样的。
crystal build -release -cross-compile -target "arch64-linux-musl" src/armtest.cr
它将给你一个在目标机上执行的命令行。
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
见这些参考资料。
- 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 (用Crystal编写的概念操作系统内核证明)
- https://crystal-lang.org/docs/installation/on_alpine_linux.html
- http://public.portalier.com/alpine/ - 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 <- 关于arm-linux-musleabihf的问题
- https://github.com/crystal-lang/crystal/issues/5467
- https://pkgs.alpinelinux.org/packages?name=crystal&branch=edge <- 由Jakub Jirutka为Crystal制作的软件包,用于Alpine。他也试图为armhf建立,但没有成功。
- https://elinux.org/images/e/eb/Transitioning_From_uclibc_to_musl_for_Embedded_Development.pdf <- 关于穆斯林的有趣背景信息