同人誌「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ができます。
ただ、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
どうしてそうなるの、って話は本を買ってください。(販売促進