Rustでマルチプラットフォーム開発を効率化! Mac→Linuxクロスコンパイルの極意
初めに
Rustアプリケーションを開発する際、異なるプラットフォーム上でコードをコンパイルしようとすると、問題が発生することがあります。依存関係や設定の問題を解決するため、何時間も費やしてイライラしてしまったことはありませんか。
私も同じような経験があるため、MacからLinuxへのRustコードのクロスコンパイル方法を紹介します。
どこでコンパイルするかの問題
項目 | Linuxサーバーでコンパイル | Macでコンパイル |
---|---|---|
CPUやメモリー | 他のユーザーと共有、制限がある | 自由に使用できる |
開発スタイル | 複数サーバー利用か、コンパイルが遅くなる | 自分のペースで開発できる |
必要なツールのインストールとサンプルプログラム
始めるには、Mac に必要なツールをインストールする必要があります。
ツールのインストール
-
MacにRustがインストールされていること(まだの場合はインストールが必要)
-
ZigBuildをインストール
brew install zig cargo install cargo-zigbuild rustup target add x86_64-unknown-linux-gnu
Macでサンプルプログラムの作成とLinuxへのデプロイ
cargo new hello_world
cd hello_world/
cargo zigbuild --release --target x86_64-unknown-linux-gnu
rsync -av -e ssh target/x86_64-unknown-linux-gnu/release/hello_world you@your_linux_machine://tmp/
Linuxマシン上で実行できます。
❯ ssh you@your_linux_machine
❯ cd /tmp
❯ ./hello_world
Hello, world!
以下は、サンプルコード解説
main.rs
fn main() {
println!("Hello, world!");
}
main関数でプログラムのエントリポイントを定義しています。println!マクロを使い、"Hello, world!"と出力します。
Cargo.toml
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"
[dependencies]
今回のサンプルでは[dependencies]がありませんが、実際には必要なcratesを追加します。
特に、sslに関係があるプログラムの場合は、下記のようにopensslを追加すれば問題なく動作します。
[dependencies]
openssl = { version = "0.10", features = ["vendored"] } # Cross compile from Mac
このコードをクロスコンパイルするには、次のコマンドを使用します。
cargo zigbuild --release --target x86_64-unknown-linux-gnu
上記コマンドでクロスコンパイルし、target/x86_64-unknown-linux-gnu/releaseにLinux向けの実行可能ファイルが生成されます。
rsync -av -e ssh target/x86_64-unknown-linux-gnu/release/hello_world
生成された実行ファイルをLinuxサーバーにrsyncします。
最後に
以上のように、MacからLinuxへのRustコードのクロスコンパイルは、アプリケーションを様々なプラットフォームにデプロイする際に便利で効率的な方法です。これらの手順に従えば、開発マシンにLinux環境がなくても、コードがLinux上で適切に実行されることを確認できます。ぜひ試してみて、開発ワークフローがいかに簡素化されるかを体感してください。
References:
Rust Install、 https://www.rust-lang.org/tools/install
Zig Install、 https://ziglang.org/ja/learn/getting-started/#macos
Cargo-zigbuild、 https://github.com/rust-cross/cargo-zigbuild
Discussion