diff --git a/dev-lang/rust/files/rust-9999-fix-clippy-sysroot.patch b/dev-lang/rust/files/rust-9999-fix-clippy-sysroot.patch index 2cdd2ef..a54e985 100644 --- a/dev-lang/rust/files/rust-9999-fix-clippy-sysroot.patch +++ b/dev-lang/rust/files/rust-9999-fix-clippy-sysroot.patch @@ -1,64 +1,62 @@ -diff --git a/src/driver.rs b/src/driver.rs -index 99f8bc61..02ffc6db 100644 ---- a/src/tools/clippy/src/driver.rs -+++ b/src/tools/clippy/src/driver.rs -@@ -29,54 +30,22 @@ pub fn main() { - exit(0); - } +--- a/src/tools/clippy/src/driver.rs 2018-12-28 14:57:17.654845497 +0300 ++++ b/src/tools/clippy/src/driver.rs 2018-12-28 15:08:41.902823310 +0300 +@@ -40,54 +40,23 @@ + exit(0); + } -- let sys_root = option_env!("SYSROOT") -- .map(String::from) -- .or_else(|| std::env::var("SYSROOT").ok()) -- .or_else(|| { -- let home = option_env!("RUSTUP_HOME").or(option_env!("MULTIRUST_HOME")); -- let toolchain = option_env!("RUSTUP_TOOLCHAIN").or(option_env!("MULTIRUST_TOOLCHAIN")); -- home.and_then(|home| toolchain.map(|toolchain| format!("{}/toolchains/{}", home, toolchain))) -- }) -- .or_else(|| { -- Command::new("rustc") -- .arg("--print") -- .arg("sysroot") -- .output() -- .ok() -- .and_then(|out| String::from_utf8(out.stdout).ok()) -- .map(|s| s.trim().to_owned()) -- }) -- .expect("need to specify SYSROOT env var during clippy compilation, or use rustup or multirust"); -- - // Setting RUSTC_WRAPPER causes Cargo to pass 'rustc' as the first argument. - // We're invoking the compiler programmatically, so we ignore this/ -- let mut orig_args: Vec = env::args().collect(); -- if orig_args.len() <= 1 { -+ let mut args: Vec = env::args().collect(); -+ if args.len() <= 1 { - std::process::exit(1); - } -- if Path::new(&orig_args[1]).file_stem() == Some("rustc".as_ref()) { -+ if Path::new(&args[1]).file_stem() == Some("rustc".as_ref()) { - // we still want to be able to invoke it normally though -- orig_args.remove(1); -+ args.remove(1); - } -- // this conditional check for the --sysroot flag is there so users can call -- // `clippy_driver` directly -- // without having to pass --sysroot or anything -- let mut args: Vec = if orig_args.iter().any(|s| s == "--sysroot") { -- orig_args.clone() -- } else { -- orig_args -- .clone() -- .into_iter() -- .chain(Some("--sysroot".to_owned())) -- .chain(Some(sys_root)) -- .collect() -- }; +- let sys_root = option_env!("SYSROOT") +- .map(String::from) +- .or_else(|| std::env::var("SYSROOT").ok()) +- .or_else(|| { +- let home = option_env!("RUSTUP_HOME").or(option_env!("MULTIRUST_HOME")); +- let toolchain = option_env!("RUSTUP_TOOLCHAIN").or(option_env!("MULTIRUST_TOOLCHAIN")); +- home.and_then(|home| toolchain.map(|toolchain| format!("{}/toolchains/{}", home, toolchain))) +- }) +- .or_else(|| { +- Command::new("rustc") +- .arg("--print") +- .arg("sysroot") +- .output() +- .ok() +- .and_then(|out| String::from_utf8(out.stdout).ok()) +- .map(|s| s.trim().to_owned()) +- }) +- .expect("need to specify SYSROOT env var during clippy compilation, or use rustup or multirust"); - // this check ensures that dependencies are built but not linted and the final - // crate is - // linted but not built - let clippy_enabled = env::var("CLIPPY_TESTS").ok().map_or(false, |val| val == "true") -- || orig_args.iter().any(|s| s == "--emit=dep-info,metadata"); -+ || args.iter().any(|s| s == "--emit=dep-info,metadata"); + // Setting RUSTC_WRAPPER causes Cargo to pass 'rustc' as the first argument. + // We're invoking the compiler programmatically, so we ignore this/ +- let mut orig_args: Vec = env::args().collect(); +- if orig_args.len() <= 1 { ++ let mut args: Vec = env::args().collect(); ++ if args.len() <= 1 { + std::process::exit(1); + } +- if Path::new(&orig_args[1]).file_stem() == Some("rustc".as_ref()) { ++ if Path::new(&args[1]).file_stem() == Some("rustc".as_ref()) { + // we still want to be able to invoke it normally though +- orig_args.remove(1); ++ args.remove(1); + } +- // this conditional check for the --sysroot flag is there so users can call +- // `clippy_driver` directly +- // without having to pass --sysroot or anything +- let mut args: Vec = if orig_args.iter().any(|s| s == "--sysroot") { +- orig_args.clone() +- } else { +- orig_args +- .clone() +- .into_iter() +- .chain(Some("--sysroot".to_owned())) +- .chain(Some(sys_root)) +- .collect() +- }; - if clippy_enabled { - args.extend_from_slice(&["--cfg".to_owned(), r#"feature="cargo-clippy""#.to_owned()]); + // this check ensures that dependencies are built but not linted and the final + // crate is + // linted but not built + let clippy_enabled = env::var("CLIPPY_TESTS").ok().map_or(false, |val| val == "true") +- || orig_args.iter().any(|s| s == "--emit=dep-info,metadata"); ++ || args.iter().any(|s| s == "--emit=dep-info,metadata"); + + if clippy_enabled { + args.extend_from_slice(&["--cfg".to_owned(), r#"feature="cargo-clippy""#.to_owned()]); diff --git a/dev-lang/rust/files/rust-9999-fix-codegen-path.patch b/dev-lang/rust/files/rust-9999-fix-codegen-path.patch new file mode 100644 index 0000000..f3546dc --- /dev/null +++ b/dev-lang/rust/files/rust-9999-fix-codegen-path.patch @@ -0,0 +1,92 @@ +diff --git a/src/librustc/session/filesearch.rs b/src/librustc/session/filesearch.rs +index c204556d51..8c72869eb1 100644 +--- a/src/librustc/session/filesearch.rs ++++ b/src/librustc/session/filesearch.rs +@@ -124,6 +124,13 @@ pub fn make_target_lib_path(sysroot: &Path, target_triple: &str) -> PathBuf { + sysroot.join(&relative_target_lib_path(sysroot, target_triple)) + } + ++pub fn target_lib_path(target_triple: &str) -> PathBuf { ++ let mut p = PathBuf::from(RUST_LIB_DIR); ++ p.push(target_triple); ++ p.push("lib"); ++ p ++} ++ + pub fn get_or_default_sysroot() -> PathBuf { + // Follow symlinks. If the resolved path is relative, make it absolute. + fn canonicalize(path: Option) -> Option { +diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs +index 5527c0ad38..0f7e0eeaa8 100644 +--- a/src/librustc_driver/lib.rs ++++ b/src/librustc_driver/lib.rs +@@ -294,37 +294,35 @@ fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box { + } + + let target = session::config::host_triple(); +- let mut sysroot_candidates = vec![filesearch::get_or_default_sysroot()]; ++ // get target libdir path based on executable binary path ++ let sysroot = filesearch::get_or_default_sysroot(); ++ let mut libdir_candidates = vec![filesearch::make_target_lib_path(&sysroot, &target)]; + let path = current_dll_path() + .and_then(|s| s.canonicalize().ok()); + if let Some(dll) = path { +- // use `parent` twice to chop off the file name and then also the +- // directory containing the dll which should be either `lib` or `bin`. +- if let Some(path) = dll.parent().and_then(|p| p.parent()) { ++ // use `parent` once to chop off the file name ++ if let Some(path) = dll.parent() { + // The original `path` pointed at the `rustc_driver` crate's dll. + // Now that dll should only be in one of two locations. The first is +- // in the compiler's libdir, for example `$sysroot/lib/*.dll`. The ++ // in the compiler's libdir, for example `$sysroot/$libdir/*.dll`. The + // other is the target's libdir, for example +- // `$sysroot/lib/rustlib/$target/lib/*.dll`. ++ // `$sysroot/$libdir/rustlib/$target/lib/*.dll`. + // + // We don't know which, so let's assume that if our `path` above +- // ends in `$target` we *could* be in the target libdir, and always +- // assume that we may be in the main libdir. +- sysroot_candidates.push(path.to_owned()); +- +- if path.ends_with(target) { +- sysroot_candidates.extend(path.parent() // chop off `$target` +- .and_then(|p| p.parent()) // chop off `rustlib` +- .and_then(|p| p.parent()) // chop off `lib` +- .map(|s| s.to_owned())); ++ // doesn't end in `$target` we *could* be in the main libdir, and always ++ // assume that we may be in the target libdir. ++ libdir_candidates.push(path.to_owned()); ++ ++ if !path.parent().map_or(false, |p| p.ends_with(target)) { ++ libdir_candidates.push(path.join(filesearch::target_lib_path(target))); + } + } + } + +- let sysroot = sysroot_candidates.iter() +- .map(|sysroot| { +- let libdir = filesearch::relative_target_lib_path(&sysroot, &target); +- sysroot.join(libdir).with_file_name( ++ let sysroot = libdir_candidates.iter() ++ .map(|libdir| { ++ debug!("Trying target libdir: {}", libdir.display()); ++ libdir.with_file_name( + option_env!("CFG_CODEGEN_BACKENDS_DIR").unwrap_or("codegen-backends")) + }) + .filter(|f| { +@@ -333,12 +331,12 @@ fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box { + }) + .next(); + let sysroot = sysroot.unwrap_or_else(|| { +- let candidates = sysroot_candidates.iter() ++ let candidates = libdir_candidates.iter() + .map(|p| p.display().to_string()) + .collect::>() + .join("\n* "); + let err = format!("failed to find a `codegen-backends` folder \ +- in the sysroot candidates:\n* {}", candidates); ++ in the libdir candidates:\n* {}", candidates); + early_error(ErrorOutputType::default(), &err); + }); + info!("probing {} for a codegen backend", sysroot.display()); diff --git a/dev-lang/rust/rust-9999.ebuild b/dev-lang/rust/rust-9999.ebuild index e90b9a5..6ec9882 100644 --- a/dev-lang/rust/rust-9999.ebuild +++ b/dev-lang/rust/rust-9999.ebuild @@ -60,7 +60,9 @@ rls? ( source )" S="${WORKDIR}/${MY_P}-src" -PATCHES="${FILESDIR}/${P}-fix-clippy-sysroot.patch" +PATCHES="${FILESDIR}/${P}-fix-codegen-path.patch +${FILESDIR}/${P}-fix-clippy-sysroot.patch +" toml_usex() { usex "$1" true false