Rust で GBA のプログラムを作ろう!
https://gyazo.com/40b32d8f4a73b651b6b87398832567ea
2020/3/19時点で最新のnightly(1.43.0)ではなぜかビルドに失敗するため、工夫がいる
nightlyのインストール
code:sh
$ rustup --verbose install nightly-2016-11-24
$ rustup default nightly-2016-11-24
$ rustup component add rust-src
libcoreのビルド
code:sh
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 ~/.rustup/toolchains/nightly-2016-11-24-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/lib.rs
追記
5章のcargo導入するところで再度試したら最新版のnightlyで行けた
しかしアップデートでpanicハンドラのattributeが破壊的変更を受けていたりなど、いろいろ修正点がおおい
code:arm-none-ebai.json
{
"llvm-target": "arm-none-eabi",
"target-endian": "little",
"target-pointer-width": "32",
"target-c-int-width": "32",
"linker-flavor": "ld",
"data-layout": "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64",
"arch": "arm",
"target-os": "none",
"os": "none",
"target-env": "",
"target-vendor": "unknown",
"cpu": "arm7tdmi"
}
パニックハンドラは以下のように修正してやる必要がある
code:src/lib.rs
pub fn panic(_info: &PanicInfo) -> ! {
loop {}
}
makefileも修正
code:makefile
TARGET_ARCH := arm-none-eabi
TARGET_ARCH_RUST := $(TARGET_ARCH)
BUILD_NAME := rom
BUILD_DIR := build
BUILD_MODE := debug
default:
mkdir -p $(BUILD_DIR)
make $(BUILD_DIR)/$(BUILD_NAME).mb
$(BUILD_DIR)/$(BUILD_NAME).mb: $(BUILD_DIR)/$(BUILD_NAME).elf
$(TARGET_ARCH)-objcopy -O binary $(BUILD_DIR)/$(BUILD_NAME).elf $(BUILD_DIR)/$(BUILD_NAME).mb
$(BUILD_DIR)/$(BUILD_NAME).elf: $(BUILD_DIR)/crt.o rom.ld target/$(TARGET_ARCH_RUST)/$(BUILD_MODE)/librust_basemetal_gba.a
$(TARGET_ARCH)-ld --gc-sections -t -T rom.ld -o $(BUILD_DIR)/$(BUILD_NAME).elf $(BUILD_DIR)/crt.o --library-path=target/$(TARGET_ARCH_RUST)/$(BUILD_MODE) -lbasemetal_gba -Map $(BUILD_DIR)/$(BUILD_NAME).map
target/$(TARGET_ARCH_RUST)/$(BUILD_MODE)/librust_basemetal_gba.a: $(TARGET_ARCH_RUST).json Cargo.toml src/*.rs
rustup run nightly $(shell which xargo) build -v --target $(TARGET_ARCH_RUST)
$(BUILD_DIR)/crt.o: crt.S
$(TARGET_ARCH)-as crt.S -o $(BUILD_DIR)/crt.o
clean:
rm -rf $(BUILD_DIR)
xargo clean