1 #![feature(rustc_private)]
4 extern crate rustc_interface;
5 extern crate rustc_driver as _;
8 use rustc::session::DiagnosticOutput;
9 use rustc::session::config::{Input, Options,
10 OutputType, OutputTypes};
11 use rustc_interface::interface;
12 use syntax::source_map::FileName;
14 use std::path::PathBuf;
21 let args: Vec<String> = std::env::args().collect();
24 panic!("expected rustc path");
27 let tmpdir = PathBuf::from(&args[1]);
29 let mut sysroot = PathBuf::from(&args[3]);
33 compile(src.to_string(), tmpdir.join("out"), sysroot.clone());
35 compile(src.to_string(), tmpdir.join("out"), sysroot.clone());
38 fn compile(code: String, output: PathBuf, sysroot: PathBuf) {
39 let mut opts = Options::default();
40 opts.output_types = OutputTypes::new(&[(OutputType::Exe, None)]);
41 opts.maybe_sysroot = Some(sysroot);
43 if let Ok(linker) = std::env::var("RUSTC_LINKER") {
44 opts.cg.linker = Some(linker.into());
47 let name = FileName::anon_source_code(&code);
48 let input = Input::Str { name, input: code };
50 let config = interface::Config {
52 crate_cfg: Default::default(),
55 output_file: Some(output),
58 diagnostic_output: DiagnosticOutput::Default,
61 lint_caps: Default::default(),
63 override_queries: None,
66 interface::run_compiler(config, |compiler| {
67 // This runs all the passes prior to linking, too.