rustcカスタマイズ事始め

前回に引き続きrustcをカスタマイズする話。まずは環境整備とテストランです。

っていうか前回書いておいてあんまり読んでいなかったのですが、ここ、実はこれからやろうとしていることとだいたい同じようなことをやっています。そして前回の推測はだいたい正しかったらしい。まあ気にせず続けていきましょう。

ソースコードはここで、随時更新していきます。

以下ポイントなど。

toolchain指定

rustcの内部コードをいじくるのでnightlyを使わなくてはならないのですがこちらに従ってプロジェクトルートに

nightly

と一行書いた、rust-toolchainというファイルを作っておきましょう。VSCodeを使っている場合、settings.jsonに"rust-client.channel": "nightly"も加えておくといいです。

ライブラリのディレクトリ指定

これでマイrustcを走らせることができるのですが、このままではstdなどのcrateが使えないためほぼなにもできません。そこで、標準crateをデフォルトのrustcから拝借してきましょう。

root=`rustc --print sysroot`
target=`rustup target list|grep default | awk '{print $1}'`
cargo run -- -L "${root}/lib/rustlib/${target}/lib/" $1

こんなスクリプトを書くとよいです。(targetのところ、もう少しなんとかできそうな気もしますが…)

Minimal example

というわけで、最小のコード例はこんな感じです。

#![feature(rustc_private)]

extern crate rustc_driver;

use rustc_driver::{run_compiler, RustcDefaultCalls};
use std::env;

fn main() {
    let args = env::args_os()
        .map(|arg| arg.into_string().unwrap())
        .collect::<Vec<_>>();
    run_compiler(&args, &mut RustcDefaultCalls, None, None);
}

次回以降、run_compiler第二引数と格闘していきます。

Comments

comments powered by Disqus