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:
Douglas Gregor 2012-09-27 14:50:15 +00:00
parent cb9cf0f907
commit 07c22b78e5
1 changed files with 30 additions and 1 deletions

View File

@ -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);