From a722f70207cf8419150c52cbf79ef5b9eadb1639 Mon Sep 17 00:00:00 2001 From: Valerii Hiora Date: Fri, 7 Nov 2014 19:12:43 +0200 Subject: [PATCH] Properly static lib packaging Fixes #18574 --- src/librustc/back/link.rs | 2 +- src/librustc_back/archive.rs | 27 +++++++++++++++++---------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index 58266f2ea3224..30c76a7bf5f4c 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -734,7 +734,7 @@ fn link_staticlib(sess: &Session, obj_filename: &Path, out_filename: &Path) { let mut all_native_libs = vec![]; for &(cnum, ref path) in crates.iter() { - let name = sess.cstore.get_crate_data(cnum).name.clone(); + let ref name = sess.cstore.get_crate_data(cnum).name; let p = match *path { Some(ref p) => p.clone(), None => { sess.err(format!("could not find rlib for: `{}`", diff --git a/src/librustc_back/archive.rs b/src/librustc_back/archive.rs index db2f291e5e7de..03b439b32c013 100644 --- a/src/librustc_back/archive.rs +++ b/src/librustc_back/archive.rs @@ -183,7 +183,7 @@ impl<'a> ArchiveBuilder<'a> { self.archive.slib_suffix.as_slice(), self.archive.lib_search_paths.as_slice(), self.archive.handler); - self.add_archive(&location, name, []) + self.add_archive(&location, name, |_| false) } /// Adds all of the contents of the rlib at the specified path to this @@ -193,13 +193,20 @@ impl<'a> ArchiveBuilder<'a> { /// then the object file also isn't added. pub fn add_rlib(&mut self, rlib: &Path, name: &str, lto: bool) -> io::IoResult<()> { - let object = format!("{}.o", name); - let bytecode = format!("{}.bytecode.deflate", name); - let mut ignore = vec!(bytecode.as_slice(), METADATA_FILENAME); - if lto { - ignore.push(object.as_slice()); - } - self.add_archive(rlib, name, ignore.as_slice()) + // Ignoring obj file starting with the crate name + // as simple comparison is not enough - there + // might be also an extra name suffix + let obj_start = format!("{}", name); + let obj_start = obj_start.as_slice(); + // Ignoring all bytecode files, no matter of + // name + let bc_ext = ".bytecode.deflate"; + + self.add_archive(rlib, name.as_slice(), |fname: &str| { + let skip_obj = lto && fname.starts_with(obj_start) + && fname.ends_with(".o"); + skip_obj || fname.ends_with(bc_ext) || fname == METADATA_FILENAME + }) } /// Adds an arbitrary file to this archive @@ -273,7 +280,7 @@ impl<'a> ArchiveBuilder<'a> { } fn add_archive(&mut self, archive: &Path, name: &str, - skip: &[&str]) -> io::IoResult<()> { + skip: |&str| -> bool) -> io::IoResult<()> { let loc = TempDir::new("rsar").unwrap(); // First, extract the contents of the archive to a temporary directory. @@ -295,7 +302,7 @@ impl<'a> ArchiveBuilder<'a> { let files = try!(fs::readdir(loc.path())); for file in files.iter() { let filename = file.filename_str().unwrap(); - if skip.iter().any(|s| *s == filename) { continue } + if skip(filename) { continue } if filename.contains(".SYMDEF") { continue } let filename = format!("r-{}-{}", name, filename);