|
8 | 8 | //! `rustdoc`. |
9 | 9 |
|
10 | 10 | use std::fs; |
11 | | -use std::io; |
12 | 11 | use std::path::{Path, PathBuf}; |
13 | 12 |
|
14 | 13 | use crate::builder::crate_description; |
@@ -694,11 +693,12 @@ impl Step for Rustc { |
694 | 693 | // rustc. rustdoc needs to be able to see everything, for example when |
695 | 694 | // merging the search index, or generating local (relative) links. |
696 | 695 | let out_dir = builder.stage_out(compiler, Mode::Rustc).join(target.triple).join("doc"); |
697 | | - t!(symlink_dir_force(&builder.config, &out, &out_dir)); |
| 696 | + t!(fs::create_dir_all(out_dir.parent().unwrap())); |
| 697 | + symlink_dir_force(&builder.config, &out, &out_dir); |
698 | 698 | // Cargo puts proc macros in `target/doc` even if you pass `--target` |
699 | 699 | // explicitly (https://github.com/rust-lang/cargo/issues/7677). |
700 | 700 | let proc_macro_out_dir = builder.stage_out(compiler, Mode::Rustc).join("doc"); |
701 | | - t!(symlink_dir_force(&builder.config, &out, &proc_macro_out_dir)); |
| 701 | + symlink_dir_force(&builder.config, &out, &proc_macro_out_dir); |
702 | 702 |
|
703 | 703 | // Build cargo command. |
704 | 704 | let mut cargo = builder.cargo(compiler, Mode::Rustc, SourceType::InTree, target, "doc"); |
@@ -821,7 +821,7 @@ macro_rules! tool_doc { |
821 | 821 | ]; |
822 | 822 | for out_dir in out_dirs { |
823 | 823 | t!(fs::create_dir_all(&out_dir)); |
824 | | - t!(symlink_dir_force(&builder.config, &out, &out_dir)); |
| 824 | + symlink_dir_force(&builder.config, &out, &out_dir); |
825 | 825 | } |
826 | 826 |
|
827 | 827 | // Build cargo command. |
@@ -964,21 +964,24 @@ impl Step for UnstableBookGen { |
964 | 964 | } |
965 | 965 | } |
966 | 966 |
|
967 | | -fn symlink_dir_force(config: &Config, src: &Path, dst: &Path) -> io::Result<()> { |
| 967 | +fn symlink_dir_force(config: &Config, original: &Path, link: &Path) { |
968 | 968 | if config.dry_run() { |
969 | | - return Ok(()); |
| 969 | + return; |
970 | 970 | } |
971 | | - if let Ok(m) = fs::symlink_metadata(dst) { |
| 971 | + if let Ok(m) = fs::symlink_metadata(link) { |
972 | 972 | if m.file_type().is_dir() { |
973 | | - fs::remove_dir_all(dst)?; |
| 973 | + t!(fs::remove_dir_all(link)); |
974 | 974 | } else { |
975 | 975 | // handle directory junctions on windows by falling back to |
976 | 976 | // `remove_dir`. |
977 | | - fs::remove_file(dst).or_else(|_| fs::remove_dir(dst))?; |
| 977 | + t!(fs::remove_file(link).or_else(|_| fs::remove_dir(link))); |
978 | 978 | } |
979 | 979 | } |
980 | 980 |
|
981 | | - symlink_dir(config, src, dst) |
| 981 | + t!( |
| 982 | + symlink_dir(config, original, link), |
| 983 | + format!("failed to create link from {} -> {}", link.display(), original.display()) |
| 984 | + ); |
982 | 985 | } |
983 | 986 |
|
984 | 987 | #[derive(Ord, PartialOrd, Debug, Copy, Clone, Hash, PartialEq, Eq)] |
|
0 commit comments