//! not a lot of interesting happenings here unfortunately.
use std::env;
-use std::str;
use std::fs;
use std::io;
use std::path::{Path, PathBuf};
use std::process::Command;
+use std::str;
use std::time::Instant;
use build_helper::t;
-use crate::config::Config;
use crate::builder::Builder;
use crate::cache::Interned;
+use crate::config::Config;
/// Returns the `name` as the filename of a static library for `target`.
pub fn staticlib(name: &str, target: &str) -> String {
- if target.contains("windows") {
- format!("{}.lib", name)
- } else {
- format!("lib{}.a", name)
- }
+ if target.contains("windows") { format!("{}.lib", name) } else { format!("lib{}.a", name) }
}
/// Given an executable called `name`, return the filename for the
/// executable for a particular target.
pub fn exe(name: &str, target: &str) -> String {
- if target.contains("windows") {
- format!("{}.exe", name)
- } else {
- name.to_string()
- }
+ if target.contains("windows") { format!("{}.exe", name) } else { name.to_string() }
}
/// Returns `true` if the file name given looks like a dynamic library.
/// Returns the corresponding relative library directory that the compiler's
/// dylibs will be found in.
pub fn libdir(target: &str) -> &'static str {
- if target.contains("windows") {"bin"} else {"lib"}
+ if target.contains("windows") { "bin" } else { "lib" }
}
/// Adds a list of lookup paths to `cmd`'s dynamic library lookup path.
fn drop(&mut self) {
let time = self.1.elapsed();
if !self.0 {
- println!("\tfinished in {}.{:03}",
- time.as_secs(),
- time.subsec_nanos() / 1_000_000);
+ println!("\tfinished in {}.{:03}", time.as_secs(), time.subsec_nanos() / 1_000_000);
}
}
}
/// Symlinks two directories, using junctions on Windows and normal symlinks on
/// Unix.
pub fn symlink_dir(config: &Config, src: &Path, dest: &Path) -> io::Result<()> {
- if config.dry_run { return Ok(()); }
+ if config.dry_run {
+ return Ok(());
+ }
let _ = fs::remove_dir(dest);
return symlink_dir_inner(src, dest);
// what can be found here:
//
// http://www.flexhex.com/docs/articles/hard-links.phtml
- //
- // Copied from std
#[cfg(windows)]
- #[allow(nonstandard_style)]
fn symlink_dir_inner(target: &Path, junction: &Path) -> io::Result<()> {
- use std::ptr;
use std::ffi::OsStr;
use std::os::windows::ffi::OsStrExt;
+ use std::ptr;
- const MAXIMUM_REPARSE_DATA_BUFFER_SIZE: usize = 16 * 1024;
- const GENERIC_WRITE: DWORD = 0x40000000;
- const OPEN_EXISTING: DWORD = 3;
- const FILE_FLAG_OPEN_REPARSE_POINT: DWORD = 0x00200000;
- const FILE_FLAG_BACKUP_SEMANTICS: DWORD = 0x02000000;
- const FSCTL_SET_REPARSE_POINT: DWORD = 0x900a4;
- const IO_REPARSE_TAG_MOUNT_POINT: DWORD = 0xa0000003;
- const FILE_SHARE_DELETE: DWORD = 0x4;
- const FILE_SHARE_READ: DWORD = 0x1;
- const FILE_SHARE_WRITE: DWORD = 0x2;
-
- type BOOL = i32;
- type DWORD = u32;
- type HANDLE = *mut u8;
- type LPCWSTR = *const u16;
- type LPDWORD = *mut DWORD;
- type LPOVERLAPPED = *mut u8;
- type LPSECURITY_ATTRIBUTES = *mut u8;
- type LPVOID = *mut u8;
- type WCHAR = u16;
- type WORD = u16;
-
+ use winapi::shared::minwindef::{DWORD, WORD};
+ use winapi::um::fileapi::{CreateFileW, OPEN_EXISTING};
+ use winapi::um::handleapi::CloseHandle;
+ use winapi::um::ioapiset::DeviceIoControl;
+ use winapi::um::winbase::{FILE_FLAG_BACKUP_SEMANTICS, FILE_FLAG_OPEN_REPARSE_POINT};
+ use winapi::um::winioctl::FSCTL_SET_REPARSE_POINT;
+ use winapi::um::winnt::{
+ FILE_SHARE_DELETE, FILE_SHARE_READ, FILE_SHARE_WRITE, GENERIC_WRITE,
+ IO_REPARSE_TAG_MOUNT_POINT, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, WCHAR,
+ };
+
+ #[allow(non_snake_case)]
#[repr(C)]
struct REPARSE_MOUNTPOINT_DATA_BUFFER {
ReparseTag: DWORD,
ReparseTarget: WCHAR,
}
- extern "system" {
- fn CreateFileW(lpFileName: LPCWSTR,
- dwDesiredAccess: DWORD,
- dwShareMode: DWORD,
- lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
- dwCreationDisposition: DWORD,
- dwFlagsAndAttributes: DWORD,
- hTemplateFile: HANDLE)
- -> HANDLE;
- fn DeviceIoControl(hDevice: HANDLE,
- dwIoControlCode: DWORD,
- lpInBuffer: LPVOID,
- nInBufferSize: DWORD,
- lpOutBuffer: LPVOID,
- nOutBufferSize: DWORD,
- lpBytesReturned: LPDWORD,
- lpOverlapped: LPOVERLAPPED) -> BOOL;
- fn CloseHandle(hObject: HANDLE) -> BOOL;
- }
-
fn to_u16s<S: AsRef<OsStr>>(s: S) -> io::Result<Vec<u16>> {
Ok(s.as_ref().encode_wide().chain(Some(0)).collect())
}
let path = to_u16s(junction)?;
unsafe {
- let h = CreateFileW(path.as_ptr(),
- GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- ptr::null_mut(),
- OPEN_EXISTING,
- FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS,
- ptr::null_mut());
-
- let mut data = [0u8; MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
- let db = data.as_mut_ptr()
- as *mut REPARSE_MOUNTPOINT_DATA_BUFFER;
+ let h = CreateFileW(
+ path.as_ptr(),
+ GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ ptr::null_mut(),
+ OPEN_EXISTING,
+ FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS,
+ ptr::null_mut(),
+ );
+
+ let mut data = [0u8; MAXIMUM_REPARSE_DATA_BUFFER_SIZE as usize];
+ let db = data.as_mut_ptr() as *mut REPARSE_MOUNTPOINT_DATA_BUFFER;
let buf = &mut (*db).ReparseTarget as *mut u16;
let mut i = 0;
// FIXME: this conversion is very hacky
(*db).ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
(*db).ReparseTargetMaximumLength = (i * 2) as WORD;
(*db).ReparseTargetLength = ((i - 1) * 2) as WORD;
- (*db).ReparseDataLength =
- (*db).ReparseTargetLength as DWORD + 12;
+ (*db).ReparseDataLength = (*db).ReparseTargetLength as DWORD + 12;
let mut ret = 0;
- let res = DeviceIoControl(h as *mut _,
- FSCTL_SET_REPARSE_POINT,
- data.as_ptr() as *mut _,
- (*db).ReparseDataLength + 8,
- ptr::null_mut(), 0,
- &mut ret,
- ptr::null_mut());
-
- let out = if res == 0 {
- Err(io::Error::last_os_error())
- } else {
- Ok(())
- };
+ let res = DeviceIoControl(
+ h as *mut _,
+ FSCTL_SET_REPARSE_POINT,
+ data.as_ptr() as *mut _,
+ (*db).ReparseDataLength + 8,
+ ptr::null_mut(),
+ 0,
+ &mut ret,
+ ptr::null_mut(),
+ );
+
+ let out = if res == 0 { Err(io::Error::last_os_error()) } else { Ok(()) };
CloseHandle(h);
out
}
"0" | "no" | "off" => false,
other => {
// Let's make sure typos don't go unnoticed
- panic!("Unrecognized option '{}' set in \
- RUSTBUILD_FORCE_CLANG_BASED_TESTS", other)
+ panic!(
+ "Unrecognized option '{}' set in \
+ RUSTBUILD_FORCE_CLANG_BASED_TESTS",
+ other
+ )
}
}
} else {
pub fn use_host_linker(target: &Interned<String>) -> bool {
// FIXME: this information should be gotten by checking the linker flavor
// of the rustc target
- !(
- target.contains("emscripten") ||
- target.contains("wasm32") ||
- target.contains("nvptx") ||
- target.contains("fortanix") ||
- target.contains("fuchsia")
- )
+ !(target.contains("emscripten")
+ || target.contains("wasm32")
+ || target.contains("nvptx")
+ || target.contains("fortanix")
+ || target.contains("fuchsia"))
}