@@ -9,6 +9,7 @@ use rustc::hir::lowering::lower_crate;
9
9
use rustc:: hir:: def_id:: { CrateNum , LOCAL_CRATE } ;
10
10
use rustc:: lint;
11
11
use rustc:: middle:: { self , reachable, resolve_lifetime, stability} ;
12
+ use rustc:: middle:: cstore:: CrateStore ;
12
13
use rustc:: middle:: privacy:: AccessLevels ;
13
14
use rustc:: ty:: { self , AllArenas , Resolutions , TyCtxt , GlobalCtxt } ;
14
15
use rustc:: ty:: steal:: Steal ;
@@ -657,7 +658,8 @@ fn escape_dep_filename(filename: &FileName) -> String {
657
658
filename. to_string ( ) . replace ( " " , "\\ " )
658
659
}
659
660
660
- fn write_out_deps ( sess : & Session , outputs : & OutputFilenames , out_filenames : & [ PathBuf ] ) {
661
+ fn write_out_deps ( compiler : & Compiler , outputs : & OutputFilenames , out_filenames : & [ PathBuf ] ) {
662
+ let sess = & compiler. sess ;
661
663
// Write out dependency rules to the dep-info file if requested
662
664
if !sess. opts . output_types . contains_key ( & OutputType :: DepInfo ) {
663
665
return ;
@@ -667,13 +669,30 @@ fn write_out_deps(sess: &Session, outputs: &OutputFilenames, out_filenames: &[Pa
667
669
let result = ( || -> io:: Result < ( ) > {
668
670
// Build a list of files used to compile the output and
669
671
// write Makefile-compatible dependency rules
670
- let files: Vec < String > = sess. source_map ( )
672
+ let mut files: Vec < String > = sess. source_map ( )
671
673
. files ( )
672
674
. iter ( )
673
675
. filter ( |fmap| fmap. is_real_file ( ) )
674
676
. filter ( |fmap| !fmap. is_imported ( ) )
675
677
. map ( |fmap| escape_dep_filename ( & fmap. name ) )
676
678
. collect ( ) ;
679
+
680
+ if sess. binary_dep_depinfo ( ) {
681
+ for cnum in compiler. cstore . crates_untracked ( ) {
682
+ let metadata = compiler. cstore . crate_data_as_rc_any ( cnum) ;
683
+ let metadata = metadata. downcast_ref :: < cstore:: CrateMetadata > ( ) . unwrap ( ) ;
684
+ if let Some ( ( path, _) ) = & metadata. source . dylib {
685
+ files. push ( escape_dep_filename ( & FileName :: Real ( path. clone ( ) ) ) ) ;
686
+ }
687
+ if let Some ( ( path, _) ) = & metadata. source . rlib {
688
+ files. push ( escape_dep_filename ( & FileName :: Real ( path. clone ( ) ) ) ) ;
689
+ }
690
+ if let Some ( ( path, _) ) = & metadata. source . rmeta {
691
+ files. push ( escape_dep_filename ( & FileName :: Real ( path. clone ( ) ) ) ) ;
692
+ }
693
+ }
694
+ }
695
+
677
696
let mut file = fs:: File :: create ( & deps_filename) ?;
678
697
for path in out_filenames {
679
698
writeln ! ( file, "{}: {}\n " , path. display( ) , files. join( " " ) ) ?;
@@ -750,7 +769,7 @@ pub fn prepare_outputs(
750
769
}
751
770
}
752
771
753
- write_out_deps ( sess , & outputs, & output_paths) ;
772
+ write_out_deps ( compiler , & outputs, & output_paths) ;
754
773
755
774
let only_dep_info = sess. opts . output_types . contains_key ( & OutputType :: DepInfo )
756
775
&& sess. opts . output_types . len ( ) == 1 ;
0 commit comments