]>
Commit | Line | Data |
---|---|---|
b039eaaf | 1 | #![feature(rustc_private)] |
c34b1796 | 2 | |
532ac7d7 | 3 | extern crate rustc_interface; |
60c5eb7d | 4 | extern crate rustc_driver; |
ba9703b0 | 5 | extern crate rustc_session; |
dfeec247 | 6 | extern crate rustc_span; |
1a4d82fc | 7 | |
ba9703b0 XL |
8 | use rustc_session::DiagnosticOutput; |
9 | use rustc_session::config::{Input, Options, OutputType, OutputTypes}; | |
532ac7d7 | 10 | use rustc_interface::interface; |
dfeec247 | 11 | use rustc_span::source_map::FileName; |
1a4d82fc | 12 | |
c34b1796 AL |
13 | use std::path::PathBuf; |
14 | ||
1a4d82fc JJ |
15 | fn main() { |
16 | let src = r#" | |
17 | fn main() {} | |
18 | "#; | |
19 | ||
85aaf69f | 20 | let args: Vec<String> = std::env::args().collect(); |
1a4d82fc JJ |
21 | |
22 | if args.len() < 4 { | |
23 | panic!("expected rustc path"); | |
24 | } | |
25 | ||
c34b1796 | 26 | let tmpdir = PathBuf::from(&args[1]); |
1a4d82fc | 27 | |
c34b1796 | 28 | let mut sysroot = PathBuf::from(&args[3]); |
1a4d82fc JJ |
29 | sysroot.pop(); |
30 | sysroot.pop(); | |
31 | ||
32 | compile(src.to_string(), tmpdir.join("out"), sysroot.clone()); | |
33 | ||
34 | compile(src.to_string(), tmpdir.join("out"), sysroot.clone()); | |
35 | } | |
36 | ||
c34b1796 | 37 | fn compile(code: String, output: PathBuf, sysroot: PathBuf) { |
532ac7d7 XL |
38 | let mut opts = Options::default(); |
39 | opts.output_types = OutputTypes::new(&[(OutputType::Exe, None)]); | |
40 | opts.maybe_sysroot = Some(sysroot); | |
41 | ||
42 | if let Ok(linker) = std::env::var("RUSTC_LINKER") { | |
43 | opts.cg.linker = Some(linker.into()); | |
44 | } | |
45 | ||
46 | let name = FileName::anon_source_code(&code); | |
47 | let input = Input::Str { name, input: code }; | |
48 | ||
49 | let config = interface::Config { | |
50 | opts, | |
51 | crate_cfg: Default::default(), | |
52 | input, | |
53 | input_path: None, | |
54 | output_file: Some(output), | |
55 | output_dir: None, | |
56 | file_loader: None, | |
57 | diagnostic_output: DiagnosticOutput::Default, | |
58 | stderr: None, | |
532ac7d7 | 59 | lint_caps: Default::default(), |
6a06907d | 60 | parse_sess_created: None, |
e74abb32 | 61 | register_lints: None, |
60c5eb7d | 62 | override_queries: None, |
1b1a35ee | 63 | make_codegen_backend: None, |
60c5eb7d | 64 | registry: rustc_driver::diagnostics_registry(), |
532ac7d7 XL |
65 | }; |
66 | ||
67 | interface::run_compiler(config, |compiler| { | |
e74abb32 | 68 | // This runs all the passes prior to linking, too. |
60c5eb7d XL |
69 | let linker = compiler.enter(|queries| { |
70 | queries.linker() | |
71 | }); | |
72 | if let Ok(linker) = linker { | |
73 | linker.link(); | |
74 | } | |
0531ce1d | 75 | }); |
1a4d82fc | 76 | } |