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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user