Inline and remove link_binary_output
.
This change simplifies things for the subsequent commit.
This commit is contained in:
parent
faf5eac854
commit
3da5d4a87e
1 changed files with 61 additions and 74 deletions
|
@ -63,12 +63,66 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
|
|||
bug!("invalid output type `{:?}` for target os `{}`",
|
||||
crate_type, sess.opts.target_triple);
|
||||
}
|
||||
link_binary_output::<B>(sess,
|
||||
codegen_results,
|
||||
crate_type,
|
||||
outputs,
|
||||
crate_name,
|
||||
target_cpu);
|
||||
|
||||
for obj in codegen_results.modules.iter().filter_map(|m| m.object.as_ref()) {
|
||||
check_file_is_writeable(obj, sess);
|
||||
}
|
||||
|
||||
if outputs.outputs.contains_key(&OutputType::Metadata) {
|
||||
let out_filename = filename_for_metadata(sess, crate_name, outputs);
|
||||
// To avoid races with another rustc process scanning the output directory,
|
||||
// we need to write the file somewhere else and atomically move it to its
|
||||
// final destination, with a `fs::rename` call. In order for the rename to
|
||||
// always succeed, the temporary file needs to be on the same filesystem,
|
||||
// which is why we create it inside the output directory specifically.
|
||||
let metadata_tmpdir = TempFileBuilder::new()
|
||||
.prefix("rmeta")
|
||||
.tempdir_in(out_filename.parent().unwrap())
|
||||
.unwrap_or_else(|err| sess.fatal(&format!("couldn't create a temp dir: {}", err)));
|
||||
let metadata = emit_metadata(sess, codegen_results, &metadata_tmpdir);
|
||||
match fs::rename(&metadata, &out_filename) {
|
||||
Ok(_) => {
|
||||
if sess.opts.debugging_opts.emit_directives {
|
||||
sess.parse_sess.span_diagnostic.maybe_emit_json_directive(
|
||||
format!("metadata file written: {}", out_filename.display()));
|
||||
}
|
||||
}
|
||||
Err(e) => sess.fatal(&format!("failed to write {}: {}", out_filename.display(), e)),
|
||||
}
|
||||
}
|
||||
|
||||
let tmpdir = TempFileBuilder::new().prefix("rustc").tempdir().unwrap_or_else(|err|
|
||||
sess.fatal(&format!("couldn't create a temp dir: {}", err)));
|
||||
|
||||
if outputs.outputs.should_codegen() {
|
||||
let out_filename = out_filename(sess, crate_type, outputs, crate_name);
|
||||
match crate_type {
|
||||
config::CrateType::Rlib => {
|
||||
link_rlib::<B>(sess,
|
||||
codegen_results,
|
||||
RlibFlavor::Normal,
|
||||
&out_filename,
|
||||
&tmpdir).build();
|
||||
}
|
||||
config::CrateType::Staticlib => {
|
||||
link_staticlib::<B>(sess, codegen_results, &out_filename, &tmpdir);
|
||||
}
|
||||
_ => {
|
||||
link_natively::<B>(
|
||||
sess,
|
||||
crate_type,
|
||||
&out_filename,
|
||||
codegen_results,
|
||||
tmpdir.path(),
|
||||
target_cpu,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if sess.opts.cg.save_temps {
|
||||
let _ = tmpdir.into_path();
|
||||
}
|
||||
}
|
||||
|
||||
// Remove the temporary object file and metadata if we aren't saving temps
|
||||
|
@ -85,7 +139,7 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
|
|||
if let Some(ref obj) = metadata_module.object {
|
||||
remove(sess, obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
if let Some(ref allocator_module) = codegen_results.allocator_module {
|
||||
if let Some(ref obj) = allocator_module.object {
|
||||
remove(sess, obj);
|
||||
|
@ -97,73 +151,6 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
|
|||
}
|
||||
}
|
||||
|
||||
fn link_binary_output<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
|
||||
codegen_results: &CodegenResults,
|
||||
crate_type: config::CrateType,
|
||||
outputs: &OutputFilenames,
|
||||
crate_name: &str,
|
||||
target_cpu: &str) {
|
||||
for obj in codegen_results.modules.iter().filter_map(|m| m.object.as_ref()) {
|
||||
check_file_is_writeable(obj, sess);
|
||||
}
|
||||
|
||||
if outputs.outputs.contains_key(&OutputType::Metadata) {
|
||||
let out_filename = filename_for_metadata(sess, crate_name, outputs);
|
||||
// To avoid races with another rustc process scanning the output directory,
|
||||
// we need to write the file somewhere else and atomically move it to its
|
||||
// final destination, with a `fs::rename` call. In order for the rename to
|
||||
// always succeed, the temporary file needs to be on the same filesystem,
|
||||
// which is why we create it inside the output directory specifically.
|
||||
let metadata_tmpdir = TempFileBuilder::new()
|
||||
.prefix("rmeta")
|
||||
.tempdir_in(out_filename.parent().unwrap())
|
||||
.unwrap_or_else(|err| sess.fatal(&format!("couldn't create a temp dir: {}", err)));
|
||||
let metadata = emit_metadata(sess, codegen_results, &metadata_tmpdir);
|
||||
match fs::rename(&metadata, &out_filename) {
|
||||
Ok(_) => {
|
||||
if sess.opts.debugging_opts.emit_directives {
|
||||
sess.parse_sess.span_diagnostic.maybe_emit_json_directive(
|
||||
format!("metadata file written: {}", out_filename.display()));
|
||||
}
|
||||
}
|
||||
Err(e) => sess.fatal(&format!("failed to write {}: {}", out_filename.display(), e)),
|
||||
}
|
||||
}
|
||||
|
||||
let tmpdir = TempFileBuilder::new().prefix("rustc").tempdir().unwrap_or_else(|err|
|
||||
sess.fatal(&format!("couldn't create a temp dir: {}", err)));
|
||||
|
||||
if outputs.outputs.should_codegen() {
|
||||
let out_filename = out_filename(sess, crate_type, outputs, crate_name);
|
||||
match crate_type {
|
||||
config::CrateType::Rlib => {
|
||||
link_rlib::<B>(sess,
|
||||
codegen_results,
|
||||
RlibFlavor::Normal,
|
||||
&out_filename,
|
||||
&tmpdir).build();
|
||||
}
|
||||
config::CrateType::Staticlib => {
|
||||
link_staticlib::<B>(sess, codegen_results, &out_filename, &tmpdir);
|
||||
}
|
||||
_ => {
|
||||
link_natively::<B>(
|
||||
sess,
|
||||
crate_type,
|
||||
&out_filename,
|
||||
codegen_results,
|
||||
tmpdir.path(),
|
||||
target_cpu,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if sess.opts.cg.save_temps {
|
||||
let _ = tmpdir.into_path();
|
||||
}
|
||||
}
|
||||
|
||||
// The third parameter is for env vars, used on windows to set up the
|
||||
// path for MSVC to find its DLLs, and gcc to find its bundled
|
||||
// toolchain
|
||||
|
|
Loading…
Reference in a new issue