1
1
use rustc_data_structures::fx::FxHashSet;
2
+ use rustc_data_structures::temp_dir::MaybeTempDir;
2
3
use rustc_fs_util::fix_windows_verbatim_for_gcc;
3
4
use rustc_hir::def_id::CrateNum;
4
5
use rustc_middle::middle::cstore::{EncodedMetadata, LibSource, NativeLib};
@@ -23,7 +24,7 @@ use super::rpath::{self, RPathConfig};
23
24
use crate::{looks_like_rust_object_file, CodegenResults, CrateInfo, METADATA_FILENAME};
24
25
25
26
use cc::windows_registry;
26
- use tempfile::{ Builder as TempFileBuilder, TempDir} ;
27
+ use tempfile::Builder as TempFileBuilder;
27
28
28
29
use std::ffi::OsString;
29
30
use std::path::{Path, PathBuf};
@@ -70,35 +71,29 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>(
70
71
}
71
72
});
72
73
73
- let tmpdir = TempFileBuilder::new()
74
- .prefix("rustc")
75
- .tempdir()
76
- .unwrap_or_else(|err| sess.fatal(&format!("couldn't create a temp dir: {}", err)));
77
-
78
74
if outputs.outputs.should_codegen() {
75
+ let tmpdir = TempFileBuilder::new()
76
+ .prefix("rustc")
77
+ .tempdir()
78
+ .unwrap_or_else(|err| sess.fatal(&format!("couldn't create a temp dir: {}", err)));
79
+ let path = MaybeTempDir::new(tmpdir, sess.opts.cg.save_temps);
79
80
let out_filename = out_filename(sess, crate_type, outputs, crate_name);
80
81
match crate_type {
81
82
CrateType::Rlib => {
82
83
let _timer = sess.timer("link_rlib");
83
- link_rlib::<B>(
84
- sess,
85
- codegen_results,
86
- RlibFlavor::Normal,
87
- &out_filename,
88
- &tmpdir,
89
- )
90
- .build();
84
+ link_rlib::<B>(sess, codegen_results, RlibFlavor::Normal, &out_filename, &path)
85
+ .build();
91
86
}
92
87
CrateType::Staticlib => {
93
- link_staticlib::<B>(sess, codegen_results, &out_filename, &tmpdir );
88
+ link_staticlib::<B>(sess, codegen_results, &out_filename, &path );
94
89
}
95
90
_ => {
96
91
link_natively::<B>(
97
92
sess,
98
93
crate_type,
99
94
&out_filename,
100
95
codegen_results,
101
- tmpdir. path(),
96
+ path.as_ref (),
102
97
target_cpu,
103
98
);
104
99
}
@@ -107,10 +102,6 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>(
107
102
sess.parse_sess.span_diagnostic.emit_artifact_notification(&out_filename, "link");
108
103
}
109
104
}
110
-
111
- if sess.opts.cg.save_temps {
112
- let _ = tmpdir.into_path();
113
- }
114
105
}
115
106
116
107
// Remove the temporary object file and metadata if we aren't saving temps
@@ -279,8 +270,8 @@ pub fn each_linked_rlib(
279
270
/// building an `.rlib` (stomping over one another), or writing an `.rmeta` into a
280
271
/// directory being searched for `extern crate` (observing an incomplete file).
281
272
/// The returned path is the temporary file containing the complete metadata.
282
- pub fn emit_metadata(sess: &Session, metadata: &EncodedMetadata, tmpdir: &TempDir ) -> PathBuf {
283
- let out_filename = tmpdir.path ().join(METADATA_FILENAME);
273
+ pub fn emit_metadata(sess: &Session, metadata: &EncodedMetadata, tmpdir: &MaybeTempDir ) -> PathBuf {
274
+ let out_filename = tmpdir.as_ref ().join(METADATA_FILENAME);
284
275
let result = fs::write(&out_filename, &metadata.raw_data);
285
276
286
277
if let Err(e) = result {
@@ -301,7 +292,7 @@ fn link_rlib<'a, B: ArchiveBuilder<'a>>(
301
292
codegen_results: &CodegenResults,
302
293
flavor: RlibFlavor,
303
294
out_filename: &Path,
304
- tmpdir: &TempDir ,
295
+ tmpdir: &MaybeTempDir ,
305
296
) -> B {
306
297
info!("preparing rlib to {:?}", out_filename);
307
298
let mut ab = <B as ArchiveBuilder>::new(sess, out_filename, None);
@@ -406,7 +397,7 @@ fn link_staticlib<'a, B: ArchiveBuilder<'a>>(
406
397
sess: &'a Session,
407
398
codegen_results: &CodegenResults,
408
399
out_filename: &Path,
409
- tempdir: &TempDir ,
400
+ tempdir: &MaybeTempDir ,
410
401
) {
411
402
let mut ab =
412
403
link_rlib::<B>(sess, codegen_results, RlibFlavor::StaticlibBase, out_filename, tempdir);
0 commit comments