1 #![feature(rustc_private)]
3 extern crate rustc_driver
;
4 extern crate rustc_interface
;
5 extern crate rustc_session
;
6 extern crate rustc_span
;
8 use rustc_interface
::interface
;
9 use rustc_session
::config
::{Input, Options, OutFileName, OutputType, OutputTypes}
;
10 use rustc_span
::source_map
::FileName
;
12 use std
::path
::PathBuf
;
19 let args
: Vec
<String
> = std
::env
::args().collect();
22 panic
!("expected rustc path");
25 let tmpdir
= PathBuf
::from(&args
[1]);
27 let mut sysroot
= PathBuf
::from(&args
[3]);
31 compile(src
.to_string(), tmpdir
.join("out"), sysroot
.clone());
33 compile(src
.to_string(), tmpdir
.join("out"), sysroot
.clone());
36 fn compile(code
: String
, output
: PathBuf
, sysroot
: PathBuf
) {
37 let mut opts
= Options
::default();
38 opts
.output_types
= OutputTypes
::new(&[(OutputType
::Exe
, None
)]);
39 opts
.maybe_sysroot
= Some(sysroot
);
41 if let Ok(linker
) = std
::env
::var("RUSTC_LINKER") {
42 opts
.cg
.linker
= Some(linker
.into());
45 let name
= FileName
::anon_source_code(&code
);
46 let input
= Input
::Str { name, input: code }
;
48 let config
= interface
::Config
{
50 crate_cfg
: Default
::default(),
51 crate_check_cfg
: Default
::default(),
53 output_file
: Some(OutFileName
::Real(output
)),
57 locale_resources
: &[],
58 lint_caps
: Default
::default(),
59 parse_sess_created
: None
,
61 override_queries
: None
,
62 make_codegen_backend
: None
,
63 registry
: rustc_driver
::diagnostics_registry(),
64 expanded_args
: Default
::default(),
67 interface
::run_compiler(config
, |compiler
| {
68 let linker
= compiler
.enter(|queries
| {
69 queries
.global_ctxt()?
.enter(|tcx
| tcx
.analysis(()))?
;
70 let ongoing_codegen
= queries
.ongoing_codegen()?
;
71 queries
.linker(ongoing_codegen
)
73 linker
.unwrap().link().unwrap();