@@ -110,33 +110,52 @@ fn main() {
110110 // directly to `ar` to assemble an archive. Otherwise we're actually
111111 // compiling the source assembly file.
112112 if asm. ends_with ( ".o" ) {
113- use ar_archive_writer:: { write_archive_to_stream, NewArchiveMember , ArchiveKind , DEFAULT_OBJECT_READER } ;
114- use std:: fs:: read;
113+ use ar_archive_writer:: { write_archive_to_stream, NewArchiveMember , ArchiveKind } ;
114+ use std:: fs:: { read, metadata } ;
115115 use std:: path:: PathBuf ;
116116 use std:: io:: Cursor ;
117117
118118 let out_dir = std:: env:: var ( "OUT_DIR" ) . expect ( "OUT_DIR environment variable not set" ) ;
119119 let output_path = PathBuf :: from ( & out_dir) . join ( "libpsm_s.a" ) ;
120120
121121 let object_data = read ( asm) . expect ( "Failed to read object file" ) ;
122+ let file_metadata = metadata ( asm) . expect ( "Failed to read file metadata" ) ;
123+
124+ // Extract file metadata
125+ let mtime = file_metadata. modified ( ) . ok ( )
126+ . and_then ( |time| time. duration_since ( std:: time:: UNIX_EPOCH ) . ok ( ) )
127+ . map ( |duration| duration. as_secs ( ) )
128+ . unwrap_or ( 0 ) ;
129+
130+ #[ cfg( unix) ]
131+ let ( uid, gid, perms) = {
132+ use std:: os:: unix:: fs:: MetadataExt ;
133+ ( file_metadata. uid ( ) , file_metadata. gid ( ) , file_metadata. mode ( ) )
134+ } ;
135+
136+ #[ cfg( not( unix) ) ]
137+ let ( uid, gid, perms) = ( 0 , 0 , 0o644 ) ;
122138
123139 let filename = asm. rsplit ( '/' ) . next ( ) . unwrap_or ( asm) ;
124- let member = NewArchiveMember :: new (
125- object_data,
126- & DEFAULT_OBJECT_READER ,
127- filename. to_string ( ) ,
128- ) ;
140+ let member = NewArchiveMember {
141+ buf : Box :: new ( object_data) ,
142+ get_symbols : |_data : & [ u8 ] , _callback : & mut dyn FnMut ( & [ u8 ] ) -> Result < ( ) , std:: io:: Error > | Ok ( true ) ,
143+ member_name : filename. to_string ( ) ,
144+ mtime,
145+ uid,
146+ gid,
147+ perms,
148+ } ;
129149
130150 let mut output_bytes = Cursor :: new ( Vec :: new ( ) ) ;
131151 write_archive_to_stream (
132152 & mut output_bytes,
133153 & [ member] ,
134- // Unfortunately, getDefaultKind() is not available in ar_archive_writer 0.4.2
154+ // Unfortunately, getDefaultKind() is not available in ar_archive_writer
135155 // however looking at the llvm-ar source it looks like for wasm32-any-any
136156 // it falls through to Gnu https://llvm.org/doxygen/Object_2Archive_8cpp_source.html
137157 ArchiveKind :: Gnu ,
138158 false ,
139- false ,
140159 ) . expect ( "Failed to write archive" ) ;
141160
142161 std:: fs:: write ( & output_path, output_bytes. into_inner ( ) ) . expect ( "Failed to write archive file" ) ;
0 commit comments