🐡

Rustでマルチプラットフォーム開発を効率化! Mac→Linuxクロスコンパイルの極意

2024/04/24に公開

初めに

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

CareNet Engineers

Discussion