Infer "link" lines for top-level frameworks. Essentially, a framework

will have a shared library with the same name as its framework (and no
suffix!) within its .framework directory. Detect this both when
inferring the whole top-level framework and when parsing a module map.

llvm-svn: 172439
This commit is contained in:
Douglas Gregor
2013-01-14 17:57:51 +00:00
parent 924c478827
commit 11dfe6fe3d
5 changed files with 50 additions and 2 deletions

View File

@@ -383,6 +383,23 @@ bool ModuleMap::canInferFrameworkModule(const DirectoryEntry *ParentDir,
return canInfer;
}
/// \brief For a framework module, infer the framework against which we
/// should link.
static void inferFrameworkLink(Module *Mod, const DirectoryEntry *FrameworkDir,
FileManager &FileMgr) {
assert(Mod->IsFramework && "Can only infer linking for framework modules");
assert(!Mod->isSubFramework() &&
"Can only infer linking for top-level frameworks");
SmallString<128> LibName;
LibName += FrameworkDir->getName();
llvm::sys::path::append(LibName, Mod->Name);
if (FileMgr.getFile(LibName)) {
Mod->LinkLibraries.push_back(Module::LinkLibrary(Mod->Name,
/*IsFramework=*/true));
}
}
Module *
ModuleMap::inferFrameworkModule(StringRef ModuleName,
const DirectoryEntry *FrameworkDir,
@@ -537,6 +554,12 @@ ModuleMap::inferFrameworkModule(StringRef ModuleName,
}
}
// If the module is a top-level framework, automatically link against the
// framework.
if (!Result->isSubFramework()) {
inferFrameworkLink(Result, FrameworkDir, FileMgr);
}
return Result;
}
@@ -1147,6 +1170,13 @@ void ModuleMapParser::parseModuleDecl() {
HadError = true;
}
// If the active module is a top-level framework, and there are no link
// libraries, automatically link against the framework.
if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() &&
ActiveModule->LinkLibraries.empty()) {
inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager());
}
// We're done parsing this module. Pop back to the previous module.
ActiveModule = PreviousActiveModule;
}