librustc_metadata::locator: Properly detect file type.
Make sure to test for file types against the non-canonicalized name to avoid detecting the wrong type. Some systems save build artifacts into associative file stores that do not preserve extensions, and then link to those using conventionally-named symbolic links that are the arguments to `rustc` et al. If we canonicalize before testing the type, we resolve the symlink, the extension is lost and we might treat rlibs and rmetas as dylibs. The fix is to introduce a temporary to hold the canonicalized name, compare against the non-canonical name, and add a comment explaining what's going on for the would-be maintainer who sees a potential cleanup. Signed-off-by: Dan Cross <dcross@google.com>
This commit is contained in:
parent
e8df0b8932
commit
6ad6d8c25c
@ -685,13 +685,19 @@ impl<'a> CrateLocator<'a> {
|
||||
&& file.ends_with(&self.target.options.dll_suffix)
|
||||
{
|
||||
// Make sure there's at most one rlib and at most one dylib.
|
||||
let loc = fs::canonicalize(&loc).unwrap_or_else(|_| loc.clone());
|
||||
// Note to take care and match against the non-canonicalized name:
|
||||
// some systems save build artifacts into content-addressed stores
|
||||
// that do not preserve extensions, and then link to them using
|
||||
// e.g. symbolic links. If we canonicalize too early, we resolve
|
||||
// the symlink, the file type is lost and we might treat rlibs and
|
||||
// rmetas as dylibs.
|
||||
let loc_canon = fs::canonicalize(&loc).unwrap_or_else(|_| loc.clone());
|
||||
if loc.file_name().unwrap().to_str().unwrap().ends_with(".rlib") {
|
||||
rlibs.insert(loc, PathKind::ExternFlag);
|
||||
rlibs.insert(loc_canon, PathKind::ExternFlag);
|
||||
} else if loc.file_name().unwrap().to_str().unwrap().ends_with(".rmeta") {
|
||||
rmetas.insert(loc, PathKind::ExternFlag);
|
||||
rmetas.insert(loc_canon, PathKind::ExternFlag);
|
||||
} else {
|
||||
dylibs.insert(loc, PathKind::ExternFlag);
|
||||
dylibs.insert(loc_canon, PathKind::ExternFlag);
|
||||
}
|
||||
} else {
|
||||
self.rejected_via_filename
|
||||
|
Loading…
x
Reference in New Issue
Block a user