树莓派上的水晶和阿尔卑斯山

汇集了两种有趣的技术。

  • 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

见这些参考资料。