Momoをarm64のLinuxで(無理矢理)ビルドする
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を動かせるはず
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 追記。この謎を深掘りしました。
jetson nanoでもビルドしてみた
調子に乗って、jetson nanoでもビルドしてみました。
すると、以下のようなメッセージが多発していまくいかない。
warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5]
これに関してはこちらの記事を見てください。
最終的にjetson nanoでもビルドできました。しかしとてもとても遅いです。半日かかりました。w
Discussion