Sync from rust f03ce30962
This commit is contained in:
commit
7368f5601e
2 changed files with 37 additions and 37 deletions
|
@ -5,7 +5,7 @@ use std::fs::File;
|
||||||
use std::io::{self, Read, Seek};
|
use std::io::{self, Read, Seek};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
use rustc_codegen_ssa::back::archive::ArchiveBuilder;
|
use rustc_codegen_ssa::back::archive::{ArchiveBuilder, ArchiveBuilderBuilder};
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
|
|
||||||
use object::read::archive::ArchiveFile;
|
use object::read::archive::ArchiveFile;
|
||||||
|
@ -17,9 +17,34 @@ enum ArchiveEntry {
|
||||||
File(PathBuf),
|
File(PathBuf),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) struct ArArchiveBuilderBuilder;
|
||||||
|
|
||||||
|
impl ArchiveBuilderBuilder for ArArchiveBuilderBuilder {
|
||||||
|
fn new_archive_builder<'a>(&self, sess: &'a Session) -> Box<dyn ArchiveBuilder<'a> + 'a> {
|
||||||
|
Box::new(ArArchiveBuilder {
|
||||||
|
sess,
|
||||||
|
use_gnu_style_archive: sess.target.archive_format == "gnu",
|
||||||
|
// FIXME fix builtin ranlib on macOS
|
||||||
|
no_builtin_ranlib: sess.target.is_like_osx,
|
||||||
|
|
||||||
|
src_archives: vec![],
|
||||||
|
entries: vec![],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_dll_import_lib(
|
||||||
|
&self,
|
||||||
|
_sess: &Session,
|
||||||
|
_lib_name: &str,
|
||||||
|
_dll_imports: &[rustc_session::cstore::DllImport],
|
||||||
|
_tmpdir: &Path,
|
||||||
|
) -> PathBuf {
|
||||||
|
bug!("creating dll imports is not supported");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) struct ArArchiveBuilder<'a> {
|
pub(crate) struct ArArchiveBuilder<'a> {
|
||||||
sess: &'a Session,
|
sess: &'a Session,
|
||||||
dst: PathBuf,
|
|
||||||
use_gnu_style_archive: bool,
|
use_gnu_style_archive: bool,
|
||||||
no_builtin_ranlib: bool,
|
no_builtin_ranlib: bool,
|
||||||
|
|
||||||
|
@ -30,19 +55,6 @@ pub(crate) struct ArArchiveBuilder<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
||||||
fn new(sess: &'a Session, output: &Path) -> Self {
|
|
||||||
ArArchiveBuilder {
|
|
||||||
sess,
|
|
||||||
dst: output.to_path_buf(),
|
|
||||||
use_gnu_style_archive: sess.target.archive_format == "gnu",
|
|
||||||
// FIXME fix builtin ranlib on macOS
|
|
||||||
no_builtin_ranlib: sess.target.is_like_osx,
|
|
||||||
|
|
||||||
src_archives: vec![],
|
|
||||||
entries: vec![],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_file(&mut self, file: &Path) {
|
fn add_file(&mut self, file: &Path) {
|
||||||
self.entries.push((
|
self.entries.push((
|
||||||
file.file_name().unwrap().to_str().unwrap().to_string().into_bytes(),
|
file.file_name().unwrap().to_str().unwrap().to_string().into_bytes(),
|
||||||
|
@ -50,10 +62,11 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_archive<F>(&mut self, archive_path: &Path, mut skip: F) -> std::io::Result<()>
|
fn add_archive(
|
||||||
where
|
&mut self,
|
||||||
F: FnMut(&str) -> bool + 'static,
|
archive_path: &Path,
|
||||||
{
|
mut skip: Box<dyn FnMut(&str) -> bool + 'static>,
|
||||||
|
) -> std::io::Result<()> {
|
||||||
let read_cache = ReadCache::new(std::fs::File::open(&archive_path)?);
|
let read_cache = ReadCache::new(std::fs::File::open(&archive_path)?);
|
||||||
let archive = ArchiveFile::parse(&read_cache).unwrap();
|
let archive = ArchiveFile::parse(&read_cache).unwrap();
|
||||||
let archive_index = self.src_archives.len();
|
let archive_index = self.src_archives.len();
|
||||||
|
@ -74,7 +87,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build(mut self) -> bool {
|
fn build(mut self: Box<Self>, output: &Path) -> bool {
|
||||||
enum BuilderKind {
|
enum BuilderKind {
|
||||||
Bsd(ar::Builder<File>),
|
Bsd(ar::Builder<File>),
|
||||||
Gnu(ar::GnuBuilder<File>),
|
Gnu(ar::GnuBuilder<File>),
|
||||||
|
@ -163,7 +176,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
||||||
let mut builder = if self.use_gnu_style_archive {
|
let mut builder = if self.use_gnu_style_archive {
|
||||||
BuilderKind::Gnu(
|
BuilderKind::Gnu(
|
||||||
ar::GnuBuilder::new(
|
ar::GnuBuilder::new(
|
||||||
File::create(&self.dst).unwrap_or_else(|err| {
|
File::create(output).unwrap_or_else(|err| {
|
||||||
sess.fatal(&format!(
|
sess.fatal(&format!(
|
||||||
"error opening destination during archive building: {}",
|
"error opening destination during archive building: {}",
|
||||||
err
|
err
|
||||||
|
@ -178,7 +191,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
||||||
} else {
|
} else {
|
||||||
BuilderKind::Bsd(
|
BuilderKind::Bsd(
|
||||||
ar::Builder::new(
|
ar::Builder::new(
|
||||||
File::create(&self.dst).unwrap_or_else(|err| {
|
File::create(output).unwrap_or_else(|err| {
|
||||||
sess.fatal(&format!(
|
sess.fatal(&format!(
|
||||||
"error opening destination during archive building: {}",
|
"error opening destination during archive building: {}",
|
||||||
err
|
err
|
||||||
|
@ -209,7 +222,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
||||||
|
|
||||||
// Run ranlib to be able to link the archive
|
// Run ranlib to be able to link the archive
|
||||||
let status = std::process::Command::new(ranlib)
|
let status = std::process::Command::new(ranlib)
|
||||||
.arg(self.dst)
|
.arg(output)
|
||||||
.status()
|
.status()
|
||||||
.expect("Couldn't run ranlib");
|
.expect("Couldn't run ranlib");
|
||||||
|
|
||||||
|
@ -220,17 +233,4 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
||||||
|
|
||||||
any_members
|
any_members
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sess(&self) -> &Session {
|
|
||||||
self.sess
|
|
||||||
}
|
|
||||||
|
|
||||||
fn create_dll_import_lib(
|
|
||||||
_sess: &Session,
|
|
||||||
_lib_name: &str,
|
|
||||||
_dll_imports: &[rustc_session::cstore::DllImport],
|
|
||||||
_tmpdir: &Path,
|
|
||||||
) -> PathBuf {
|
|
||||||
bug!("creating dll imports is not supported");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -226,7 +226,7 @@ impl CodegenBackend for CraneliftCodegenBackend {
|
||||||
) -> Result<(), ErrorGuaranteed> {
|
) -> Result<(), ErrorGuaranteed> {
|
||||||
use rustc_codegen_ssa::back::link::link_binary;
|
use rustc_codegen_ssa::back::link::link_binary;
|
||||||
|
|
||||||
link_binary::<crate::archive::ArArchiveBuilder<'_>>(sess, &codegen_results, outputs)
|
link_binary(sess, &crate::archive::ArArchiveBuilderBuilder, &codegen_results, outputs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue