@@ -20,7 +20,7 @@ use std::fs::File;
2020use std:: io:: { self , Read , Seek } ;
2121use std:: path:: { Path , PathBuf } ;
2222
23- use rustc_codegen_ssa:: back:: archive:: ArchiveBuilder ;
23+ use rustc_codegen_ssa:: back:: archive:: { ArchiveBuilder , ArchiveBuilderBuilder } ;
2424use rustc_session:: Session ;
2525
2626use object:: read:: archive:: ArchiveFile ;
@@ -34,7 +34,6 @@ enum ArchiveEntry {
3434
3535pub ( crate ) struct ArArchiveBuilder < ' a > {
3636 sess : & ' a Session ,
37- dst : PathBuf ,
3837 use_gnu_style_archive : bool ,
3938
4039 src_archives : Vec < File > ,
@@ -44,27 +43,18 @@ pub(crate) struct ArArchiveBuilder<'a> {
4443}
4544
4645impl < ' a > ArchiveBuilder < ' a > for ArArchiveBuilder < ' a > {
47- fn new ( sess : & ' a Session , output : & Path ) -> Self {
48- ArArchiveBuilder {
49- sess,
50- dst : output. to_path_buf ( ) ,
51- use_gnu_style_archive : sess. target . archive_format == "gnu" ,
52- src_archives : vec ! [ ] ,
53- entries : vec ! [ ] ,
54- }
55- }
56-
5746 fn add_file ( & mut self , file : & Path ) {
5847 self . entries . push ( (
5948 file. file_name ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) . to_string ( ) . into_bytes ( ) ,
6049 ArchiveEntry :: File ( file. to_owned ( ) ) ,
6150 ) ) ;
6251 }
6352
64- fn add_archive < F > ( & mut self , archive_path : & Path , mut skip : F ) -> std:: io:: Result < ( ) >
65- where
66- F : FnMut ( & str ) -> bool + ' static ,
67- {
53+ fn add_archive (
54+ & mut self ,
55+ archive_path : & Path ,
56+ mut skip : Box < dyn FnMut ( & str ) -> bool + ' static > ,
57+ ) -> std:: io:: Result < ( ) > {
6858 let read_cache = ReadCache :: new ( std:: fs:: File :: open ( & archive_path) ?) ;
6959 let archive = ArchiveFile :: parse ( & read_cache) . unwrap ( ) ;
7060 let archive_index = self . src_archives . len ( ) ;
@@ -85,7 +75,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
8575 Ok ( ( ) )
8676 }
8777
88- fn build ( mut self ) -> bool {
78+ fn build ( mut self : Box < Self > , output : & Path ) -> bool {
8979 enum BuilderKind {
9080 Bsd ( ar:: Builder < File > ) ,
9181 Gnu ( ar:: GnuBuilder < File > ) ,
@@ -122,7 +112,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
122112
123113 let mut builder = if self . use_gnu_style_archive {
124114 BuilderKind :: Gnu ( ar:: GnuBuilder :: new (
125- File :: create ( & self . dst ) . unwrap_or_else ( |err| {
115+ File :: create ( & output ) . unwrap_or_else ( |err| {
126116 sess. fatal ( & format ! (
127117 "error opening destination during archive building: {}" ,
128118 err
@@ -131,7 +121,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
131121 entries. iter ( ) . map ( |( name, _) | name. clone ( ) ) . collect ( ) ,
132122 ) )
133123 } else {
134- BuilderKind :: Bsd ( ar:: Builder :: new ( File :: create ( & self . dst ) . unwrap_or_else ( |err| {
124+ BuilderKind :: Bsd ( ar:: Builder :: new ( File :: create ( & output ) . unwrap_or_else ( |err| {
135125 sess. fatal ( & format ! ( "error opening destination during archive building: {}" , err) ) ;
136126 } ) ) )
137127 } ;
@@ -150,13 +140,27 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
150140 std:: mem:: drop ( builder) ;
151141 any_members
152142 }
143+ }
153144
154- fn inject_dll_import_lib (
155- & mut self ,
145+ pub ( crate ) struct ArArchiveBuilderBuilder ;
146+
147+ impl ArchiveBuilderBuilder for ArArchiveBuilderBuilder {
148+ fn new_archive_builder < ' a > ( & self , sess : & ' a Session ) -> Box < dyn ArchiveBuilder < ' a > + ' a > {
149+ Box :: new ( ArArchiveBuilder {
150+ sess,
151+ use_gnu_style_archive : sess. target . archive_format == "gnu" ,
152+ src_archives : vec ! [ ] ,
153+ entries : vec ! [ ] ,
154+ } )
155+ }
156+
157+ fn create_dll_import_lib (
158+ & self ,
159+ _sess : & Session ,
156160 _lib_name : & str ,
157161 _dll_imports : & [ rustc_session:: cstore:: DllImport ] ,
158- _tmpdir : & rustc_data_structures :: temp_dir :: MaybeTempDir ,
159- ) {
162+ _tmpdir : & Path ,
163+ ) -> PathBuf {
160164 unimplemented ! ( "injecting dll imports is not supported" ) ;
161165 }
162166}
0 commit comments