はじめに
ちょんぼでハマってしまったので、同じ過ちを他の人が繰り返さないための情報です。
Rustのツールチェーンが1ヶ月分古かったせいで、最新機能であるpanic_implementationがコンパイルできなかった、という内容です。
Blog OS
Writing an OS in Rust (Second Edition)
Rustで小さなOSを作るチュートリアルです。OSの名前がBlog OSです。
2nd Editionになっており、継続的にコンテンツが更新されています(2018年7月現在)。
こういうコンテンツがあるおかげで、私のような凡人でもRustでOS作ってみよう!となれるので、本当にありがたいです。
発生した問題
A Freestanding Rust Binary
最初のコンテンツ、ベアメタルでRustバイナリを作るチュートリアルです。
ここで、panic時のハンドラを実装します。
// in main.rs
use core::panic::PanicInfo;
/// This function is called on panic.
#[panic_implementation]
#[no_mangle]
pub fn panic(_info: &PanicInfo) -> ! {
loop {}
}
上記コードをnightly Rustでビルドしたところ、panic_implementationがunstableとなるはずが、unknownのエラーが出力されました。
A Freestanding Rust Binaryの記事が書かれたのが、2018年2月のようだったので(ページ最上部情報)、2018年5月のnightly Rustでビルドできないのはなんでだ?となりました。
調査
記事のBlameを辿ると、panic_implementationの部分は、2018年6月4日に修正が入っていました。
ムムっと思って、Rustのツールチェーンを更新したところ、無事、ビルドが通るようになりました。
$ rustup update
$ rustup override add nightly.
$ rustc --version
rustc 1.28.0-nightly (e3bf634e0 2018-06-28)
うろ覚えですが、ビルド通らなかった時は、1.27.0-nightlyだったはずです。
(エラーログ残してなかった。不覚…)
panic_implementation
そもそもpanic_implementationとはなんぞや?となります。
これも、2018年6月4日に言及があり、
As of the latest nightly this language item has been removed in favor of the #[panic_implementation] attribute which offers a type checked way of declaring the behavior of panic!.
この時点で最新のnightly Rustにpanic_implementationが入ったであろうことが判明しました。
これはbreaking-changeであるため、これまでpanic_fmtで書かれていたcrateは修正が必要になる、とのことです。
現時点では、ベアメタルでRustを動作させる記事の多くがpanic_fmtを利用したコードサンプルになっていると思うので、今後、ベアメタルでRustを書く方は注意が必要です。
近い将来、panic_fmtが利用できなくなるはずです。
おわりに
ということで、かなりしょうもないハマり方をしてしまいましたが、今後も使う機能のbreak-changeが学べたので良かったです。
皆様もお気をつけ下さい。