forked from OSchip/llvm-project
Following up on r164620, cope with symlinking from an embedded
framework location out to a top-level framework. Such frameworks are not really embedded at all. llvm-svn: 164774
This commit is contained in:
parent
cb9cf0f907
commit
07c22b78e5
|
@ -26,6 +26,7 @@
|
|||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include <stdlib.h>
|
||||
using namespace clang;
|
||||
|
||||
Module::ExportDecl
|
||||
|
@ -343,9 +344,37 @@ ModuleMap::inferFrameworkModule(StringRef ModuleName,
|
|||
Dir != DirEnd && !EC; Dir.increment(EC)) {
|
||||
if (!StringRef(Dir->path()).endswith(".framework"))
|
||||
continue;
|
||||
|
||||
|
||||
if (const DirectoryEntry *SubframeworkDir
|
||||
= FileMgr.getDirectory(Dir->path())) {
|
||||
// Note: as an egregious but useful hack, we use the real path here and
|
||||
// check whether it is actually a subdirectory of the parent directory.
|
||||
// This will not be the case if the 'subframework' is actually a symlink
|
||||
// out to a top-level framework.
|
||||
#ifdef LLVM_ON_UNIX
|
||||
char RealSubframeworkDirName[PATH_MAX];
|
||||
if (realpath(Dir->path().c_str(), RealSubframeworkDirName)) {
|
||||
StringRef SubframeworkDirName = RealSubframeworkDirName;
|
||||
|
||||
bool FoundParent = false;
|
||||
do {
|
||||
// Get the parent directory name.
|
||||
SubframeworkDirName
|
||||
= llvm::sys::path::parent_path(SubframeworkDirName);
|
||||
if (SubframeworkDirName.empty())
|
||||
break;
|
||||
|
||||
if (FileMgr.getDirectory(SubframeworkDirName) == FrameworkDir) {
|
||||
FoundParent = true;
|
||||
break;
|
||||
}
|
||||
} while (true);
|
||||
|
||||
if (!FoundParent)
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
|
||||
// FIXME: Do we want to warn about subframeworks without umbrella headers?
|
||||
inferFrameworkModule(llvm::sys::path::stem(Dir->path()), SubframeworkDir,
|
||||
IsSystem, Result);
|
||||
|
|
Loading…
Reference in New Issue