iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
Software Development

Port Alpine Linux to open source RISC-V platform系列 第 13

Alpine Linux Porting (一點一?)

要作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-sdksudo等套件裝好,並開好一個用戶來設定吧:

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。但這時其實有個誤區需要處理,那就是當 CTARGETCHOST 不match時,他要同時包含cross toolchain跟 cross_ed_ toolchain,也就是一包要同時含有跑在 x86-64 能gen給riscv32、以及跑在riscv32上gen給自己用的倆組。

這個行為會嚴重地與我們的cross host發生版本衝突與循環依賴,因為以包裝的邏輯而言,APKBUILD裡面所謂的 gccg++HOST 的、可是對於crossed platform來說,這個是要他那個平台所支援的版本。這邊有兩個解方,一個是直接幹掉 aports/main/build-base/APKBUILD 當中指涉的任何 gcc 、g++ 套件,並且硬裝 $HOME/package/x86_64/ 底下的corss toolchain (i.e. binutils-riscv32gcc-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來試了~


上一篇
Alpine Linux Porting (一)
下一篇
Alpine Linux Porting (一點二?)
系列文
Port Alpine Linux to open source RISC-V platform30

尚未有邦友留言

立即登入留言