現在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のお蔭でいろんなプラットフォームへの対応が楽になったなぁと。