Skip to content

Commit 103f2fa

Browse files
committed
[WIP] Try using GnuBuilder
1 parent 472b591 commit 103f2fa

File tree

3 files changed

+38
-10
lines changed

3 files changed

+38
-10
lines changed

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,8 @@ indexmap = "1.0.2"
3838
#[patch."https://github.com/gimli-rs/gimli.git"]
3939
#gimli = { path = "../" }
4040

41+
[patch.crates-io]
42+
ar = { git = "https://github.com/mdsteele/rust-ar.git" }
43+
4144
[profile.dev.overrides."*"]
4245
opt-level = 3

src/archive.rs

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ use rustc_codegen_ssa::{METADATA_FILENAME, RLIB_BYTECODE_EXTENSION};
88
use rustc_codegen_ssa::back::archive::{ArchiveBuilder, find_library};
99

1010
struct ArchiveConfig<'a> {
11-
pub sess: &'a Session,
12-
pub dst: PathBuf,
13-
pub src: Option<PathBuf>,
14-
pub lib_search_paths: Vec<PathBuf>,
11+
sess: &'a Session,
12+
dst: PathBuf,
13+
src: Option<PathBuf>,
14+
lib_search_paths: Vec<PathBuf>,
15+
is_like_osx: bool,
1516
}
1617

18+
#[derive(Debug)]
1719
enum ArchiveEntry {
1820
FromArchive { archive_index: usize, entry_index: usize },
1921
File(File),
@@ -34,6 +36,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
3436
dst: output.to_path_buf(),
3537
src: input.map(|p| p.to_path_buf()),
3638
lib_search_paths: archive_search_paths(sess),
39+
is_like_osx: sess.target.target.options.is_like_osx,
3740
};
3841

3942
let (src_archives, entries) = if let Some(src) = &config.src {
@@ -119,7 +122,23 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
119122
}
120123

121124
fn build(mut self) {
122-
let mut builder = ar::Builder::new(File::create(&self.config.dst).unwrap());
125+
println!("{:?}", self.src_archives.len());
126+
println!("{:?}", self.entries);
127+
128+
enum BuilderKind {
129+
Bsd(ar::Builder<File>),
130+
Gnu(ar::GnuBuilder<File>),
131+
}
132+
133+
let archive_file = File::create(&self.config.dst).unwrap();
134+
let mut builder = if self.config.is_like_osx {
135+
BuilderKind::Bsd(ar::Builder::new(archive_file))
136+
} else {
137+
BuilderKind::Gnu(ar::GnuBuilder::new(
138+
archive_file,
139+
self.entries.keys().map(|key| key.as_bytes().to_vec()).collect(),
140+
))
141+
};
123142

124143
// Add all files
125144
for (entry_name, entry) in self.entries.into_iter() {
@@ -133,10 +152,16 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
133152
header.set_uid(orig_header.uid());
134153
header.set_gid(orig_header.gid());
135154
header.set_mode(orig_header.mode());
136-
builder.append(&header, entry).unwrap();
155+
match builder {
156+
BuilderKind::Bsd(ref mut builder) => builder.append(&header, entry).unwrap(),
157+
BuilderKind::Gnu(ref mut builder) => builder.append(&header, entry).unwrap(),
158+
}
137159
}
138160
ArchiveEntry::File(mut file) => {
139-
builder.append_file(entry_name.as_bytes(), &mut file).unwrap();
161+
match builder {
162+
BuilderKind::Bsd(ref mut builder) => builder.append_file(entry_name.as_bytes(), &mut file).unwrap(),
163+
BuilderKind::Gnu(ref mut builder) => builder.append_file(entry_name.as_bytes(), &mut file).unwrap(),
164+
}
140165
}
141166
}
142167
}

0 commit comments

Comments
 (0)