はじめに
この記事はラクスパートナーズ Advent Calendar 2024の19日目の記事です。
今日は趣味開発で使っているラズパイ向けdockerimageを使った
クロスコンパイル環境のビルドについて検証・解説したいと思います
現在、モダンな組み込み対象機器の開発環境として
docker環境をx86(Windows、Mac、Linux)の性能がリッチなマシンで構築したのち、
実行ファイルのみをArmマシン(組み込み機器)に転送してデプロイ・テスト駆動する形式が流行っています。
今回は公開されているラズパイ向けdockerイメージをビルドすることでdocker環境上に開発環境を作成し、簡単なプログラムを実装する流れを書き下したいと思います。
自分はMacユーザーなので基本的にbrewを使ってラクをします。
使用機材
Hardware : MacBookPro early 2015 intel i5 2.7GHz
OS : Monterey 12.7.6
1.dockerのインストールと設定
上記はあまりにも記事があるので詳細には説明しません。
各種のOS環境に準じたdockerのセットアップを行い
docker -v
を実行して下記の表示が出れば大丈夫です。
% docker -v
Docker version 26.0.1, build d260a54c81
もしも出ない時はHomebrewの下記コマンドなどでdocker環境を立ててください
docker構築時のマイナートラブルに注意してください、
ローカル環境をコメントいただければ返信にて対応したいと思います。
% brew install --cask docker
詳しくは下記などを参考にすると良いと思います。
2.ラズパイ向けのクロスコンパイル環境を作成する
1.にてdockerの構築はできたかと思いますので、2.ではdockerイメージ取得とビルドの環境構築をしていきます。
自分の環境に合わせるために、今回はDockerDesktopを使用せずに互換ソフトのcolimaを使用して行きます。
注記)2024/12現在ColimaはMITライセンスです。類似ソフトがApache系なので今後変更はあるかもしれません
(OP:Colimaのセットアップ Mac向け)
brew install colima
:::note info
--このタイミングでDNS 8.8.8.8をホストマシンに設定しておく--
:::
colima start
3.githubで公開されているクロスコンパイルのdockerイメージをビルドする
今回は @ryoma-jp 氏が公開しているgithubリポジトリを利用させていただきました。
Raspi3互換のRaspiZero2Wで利用するため、安定している32bit版でのビルドを引用させていだだきます。
ホストマシン上(Mac)にて
% git clone https://github.com/ryoma-jp/samples.git
% cd samples/env/cross_compile/docker_armv7l/
% docker build -t env_xc_armv7l/ubuntu:22.04 .
% bash ./docker_run.sh
--以下はdockerコンテナ内--
# cd /work/sample_source
# make -f Makefile_for_xc_armv7l
arm-linux-gnueabihf-gcc -c -Wall -O3 -march=armv8-a -mfpu=neon -I./ -o build/main.o main.c
arm-linux-gnueabihf-gcc -static -o sample_armv7l ./build/main.o
# file sample_armv7l
sample_armv7l: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, BuildID[sha1]=d4c1d6a98a601d0f42932640effdafe41791c438, for GNU/Linux 3.2.0, not stripped
4.ビルドされた実行ファイルを手元に取り出して、ラズパイに転送して実行!
ホストマシン上(Mac)にて
docker cp [コンテナID]:/work/sample_source/sample_armv7l ホストマシンコピー先ディレクトリ
ラズパイ上に実行ファイルを転送して実行
Hardware : RaspberryPi Zero2W
OS : RaspberryPiOSLite Bullseye 32bit
pi@raspberrypi:~/test $ ./sample_armv7l
Cross Compile has been succeeded!!
上記を変更したい場合は、ビルドされているmain.cを変更することで任意のCコードを実行ファイルへとクロスコンパイルすることができます!
ラズパイでよくあるカップ麺が伸びるような長いビルドを先にx86マシン上で終わらせることでよりデバッグしやすく、開発しやすくなりました。
普段の業務ではこのようなdockerを用いたビルドを利用することがモダンな環境では多くなってきています。
このようなハードウェアにご興味ある方、弊社はリファラル採用もやっているそうなのでモダンな開発に興味がある方はぜひカジュアル面談など受けてみてはいかがでしょうか。
5.終わりに
ここまで読んでくださってありがとうございました。
次は現在のPi5や64bitでの具体的なアプリケーションについても寄稿できたらと思います。
ご指摘・ご希望あればコメントにて対応させていただきます。
6.参考文献
今回の記事は下記記事を参考に作成いたしました。