プログラミング言語は本当にたくさんありますが、その中でも最近注目が集まっている言語が『Rust』です。『C』や『C++』のように高速でありながら、『C』や『C++』で悩まされるメモリ関連のバグを言語レベルで抑止してくれるという優れた言語です(もちろん完璧ではないが)。
そんな『Rust』を使ってコーディングして動作させるとなると、やはり欲しくなるのはクロスコンパイラ環境です。私はRaspberry Pi(ラズパイ)をよく使うので、ラズパイ上で動かすためのクロスコンパイラ環境が欲しくなりました。
ここではWindows上(といってもWSL上ですが)に、『Rust』のクロスコンパイラ環境を構築する手順をまとめました。ちょいちょいっとインストールするだけでかなり幅広いターゲットに対応できるクロスコンパライ環境を構築できるので、暇なときにでも構築して『Rust』を触ってみませんか?
前提条件
構築手順に入る前に、まず下記の前提条件を満たしている必要があります。
- WindowsにWSLがインストール済み
- WSL上にUbuntuがインストール済み
条件を満たしている方は以降の構築手順に進んでください。
WSLのインストール、WSL上へのUbuntuインストールが済んでいない方は、下記を参考にWSLのインストールをしてください。
Rustのクロスコンパイラ環境構築手順
クロスコンパイラ環境の構築手順を解説します。手順は大きく3つに分類されます。
- Dockerのインストール
- Rustのインストール
- クロスコンパイラツール『cross』のインストール
手順1:Dockerのインストールおよび起動
まずはDockerの公式サイトにアクセスして、『Docker Desktop』をダウンロードします。
ダウンロードが完了したら、インストーラーを起動してインストールを開始します。
基本的にインストーラーに従ってOKを押すだけで良いですが、下記の「Install required Windows components for WSL 2」にチェックが入っているかは確認しておきましょう。WSL2上でDockerを有効にするために必要なので。
以下の画面になったらインストール完了です。「Close」をクリックして閉じましょう。
インストールが完了したら、「Docker Desktop」を起動します。
起動するとチュートリアルが出てきますが、「Skip tutorial」をクリックして飛ばしましょう。(Dockerが気になる方はチュートリアルを実施してみても良いですよ。)
チュートリアルをスキップすると、下記のような画面が出てきてDockerの起動は完了です。
邪魔であればDockerのウインドウを閉じても構いません。バックグラウンドで動作しており、タスクトレイには常駐しているので。
「なぜDockerを入れるんだ?」と疑問を抱くかもしれませんが理由があります。
というのも、後々『cross』というツールをインストールすることになるのですが、このツールがDockerを使います。そのため、Dockerをインストールしています。
この『cross』というツールはターゲット毎のDockerイメージを持っており、ターゲットを指定するとそのターゲットに対応したDockerイメージが展開されます。そして、そこに入っているクロスコンパイラ環境を使ってビルドするわけです。(かしこい)
手順2:Rustのインストール
次にWSL上のUbuntuにRustをインストールします。といっても入力するコマンドはRustの公式にあるコマンドを入れるだけです。下記のコマンドをWSL上のUbuntuで入力しましょう。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
すると、下記のようなメッセージが出てくるので、「1」を入力してEnterを押しましょう。
あとは勝手にRustのインストールが進むので完了するまで待ちます。完了するとこんな感じのメッセージが出てきます。
あとはパスを通すためにホームディレクトリで下記コマンドを実行するだけです。
source .bashrc
手順3:クロスコンパイラツール『cross』のインストール
Rustをインストールすると、Rustのビルドシステム兼パッケージマネージャである『Cargo』というツールがインストールされます。Rustに関するツールもこのCargoを使ってインストールします。
というわけで、ここからはCargoを使ってRustのクロスコンパイラ環境を構築するツール『cross』をインストールします。ここもコマンドを入力するだけです。
cargo install cross
すると、こんな感じでcrossのインストールが進むので、完了するまで待つだけです。
インストールが完了するとこんな感じのメッセージがでます。
以上でRustのクロスコンパイラ環境の構築が完了です!いやー、ラクチンですね。
コンパイル方法と動作確認
構築したクロスコンパイラで実際にコンパイルしてみましょう。
まずはRustのプロジェクトを作成します。下記のようにコマンドを入力して「hello」というプロジェクトを作成します。
cargo new hello --bin
プロジェクトを作成すると、「hello」というディレクトリが作成されているはずです。まずは作成したディレクトリに移動しましょう。
cd hello
あとは、下記コマンドを入力するだけで、Raspberry Pi Zero用のバイナリが生成されます。
cross build --target=arm-unknown-linux-gnueabihf
1回目のビルドはDockerイメージをダウンロードして展開するため時間が掛かりますが、2回目以降はDockerイメージを取得済みなのでサクッとビルドできますよ。
ラズパイ4向けのバイナリを生成したい場合は、下記コマンドで生成してください。
cross build --target=armv7-unknown-linux-gnueabihf
ちなみにラズパイ4は「ARM v8」まで対応しています。しかし、RustのコンパイラがまだARM v8に対応していないようなので「ARM v7」でビルドしています。
ビルドするとこんな感じでメッセージがでます。
ビルドが完了すると、"target/arm-unknown-linux-gnueabihf/debug" の中に "hello" として生成されたバイナリが存在するはずです。cdコマンドで "target/arm-unknown-linux-gnueabihf/debug" に移動して、lsコマンドで "hello" が生成されたか見てみましょう。
後は生成された "hello" をラズパイに転送して実行するだけです。
WSL(Ubuntu)上のターミナルで下記コマンドを実行するとラズパイのホームディレクトリ直下に転送されます。(ラズパイのホスト名を変えている場合は読み替えてください)
scp hello pi@raspberrypi.local:~/
あとはラズパイにSSH接続してラズパイのターミナルを開き、ホームディレクトリで"hello"を実行すると"Hello World!"が出力されるはずです。
pi@raspberrypi:~ $ ./hello
Hello World!
まとめ
Windows上に『Rust』のクロスコンパイラ環境を簡単に構築できました。サクサクっとコンパイルしてラズパイ上でバシバシ動かしてやりましょう!
C言語のラズパイ用クロスコンパイラ環境については、下記記事を参考にしていただければと思います。
コメント