2014-12-15

Porting Rust to your platform

Rust Language Advent Calendar 2014の12/15日分です。今回はRustの言語仕様とかの話しません。

現在Rust自体は以下のプラットフォームをサポートしています。

  • Android/arm
  • DragonFlyBSD/x86_64
  • FreeBSD/x86_64
  • iOS/arm
  • Linux/arm
  • Linux/mips
  • Linux/x86
  • Linux/x86-64
  • OSX/x86
  • OSX/x86-64
  • Windows/x86
  • Windows/x86-64

これ以外のプラットフォームのバイナリを吐くことはできないのだけど、Rustコンパイラは所詮LLVM使ってバイナリを吐いているので、LLVMでバイナリを生成できるプラットフォームなら(少しの変更で)対応することは可能です。AMDのR600とかでもホントに動かせるのかもしれない。

プラットフォーム用のクロスコンパイラを作成するためのMakefileの作成


<rust root>/mk/cfg 下に新規プラットフォーム用のMakefileを作成する。実際はコンパイラを指定するとかなので、UNIXなプラットフォームの場合はLinuxの定義を丸パクりするだけでいけます。not UNIXの場合は、gcc使う定義作りましょう。

CPUが異なる場合も、ほぼ一緒で構わない。

LLVM用のパラメータの設定


<rust root>/src/librustc_back/target/ にLLVMのターゲット用コードを追加 (コマンドラインオプションなど)。

ランタイム用のコードを追加


<rust root>/src/librustrt に各プラットフォーム用のコードを追加。具体的には stack.rs にコードを追加するのが最低限必要。not POSIXだとThread Local StorageとかThreadの定義とかを一から書く必要が。

Rust自体をLinuxのKernel Driverで使いたいなんて場合は、ここのランタイムコードをLinux Kernel用に別途作成しないと動かないんだよね。

自分のプラットフォームがLLVMで対応されていないんだけど。。。

LLVMのポーティングから始まります。


そんな感じ。LLVMのお蔭でいろんなプラットフォームへの対応が楽になったなぁと。