884715c654
Building on the work of # 45684 this commit updates the compiler to unconditionally load the `rustc_trans` crate at runtime instead of linking to it at compile time. The end goal of this work is to implement # 46819 where rustc will have multiple backends available to it to load. This commit starts off by removing the `extern crate rustc_trans` from the driver. This involved moving some miscellaneous functionality into the `TransCrate` trait and also required an implementation of how to locate and load the trans backend. This ended up being a little tricky because the sysroot isn't always the right location (for example `--sysroot` arguments) so some extra code was added as well to probe a directory relative to the current dll (the rustc_driver dll). Rustbuild has been updated accordingly as well to have a separate compilation invocation for the `rustc_trans` crate and assembly it accordingly into the sysroot. Finally, the distribution logic for the `rustc` package was also updated to slurp up the trans backends folder. A number of assorted fallout changes were included here as well to ensure tests pass and such, and they should all be commented inline.
61 lines
1.6 KiB
Rust
61 lines
1.6 KiB
Rust
// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
use std::env;
|
|
use std::fs::File;
|
|
use std::io::{Read, Write};
|
|
use std::path::PathBuf;
|
|
|
|
#[cfg(unix)]
|
|
fn switch_stdout_to(file: File) {
|
|
use std::os::unix::prelude::*;
|
|
|
|
extern {
|
|
fn dup2(old: i32, new: i32) -> i32;
|
|
}
|
|
|
|
unsafe {
|
|
assert_eq!(dup2(file.as_raw_fd(), 1), 1);
|
|
}
|
|
}
|
|
|
|
#[cfg(windows)]
|
|
fn switch_stdout_to(file: File) {
|
|
use std::os::windows::prelude::*;
|
|
|
|
extern "system" {
|
|
fn SetStdHandle(nStdHandle: u32, handle: *mut u8) -> i32;
|
|
}
|
|
|
|
const STD_OUTPUT_HANDLE: u32 = (-11i32) as u32;
|
|
|
|
unsafe {
|
|
let rc = SetStdHandle(STD_OUTPUT_HANDLE,
|
|
file.into_raw_handle() as *mut _);
|
|
assert!(rc != 0);
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
let path = PathBuf::from(env::var_os("RUST_TEST_TMPDIR").unwrap());
|
|
let path = path.join("switch-stdout-output");
|
|
let f = File::create(&path).unwrap();
|
|
|
|
println!("foo");
|
|
std::io::stdout().flush().unwrap();
|
|
switch_stdout_to(f);
|
|
println!("bar");
|
|
std::io::stdout().flush().unwrap();
|
|
|
|
let mut contents = String::new();
|
|
File::open(&path).unwrap().read_to_string(&mut contents).unwrap();
|
|
assert_eq!(contents, "bar\n");
|
|
}
|