rust-pspをstdありで使う
RustでPSP向けの開発が行えるrust-pspというものがあります。
もっとも単純なHelloWorldだと以下のような形で実装することができます。(引用元)
#![no_std]
#![no_main]
psp::module!("sample_module", 1, 1);
fn psp_main() {
psp::enable_home_button();
psp::dprint!("Hello PSP from rust!");
}
これを見ると no_std
かつ no_main
な環境になっています。しかし、作りたいものによってはそれでは困ることもあるでしょう。
そこで他のexampleを見るとrust-std-hello-worldというものがあり、なんとかなりそうです。しかし、これは一筋縄ではビルドできません。
単純に cargo psp
コマンドを使ってもビルドできず、よくよく調べてみるとPRにおいて以下の記述がありました。
Requires overdrivenpotato/rust#4
ということで、フォークされて機能が追加されたRustを使う必要があります。さっそくビルドしていきます。
git clone --depth 1 -b psp_std https://github.com/overdrivenpotato/rust.git
cd rust
cp config.toml.example config.toml
echo 'channel = "nightly"' >> config.toml
./x.py check
./x.py build library
これで stage1
の rustc
を作ることができます。
2024年2月17日現在、この方法でビルドした rustc
のバージョンは rustc 1.63.0-nightly (bbc595cfe 2022-07-10)
となります。 rustup
を使っている場合、以下のコマンドで cargo
のバージョンを合わせることができます。
rustup override set nightly-2022-06-25
次に rust-psp に含まれる cargo-psp
自体も弄る必要があります。そのままだとバージョンチェックで弾かれてしまうので、 cargo-psp/src/main.rs
の MINIMUM_COMMIT_DATE
と MINIMUM_RUSTC_VERSION
という定数を以下のように下げてビルドします。
const MINIMUM_COMMIT_DATE: CommitDate = CommitDate {
year: 2022,
month: 7,
day: 9,
};
const MINIMUM_RUSTC_VERSION: Version = Version {
major: 1,
minor: 63,
patch: 0,
pre: Prerelease::EMPTY,
build: BuildMetadata::EMPTY,
};
これで rustc
と cargo-psp
を作ることができました。
作ったバイナリを用いて rust-std-hello-world
をビルドします。若干フラグの指定が必要です。
RUST_PSP_BUILD_STD=1 RUSTFLAGS="-C linker=lld" RUSTC=/path/to/rustc /path/to/cargo-psp
成功すると EBOOT.PBP
が出来上がります。PPSSPPや実機などを用いて動作確認ができれば完了です。
とりあえず以上となります。今後の展望としては古くなったフォークを更新して新しいバージョンのRustを使えるようになったりするといいですね。
Discussion