about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMark Rousskov <mark.simulacrum@gmail.com>2019-06-10 10:18:53 -0600
committerMark Rousskov <mark.simulacrum@gmail.com>2019-07-24 10:49:22 -0400
commiteafb42dc94b191fdd9f38b548f624184101182a2 (patch)
treef07a8050b0731af2de98f268dfe29908d1ca2232
parent27a6a304e2baaabca88059753f020377f2476978 (diff)
downloadrust-eafb42dc94b191fdd9f38b548f624184101182a2.tar.gz
rust-eafb42dc94b191fdd9f38b548f624184101182a2.zip
Add binary dependencies to dep-info files
-rw-r--r--src/librustc_interface/passes.rs23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs
index 6bf56bf8515..469215563ac 100644
--- a/src/librustc_interface/passes.rs
+++ b/src/librustc_interface/passes.rs
@@ -9,6 +9,7 @@ use rustc::hir::lowering::lower_crate;
 use rustc::hir::def_id::{CrateNum, LOCAL_CRATE};
 use rustc::lint;
 use rustc::middle::{self, reachable, resolve_lifetime, stability};
+use rustc::middle::cstore::CrateStore;
 use rustc::middle::privacy::AccessLevels;
 use rustc::ty::{self, AllArenas, Resolutions, TyCtxt, GlobalCtxt};
 use rustc::ty::steal::Steal;
@@ -657,7 +658,8 @@ fn escape_dep_filename(filename: &FileName) -> String {
     filename.to_string().replace(" ", "\\ ")
 }
 
-fn write_out_deps(sess: &Session, outputs: &OutputFilenames, out_filenames: &[PathBuf]) {
+fn write_out_deps(compiler: &Compiler, outputs: &OutputFilenames, out_filenames: &[PathBuf]) {
+    let sess = &compiler.sess;
     // Write out dependency rules to the dep-info file if requested
     if !sess.opts.output_types.contains_key(&OutputType::DepInfo) {
         return;
@@ -667,13 +669,28 @@ fn write_out_deps(sess: &Session, outputs: &OutputFilenames, out_filenames: &[Pa
     let result = (|| -> io::Result<()> {
         // Build a list of files used to compile the output and
         // write Makefile-compatible dependency rules
-        let files: Vec<String> = sess.source_map()
+        let mut files: Vec<String> = sess.source_map()
             .files()
             .iter()
             .filter(|fmap| fmap.is_real_file())
             .filter(|fmap| !fmap.is_imported())
             .map(|fmap| escape_dep_filename(&fmap.name))
             .collect();
+
+        for cnum in compiler.cstore.crates_untracked() {
+            let metadata = compiler.cstore.crate_data_as_rc_any(cnum);
+            let metadata = metadata.downcast_ref::<cstore::CrateMetadata>().unwrap();
+            if let Some((path, _)) = &metadata.source.dylib {
+                files.push(escape_dep_filename(&FileName::Real(path.clone())));
+            }
+            if let Some((path, _)) = &metadata.source.rlib {
+                files.push(escape_dep_filename(&FileName::Real(path.clone())));
+            }
+            if let Some((path, _)) = &metadata.source.rmeta {
+                files.push(escape_dep_filename(&FileName::Real(path.clone())));
+            }
+        }
+
         let mut file = fs::File::create(&deps_filename)?;
         for path in out_filenames {
             writeln!(file, "{}: {}\n", path.display(), files.join(" "))?;
@@ -750,7 +767,7 @@ pub fn prepare_outputs(
         }
     }
 
-    write_out_deps(sess, &outputs, &output_paths);
+    write_out_deps(compiler, &outputs, &output_paths);
 
     let only_dep_info = sess.opts.output_types.contains_key(&OutputType::DepInfo)
         && sess.opts.output_types.len() == 1;