2015-09-30 12:08:37 -05:00
|
|
|
#![feature(rustc_private)]
|
2015-03-05 20:33:58 -06:00
|
|
|
|
2014-11-28 22:56:09 -06:00
|
|
|
extern crate rustc;
|
2014-12-04 23:00:06 -06:00
|
|
|
extern crate rustc_driver;
|
2015-02-25 05:44:44 -06:00
|
|
|
extern crate rustc_lint;
|
2015-11-24 17:23:22 -06:00
|
|
|
extern crate rustc_metadata;
|
2016-06-22 11:50:19 -05:00
|
|
|
extern crate rustc_errors;
|
2018-05-08 08:10:16 -05:00
|
|
|
extern crate rustc_codegen_utils;
|
2014-11-28 22:56:09 -06:00
|
|
|
extern crate syntax;
|
|
|
|
|
|
|
|
use rustc::session::{build_session, Session};
|
2018-07-26 13:36:11 -05:00
|
|
|
use rustc::session::config::{Input, Options,
|
2016-08-02 15:53:58 -05:00
|
|
|
OutputType, OutputTypes};
|
2018-05-27 06:10:12 -05:00
|
|
|
use rustc_driver::driver::{self, compile_input, CompileController};
|
2015-11-24 17:23:22 -06:00
|
|
|
use rustc_metadata::cstore::CStore;
|
2016-06-22 11:50:19 -05:00
|
|
|
use rustc_errors::registry::Registry;
|
2018-08-18 05:14:03 -05:00
|
|
|
use syntax::source_map::FileName;
|
2018-05-08 08:10:16 -05:00
|
|
|
use rustc_codegen_utils::codegen_backend::CodegenBackend;
|
2014-11-28 22:56:09 -06:00
|
|
|
|
2015-02-26 23:00:43 -06:00
|
|
|
use std::path::PathBuf;
|
2015-11-22 13:02:04 -06:00
|
|
|
use std::rc::Rc;
|
2015-02-26 23:00:43 -06:00
|
|
|
|
2014-11-28 22:56:09 -06:00
|
|
|
fn main() {
|
|
|
|
let src = r#"
|
|
|
|
fn main() {}
|
|
|
|
"#;
|
|
|
|
|
2015-02-16 08:04:02 -06:00
|
|
|
let args: Vec<String> = std::env::args().collect();
|
2014-11-28 22:56:09 -06:00
|
|
|
|
|
|
|
if args.len() < 4 {
|
|
|
|
panic!("expected rustc path");
|
|
|
|
}
|
|
|
|
|
2015-03-23 17:54:39 -05:00
|
|
|
let tmpdir = PathBuf::from(&args[1]);
|
2014-11-28 22:56:09 -06:00
|
|
|
|
2015-03-23 17:54:39 -05:00
|
|
|
let mut sysroot = PathBuf::from(&args[3]);
|
2014-11-28 22:56:09 -06:00
|
|
|
sysroot.pop();
|
|
|
|
sysroot.pop();
|
|
|
|
|
|
|
|
compile(src.to_string(), tmpdir.join("out"), sysroot.clone());
|
|
|
|
|
|
|
|
compile(src.to_string(), tmpdir.join("out"), sysroot.clone());
|
|
|
|
}
|
|
|
|
|
2018-05-27 06:10:12 -05:00
|
|
|
fn basic_sess(opts: Options) -> (Session, Rc<CStore>, Box<CodegenBackend>) {
|
2015-04-27 21:48:22 -05:00
|
|
|
let descriptions = Registry::new(&rustc::DIAGNOSTICS);
|
2017-09-09 13:02:18 -05:00
|
|
|
let sess = build_session(opts, None, descriptions);
|
2018-05-08 08:10:16 -05:00
|
|
|
let codegen_backend = rustc_driver::get_codegen_backend(&sess);
|
|
|
|
let cstore = Rc::new(CStore::new(codegen_backend.metadata_loader()));
|
2015-02-25 05:44:44 -06:00
|
|
|
rustc_lint::register_builtins(&mut sess.lint_store.borrow_mut(), Some(&sess));
|
2018-05-08 08:10:16 -05:00
|
|
|
(sess, cstore, codegen_backend)
|
2014-11-28 22:56:09 -06:00
|
|
|
}
|
|
|
|
|
2015-02-26 23:00:43 -06:00
|
|
|
fn compile(code: String, output: PathBuf, sysroot: PathBuf) {
|
2018-03-06 19:44:10 -06:00
|
|
|
syntax::with_globals(|| {
|
2018-07-26 13:36:11 -05:00
|
|
|
let mut opts = Options::default();
|
2018-05-27 06:10:12 -05:00
|
|
|
opts.output_types = OutputTypes::new(&[(OutputType::Exe, None)]);
|
|
|
|
opts.maybe_sysroot = Some(sysroot);
|
|
|
|
if let Ok(linker) = std::env::var("RUSTC_LINKER") {
|
|
|
|
opts.cg.linker = Some(linker.into());
|
|
|
|
}
|
|
|
|
driver::spawn_thread_pool(opts, |opts| {
|
|
|
|
let (sess, cstore, codegen_backend) = basic_sess(opts);
|
|
|
|
let control = CompileController::basic();
|
2018-12-04 14:18:03 -06:00
|
|
|
let name = FileName::anon_source_code(&code);
|
|
|
|
let input = Input::Str { name, input: code };
|
2018-05-27 06:10:12 -05:00
|
|
|
let _ = compile_input(
|
|
|
|
codegen_backend,
|
|
|
|
&sess,
|
|
|
|
&cstore,
|
|
|
|
&None,
|
|
|
|
&input,
|
|
|
|
&None,
|
|
|
|
&Some(output),
|
|
|
|
None,
|
|
|
|
&control
|
|
|
|
);
|
|
|
|
});
|
2018-03-06 19:44:10 -06:00
|
|
|
});
|
2014-11-28 22:56:09 -06:00
|
|
|
}
|