Skip to content

Commit f1c06a8

Browse files
committed
Disable builtin ranlib on macOS
1 parent 80b6f47 commit f1c06a8

File tree

1 file changed

+36
-14
lines changed

1 file changed

+36
-14
lines changed

src/archive.rs

+36-14
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ struct ArchiveConfig<'a> {
1313
dst: PathBuf,
1414
lib_search_paths: Vec<PathBuf>,
1515
use_gnu_style_archive: bool,
16+
no_builtin_ranlib: bool,
1617
}
1718

1819
#[derive(Debug)]
@@ -41,6 +42,8 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
4142
dst: output.to_path_buf(),
4243
lib_search_paths: archive_search_paths(sess),
4344
use_gnu_style_archive: sess.target.target.options.archive_format == "gnu",
45+
// FIXME fix builtin ranlib on macOS
46+
no_builtin_ranlib: sess.target.target.options.is_like_osx,
4447
};
4548

4649
let (src_archives, entries) = if let Some(input) = input {
@@ -173,22 +176,24 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
173176
}
174177
};
175178

176-
match object::File::parse(&data) {
177-
Ok(object) => {
178-
symbol_table.insert(entry_name.as_bytes().to_vec(), object.symbols().filter_map(|(_index, symbol)| {
179-
if symbol.is_undefined() || symbol.is_local() || symbol.kind() != SymbolKind::Data && symbol.kind() != SymbolKind::Text && symbol.kind() != SymbolKind::Tls {
180-
None
179+
if !self.config.no_builtin_ranlib {
180+
match object::File::parse(&data) {
181+
Ok(object) => {
182+
symbol_table.insert(entry_name.as_bytes().to_vec(), object.symbols().filter_map(|(_index, symbol)| {
183+
if symbol.is_undefined() || symbol.is_local() || symbol.kind() != SymbolKind::Data && symbol.kind() != SymbolKind::Text && symbol.kind() != SymbolKind::Tls {
184+
None
185+
} else {
186+
symbol.name().map(|name| name.as_bytes().to_vec())
187+
}
188+
}).collect::<Vec<_>>());
189+
}
190+
Err(err) => {
191+
let err = err.to_string();
192+
if err == "Unknown file magic" {
193+
// Not an object file; skip it.
181194
} else {
182-
symbol.name().map(|name| name.as_bytes().to_vec())
195+
self.config.sess.fatal(&format!("Error parsing `{}` during archive creation: {}", entry_name, err));
183196
}
184-
}).collect::<Vec<_>>());
185-
}
186-
Err(err) => {
187-
let err = err.to_string();
188-
if err == "Unknown file magic" {
189-
// Not an object file; skip it.
190-
} else {
191-
self.config.sess.fatal(&format!("Error parsing `{}` during archive creation: {}", entry_name, err));
192197
}
193198
}
194199
}
@@ -225,6 +230,23 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
225230
.unwrap(),
226231
}
227232
}
233+
234+
// Finalize archive
235+
std::mem::drop(builder);
236+
237+
if self.config.no_builtin_ranlib {
238+
let ranlib = crate::toolchain::get_toolchain_binary(self.config.sess, "ranlib");
239+
240+
// Run ranlib to be able to link the archive
241+
let status = std::process::Command::new(ranlib)
242+
.arg(self.config.dst)
243+
.status()
244+
.expect("Couldn't run ranlib");
245+
246+
if !status.success() {
247+
self.config.sess.fatal(&format!("Ranlib exited with code {:?}", status.code()));
248+
}
249+
}
228250
}
229251
}
230252

0 commit comments

Comments
 (0)