あーさん日記

https://akkera102.sakura.ne.jp/gbadev/ の中の人

RustとGBA その1

同人誌「RustでGBAのプログラムを作ろう!」のwindows版インストール手順書です。
devkitProを使って極力簡単にしてみました。


■devkitProのインストール
省略。


■Visual C++ 2015 Build Toolsのインストール
http://landinghub.visualstudio.com/visual-cpp-build-tools
Rustに必要です。普通に2, 3GB取られます。ひどすぎ。


■Rustのインストール
https://www.rust-lang.org/ja-JP/
rustup-init.exeを実行。

Current installation options:

   default host triple: x86_64-pc-windows-msvc
     default toolchain: stable
  modify PATH variable: yes

   default host triple: x86_64-pc-windows-msvc
     default toolchain: nightly ←
  modify PATH variable: yes

nightlyに変えます。


インストール後、コマンドプロンプトで作業します。
最新のnightlyだとエラーになるので同人誌と同じ環境を作ります。
(arm-none-eabi.json内の何かのパラメータがよくないみたいです)

rustup install nightly-2016-11-24
rustup show

Default host: x86_64-pc-windows-msvc

installed toolchains
--------------------

nightly-2016-11-24-x86_64-pc-windows-msvc
nightly-x86_64-pc-windows-msvc (default)

active toolchain
----------------

nightly-x86_64-pc-windows-msvc (default)
rustc 1.18.0-nightly (3b5754e5c 2017-04-10)
cargo install xargo
rustup component add rust-src
rustup default nightly-2016-11-24-x86_64-pc-windows-msvc
rustup component add rust-src
rustup default nightly-x86_64-pc-windows-msvc

add rust-srcを2回しているのはそれぞれxargo、コンパイル時に必要な為です。


■サンプルプログラムのコンパイル
https://github.com/kotetuco/Rust-BareMetal-GBA-Sample
Rust-BareMetal-GBA-Sample-masterを解凍、フォルダに移動します。
Makefileの28行目

	RUST_TARGET_PATH=$(PWD) rustup run nightly `which xargo` build -v \

	RUST_TARGET_PATH=$(PWD) rustup run nightly-2016-11-24 `which xargo` build -v \

に変更。

set PATH=C:\devkitPro\devkitARM\bin;c:\devkitPro\msys\bin;%PATH%
make

buildフォルダにrom.mbができます。
f:id:akkera102:20170412002538p:plain


ただ、xargo使わない方がromの容量も小さく高速でした。
原因はよくわからず・・・というか調べてないです。


追記:
本にCargo.toml内opt-levelの違いです、と書いてありました。m(__)m


■xargoを使わない方法
まず、libcoreを作ります。
https://github.com/rust-lang/rust/releases


nightly-2016-11-24と合わせるため、バージョン1.15.0をダウンロードします。
解凍後(ごちゃごちゃある中の)libcoreフォルダをプロジェクトフォルダにコピー。
あとはおまじないを唱えます。

rustc --target=arm-none-eabi.json --crate-type=rlib -C opt-level=2 -C no-prepopulate-passes -Z no-landing-pads -o build/libcore.rlib libcore/lib.rs

rustc --target=arm-none-eabi.json --crate-type=staticlib --emit=obj -C lto -C opt-level=2 -C no-prepopulate-passes -C relocation-model=static -Z verbose -Z no-landing-pads -o build/first.o src/lib.rs --extern core=build/libcore.rlib

arm-none-eabi-ld -t -T rom.ld -o build/rom.elf build/crt.o build/first.o -Map build/rom.map

arm-none-eabi-objcopy -O binary build/rom.elf build/rom.mb

どうしてそうなるの、って話は本を買ってください。(販売促進