要作Alpine的新平台porting,其实在有了 aports/script/bootstrap.sh
的协助,已经相较许多distro来得轻松很多。例如Ubuntu/Debian在头一遭作ARM porting时,有大量的手工需求需要作。不过aports的maintainer之一,Drew Devault其实也曾说过:〝bootstrap.sh is not battery-included !〞这样非常形象化的宣言,意指不要期望可以无痛地一道指令跑下去,什麽事情都会处理好。
这篇目前的aports修改,与未来使用上会放置在:
https://github.com/Ruinland/aports-riscv32
那麽我们就来踩踩看有哪些雷吧。
首先,基本上apots/abuild与Alpine高度相依,虽然Arch Linux AUR里面会看到有人尝试移植过,就过去笔者两年前使用的经验,我们还是有个完整的Alpine Linux userspace比较恰当。在这个年代,我们用docker会方便非常多,那就直接来吧:
docker pull alpine:3.14.2
紧接着就开shell起来,把 alpine-sdk
、sudo
等套件装好,并开好一个用户来设定吧:
docker run -t -i alpine:3.14.2 /bin/bash
apk add alpine-sdk sudo
adduser -G abuild ithome
adduser ithome wheel
vi /etc/sudoers # get wheel group to work without password
su ithome
abuild-keygen -a -i # Very _important_ !!! Keygen for local repo
紧接着,找一个喜欢的地方放aports,开始动工:
git clone https://gitlab.alpinelinux.org/alpine/aports
首先我们观察一下 aports/scripts/bootstrap.sh
,会发现它的基础逻辑是从打造基础的binutils、然後1st phase cross toolchain、接着编出musl,再编出2nd phase crosstoolchain。并且建立一个meta package build-base
去包含 toolchain。但这时其实有个误区需要处理,那就是当 CTARGET
跟 CHOST
不match时,他要同时包含cross toolchain跟 cross_ed_ toolchain,也就是一包要同时含有跑在 x86-64 能gen给riscv32、以及跑在riscv32上gen给自己用的俩组。
这个行为会严重地与我们的cross host发生版本冲突与循环依赖,因为以包装的逻辑而言,APKBUILD里面所谓的 gcc
跟 g++
是 HOST 的、可是对於crossed platform来说,这个是要他那个平台所支援的版本。这边有两个解方,一个是直接干掉 aports/main/build-base/APKBUILD
当中指涉的任何 gcc 、g++ 套件,并且硬装 $HOME/package/x86_64/
底下的corss toolchain (i.e. binutils-riscv32
、gcc-riscv32
),先挺过这一次「创世纪」的循环相依後,有了native环境,我们可以重打一包相依逻辑正确的 build-base
;另一个是强行统合cross build machine跟crossed target的toolchain版本号,这会是比较漂亮的解法,如果遇到会比对build-id的case,可以在强行使用 --build-id 去指定。
而关於musl的部份,我们直接修改 aports/main/musl/APKBUILD
,换上之前port到一半的musl tarball、并且追加该有的checksum以及修改。
详情可见commit。
目前这套流程可以一路走到在编libbsd
时,因为Alpine自己打了一组我看不太懂原因的 auto-link-atomic,导致linking流程中有些我不确定的原因会fail掉。这点可能必须还要花时间排除。(写了信给Drew Devault讨救兵了QQ)
Update:
感谢神秘的朋友帮忙看了一下,发现是Alpine在建libatomic symlink name时有状况,先暂时在 abuild
时多下了 -k -K
来留住 buildir跟sysroot (效果类似Arch Linux的makepkg --noextract
)、之後硬是调整了一下symlink name,这样就可以一路拐到 alpine-base
build完。後面就看能走多远是多远,因为只少 alpine-base
打出来,我们就可以建最minimal的Alpine rootfs来试了~
<<: Day 7 ELK Stack + Filebeat 收集 k8s log
今天突然的好累QQ 所以来个半偷懒篇(?! 之前在写数位监识,或是资安稽核,还有其他文章时, 都会想...
经过这两天的介绍,相信大家对於 Cypress 应该已经有了一定程度的理解,有没有人已经开始用它来...
AutoML 今日学习目标 了解何谓 AutoML 超参数调参方法 Grid Search Rand...
何谓隔离框架 (isolation Framework) 今天走到了铁人赛一半的赛点,终於要提到我们...
关於 JIT 模式 JIT(Just in Time Mode) 是在 TailwindCSS v...