🦀

rust-pspをstdありで使う

2024/02/17に公開

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

これで stage1rustc を作ることができます。

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.rsMINIMUM_COMMIT_DATEMINIMUM_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,
};

これで rustccargo-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