@@ -946,19 +946,51 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
946
946
}
947
947
948
948
// Process libs passed on the command line
949
+ // First, check for errors
950
+ let mut renames = FxHashSet ( ) ;
951
+ for & ( ref name, ref new_name, _) in & self . sess . opts . libs {
952
+ if let & Some ( ref new_name) = new_name {
953
+ if new_name. is_empty ( ) {
954
+ self . sess . err (
955
+ & format ! ( "an empty renaming target was specified for library `{}`" , name) ) ;
956
+ } else if !self . cstore . get_used_libraries ( ) . borrow ( ) . iter ( )
957
+ . any ( |lib| lib. name == name as & str ) {
958
+ self . sess . err ( & format ! ( "renaming of the library `{}` was specified, \
959
+ however this crate contains no #[link(...)] \
960
+ attributes referencing this library.", name) ) ;
961
+ } else if renames. contains ( name) {
962
+ self . sess . err ( & format ! ( "multiple renamings were specified for library `{}` ." ,
963
+ name) ) ;
964
+ } else {
965
+ renames. insert ( name) ;
966
+ }
967
+ }
968
+ }
969
+ // Update kind and, optionally, the name of all native libaries
970
+ // (there may be more than one) with the specified name.
949
971
for & ( ref name, ref new_name, kind) in & self . sess . opts . libs {
950
- // First, try to update existing lib(s) added via #[link(...)]
951
- let new_name = new_name. as_ref ( ) . map ( |s| & * * s) ; // &Option<String> -> Option<&str>
952
- if !self . cstore . update_used_library ( name, new_name, kind) {
972
+ let mut found = false ;
973
+ for lib in self . cstore . get_used_libraries ( ) . borrow_mut ( ) . iter_mut ( ) {
974
+ if lib. name == name as & str {
975
+ lib. kind = kind;
976
+ if let & Some ( ref new_name) = new_name {
977
+ lib. name = Symbol :: intern ( new_name) ;
978
+ }
979
+ found = true ;
980
+ break ;
981
+ }
982
+ }
983
+ if !found {
953
984
// Add if not found
985
+ let new_name = new_name. as_ref ( ) . map ( |s| & * * s) ; // &Option<String> -> Option<&str>
954
986
let lib = NativeLibrary {
955
- name : Symbol :: intern ( name) ,
987
+ name : Symbol :: intern ( new_name . unwrap_or ( name) ) ,
956
988
kind : kind,
957
989
cfg : None ,
958
990
foreign_items : Vec :: new ( ) ,
959
991
} ;
960
992
register_native_lib ( self . sess , self . cstore , None , lib) ;
961
- }
993
+ }
962
994
}
963
995
self . register_statically_included_foreign_items ( ) ;
964
996
self . register_dllimport_foreign_items ( ) ;
0 commit comments