@@ -8,12 +8,14 @@ use rustc_codegen_ssa::{METADATA_FILENAME, RLIB_BYTECODE_EXTENSION};
8
8
use rustc_codegen_ssa:: back:: archive:: { ArchiveBuilder , find_library} ;
9
9
10
10
struct ArchiveConfig < ' a > {
11
- pub sess : & ' a Session ,
12
- pub dst : PathBuf ,
13
- pub src : Option < PathBuf > ,
14
- pub lib_search_paths : Vec < PathBuf > ,
11
+ sess : & ' a Session ,
12
+ dst : PathBuf ,
13
+ src : Option < PathBuf > ,
14
+ lib_search_paths : Vec < PathBuf > ,
15
+ is_like_osx : bool ,
15
16
}
16
17
18
+ #[ derive( Debug ) ]
17
19
enum ArchiveEntry {
18
20
FromArchive { archive_index : usize , entry_index : usize } ,
19
21
File ( File ) ,
@@ -34,6 +36,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
34
36
dst : output. to_path_buf ( ) ,
35
37
src : input. map ( |p| p. to_path_buf ( ) ) ,
36
38
lib_search_paths : archive_search_paths ( sess) ,
39
+ is_like_osx : sess. target . target . options . is_like_osx ,
37
40
} ;
38
41
39
42
let ( src_archives, entries) = if let Some ( src) = & config. src {
@@ -119,7 +122,23 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
119
122
}
120
123
121
124
fn build ( mut self ) {
122
- let mut builder = ar:: Builder :: new ( File :: create ( & self . config . dst ) . unwrap ( ) ) ;
125
+ println ! ( "{:?}" , self . src_archives. len( ) ) ;
126
+ println ! ( "{:?}" , self . entries) ;
127
+
128
+ enum BuilderKind {
129
+ Bsd ( ar:: Builder < File > ) ,
130
+ Gnu ( ar:: GnuBuilder < File > ) ,
131
+ }
132
+
133
+ let archive_file = File :: create ( & self . config . dst ) . unwrap ( ) ;
134
+ let mut builder = if self . config . is_like_osx {
135
+ BuilderKind :: Bsd ( ar:: Builder :: new ( archive_file) )
136
+ } else {
137
+ BuilderKind :: Gnu ( ar:: GnuBuilder :: new (
138
+ archive_file,
139
+ self . entries . keys ( ) . map ( |key| key. as_bytes ( ) . to_vec ( ) ) . collect ( ) ,
140
+ ) )
141
+ } ;
123
142
124
143
// Add all files
125
144
for ( entry_name, entry) in self . entries . into_iter ( ) {
@@ -133,10 +152,16 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
133
152
header. set_uid ( orig_header. uid ( ) ) ;
134
153
header. set_gid ( orig_header. gid ( ) ) ;
135
154
header. set_mode ( orig_header. mode ( ) ) ;
136
- builder. append ( & header, entry) . unwrap ( ) ;
155
+ match builder {
156
+ BuilderKind :: Bsd ( ref mut builder) => builder. append ( & header, entry) . unwrap ( ) ,
157
+ BuilderKind :: Gnu ( ref mut builder) => builder. append ( & header, entry) . unwrap ( ) ,
158
+ }
137
159
}
138
160
ArchiveEntry :: File ( mut file) => {
139
- builder. append_file ( entry_name. as_bytes ( ) , & mut file) . unwrap ( ) ;
161
+ match builder {
162
+ BuilderKind :: Bsd ( ref mut builder) => builder. append_file ( entry_name. as_bytes ( ) , & mut file) . unwrap ( ) ,
163
+ BuilderKind :: Gnu ( ref mut builder) => builder. append_file ( entry_name. as_bytes ( ) , & mut file) . unwrap ( ) ,
164
+ }
140
165
}
141
166
}
142
167
}
0 commit comments