🕌

Momoをarm64のLinuxで(無理矢理)ビルドする

2022/04/30に公開

Oracle Cloudでarm64のインスタンスが使えるようになったので、これでmomoのビルドができないか色々試しました。結果としてビルドはできましたが、かなり無理矢理です。momoのビルドはx86_64のLinuxでやるのが正当な方法です。

とりあえずビルドしてみた

Oracle Cloudのarm64のインスタンス上で普通にmomoのビルドをしてみました。

$ ./build.sh ubuntu-18.04_armv8_jetson_nano

boostのビルドのところでエラーになりました。
エラーの理由は「clang++が無い」
実際にはclang++の実行ファイルはあるのですが、x86_64用のバイナリでした。
C++コンパイラツールは別リポジトリでlibwebrtc.aをビルドしたのと同じものをダウンロードしてきています。
そちらがx86_64の環境なので、x86_64の実行ファイルなわけです。これはarm64では動かせない。
いったんはあきらめました。

arm64 Macでのビルド設定を発見

build.sh の中にこんなコードを見つけました。

 if [ "`uname -sm`" = "Darwin arm64" ]; then
   # M1 Mac の場合は --platform を指定する
   DOCKER_PLATFORM="--platform=linux/amd64"
 fi

arm64 Macでは--platform=linux/amd64 をつけてDockerコンテナまるごとをエミュレーションで動かすということをしているのか。
だったら、同じようにまるごとエミュレーションして動かしてみようということに。

クロスでDockerを動かすための修正

昔書いたこの記事のようにやれば、クロスでDockerを動かせるはず
https://embedded.hatenadiary.org/entry/20140820/p1

diff --git a/build/build.sh b/build/build.sh
index 3d458fc..2bd0c8d 100755
--- a/build/build.sh
+++ b/build/build.sh
@@ -62,6 +62,19 @@
 if [ "`uname -sm`" = "Darwin arm64" ]; then
   # M1 Mac の場合は --platform を指定する
   DOCKER_PLATFORM="--platform=linux/amd64"
 fi
+if [ "`uname -sm`" = "Linux aarch64" ]; then
+  # Linux arm64 の場合は --platform を指定する
+  DOCKER_PLATFORM="--platform=linux/amd64"
+  if [ ! -x $PACKAGE/qemu-x86_64-static ]; then
+    if [ ! -x /usr/bin/qemu-x86_64-static ];then
+      echo "Do the follwing command and try again."
+      echo "   sudo apt install qemu-user-static"
+      exit 1
+    else
+      cp /usr/bin/qemu-x86_64-static $PACKAGE/
+    fi
+  fi
+fi
 
 _FOUND=0
 for package in $_PACKAGES; do
diff --git a/build/ubuntu-18.04_armv8_jetson_nano/Dockerfile b/build/ubuntu-18.04_armv8_jetson_nano/Dockerfile
index fcee6be..1ada343 100644
--- a/build/ubuntu-18.04_armv8_jetson_nano/Dockerfile
+++ b/build/ubuntu-18.04_armv8_jetson_nano/Dockerfile
@@ -1,5 +1,6 @@
 # syntax = docker/dockerfile:1.1.1-experimental
 FROM ubuntu:18.04
+COPY ./qemu-x86_64-static /usr/bin/

これでビルドは成功しました。でも40分くらいかかりました。。MacBookProのVirtualBox上では12分くらいでビルドできるので、速度的な利点はないです。全てのx86_64の実行ファイルをqemuで実行することになるので時間がかかるのは仕方がない

binfmt_misc の謎

さて、これでjetson nano向けがビルドできた。ラズパイ向けもビルドしておくか。

$ ./build.sh raspberry-pi-os_armv7

ビルドできてしまいました。
Dockerfileを修正していないのに ?

そのコンテナの中には/usr/bin/qemu-x86_64-staticが無いのに、なぜかちゃんと実行できる。
binfmt_miscのインタープリタのキャッシュ方法が謎です。
一度そのカーネルで、x86_64の実行ファイルを/usr/bin/qemu-x86_64-staticを経由して実行すると、以降もずっとそれを覚えてくれるようです。rebootした後も保持されています。謎です。

2202/05/01 追記。この謎を深掘りしました。
https://zenn.dev/tetsu_koba/articles/b9545eb0231d7e

jetson nanoでもビルドしてみた

調子に乗って、jetson nanoでもビルドしてみました。
すると、以下のようなメッセージが多発していまくいかない。
warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5]
これに関してはこちらの記事を見てください。
https://zenn.dev/tetsu_koba/articles/35cadd8a5a3bd0

最終的にjetson nanoでもビルドできました。しかしとてもとても遅いです。半日かかりました。w

Discussion