def _GenerateProtocolSubPage(self, pObj, obj, configFile): guidPage = doxygen.Page(obj.GetName(), 'protocol_page_%s' % obj.GetName()) comments = obj.GetComment() if len(comments) != 0: guidPage.AddDescription('<br>'.join(obj.GetComment()) + '<br>') section = doxygen.Section('BasicProtocolInfo', 'PROTOCOL Information') desc = '<TABLE>' desc += '<TR>' desc += '<TD><CAPTION>PROTOCOL\'s Guid Name</CAPTION></TD><TD><CAPTION>PROTOCOL\'s Guid</CAPTION></TD>' desc += '</TR>' desc += '<TR>' desc += '<TD>%s</TD>' % obj.GetName() desc += '<TD>%s</TD>' % obj.GetGuid() desc += '</TR>' desc += '</TABLE>' section.AddDescription(desc) guidPage.AddSection(section) refFile = self.FindHeaderFileForGuid(pObj, obj.GetName(), configFile) if refFile: relPath = refFile[len(pObj.GetWorkspace()) + 1:] if len(comments) == 0: guidPage.AddDescription(' \\copydoc %s <br>' % relPath) section = doxygen.Section('ref', 'Refer to Header File') section.AddDescription('\link %s\n' % relPath) section.AddDescription('\endlink\n') self.ProcessSourceFileForInclude(refFile, pObj, configFile) guidPage.AddSection(section) return guidPage
def GenerateIndexPage(self): """Generate doxygen index page. Inherited class should implement it.""" fObj = self._pObj.GetFileObj() pdObj = doxygen.DoxygenFile( '%s Package Document' % self._pObj.GetName(), '%s.decdoxygen' % self._pObj.GetFilename()) self._configFile.AddFile(pdObj.GetFilename()) pdObj.AddDescription(fObj.GetFileHeader()) defSection = fObj.GetSectionByName('defines')[0] baseSection = doxygen.Section('PackageBasicInformation', 'Package Basic Information') descr = '<TABLE>' for obj in defSection.GetObjects(): if obj.GetKey() in _dec_key_description_mapping_table.keys(): descr += '<TR>' descr += '<TD><B>%s</B></TD>' % _dec_key_description_mapping_table[ obj.GetKey()] descr += '<TD>%s</TD>' % obj.GetValue() descr += '</TR>' descr += '</TABLE><br>' baseSection.AddDescription(descr) pdObj.AddSection(baseSection) knownIssueSection = doxygen.Section('Known_Issue_section', 'Known Issue') knownIssueSection.AddDescription('<ul>') knownIssueSection.AddDescription( '<li> OPTIONAL macro for function parameter can not be dealed with doxygen, so it disapear in this document! </li>' ) knownIssueSection.AddDescription('</ul>') pdObj.AddSection(knownIssueSection) self.AddAllIncludeFiles(self._pObj, self._configFile) pages = self.GenerateIncludesSubPage(self._pObj, self._configFile) if len(pages) != 0: pdObj.AddPages(pages) pages = self.GenerateLibraryClassesSubPage(self._pObj, self._configFile) if len(pages) != 0: pdObj.AddPages(pages) pages = self.GeneratePcdSubPages(self._pObj, self._configFile) if len(pages) != 0: pdObj.AddPages(pages) pages = self.GenerateGuidSubPages(self._pObj, self._configFile) if len(pages) != 0: pdObj.AddPages(pages) pages = self.GeneratePpiSubPages(self._pObj, self._configFile) if len(pages) != 0: pdObj.AddPages(pages) pages = self.GenerateProtocolSubPages(self._pObj, self._configFile) if len(pages) != 0: pdObj.AddPages(pages) if not self._onlyIncludeDocument: pdObj.AddPages( self.GenerateModulePages(self._pObj, self._configFile)) pdObj.Save() return pdObj.GetFilename()
def GenerateLibraryClassesSubPage(self, pObj, configFile): """ Generate sub page for library class for package. One DEC file maybe contains many library class sections for different architecture. @param fObj DEC file object. """ rootArray = [] pageRoot = doxygen.Page("Library Class", "%s_libraryclass" % pObj.GetName()) objs = pObj.GetFileObj().GetSectionObjectsByName('libraryclass', self._arch) if len(objs) == 0: return [] if self._arch is not None: for obj in objs: classPage = doxygen.Page(obj.GetClassName(), "lc_%s" % obj.GetClassName()) comments = obj.GetComment() if len(comments) != 0: classPage.AddDescription('<br>\n'.join(comments) + '<br>\n') pageRoot.AddPage(classPage) path = os.path.join(pObj.GetFileObj().GetPackageRootPath(), obj.GetHeaderFile()) path = path[len(pObj.GetWorkspace()) + 1:] if len(comments) == 0: classPage.AddDescription('\copydoc %s<p>' % obj.GetHeaderFile()) section = doxygen.Section('ref', 'Refer to Header File') section.AddDescription('\link %s\n' % obj.GetHeaderFile()) section.AddDescription(' \endlink<p>\n') classPage.AddSection(section) fullPath = os.path.join(pObj.GetFileObj().GetPackageRootPath(), obj.GetHeaderFile()) self.ProcessSourceFileForInclude(fullPath, pObj, configFile) else: archPageDict = {} for obj in objs: if obj.GetArch() not in archPageDict.keys(): archPageDict[obj.GetArch()] = doxygen.Page(obj.GetArch(), 'lc_%s' % obj.GetArch()) pageRoot.AddPage(archPageDict[obj.GetArch()]) subArchRoot = archPageDict[obj.GetArch()] classPage = doxygen.Page(obj.GetClassName(), "lc_%s" % obj.GetClassName()) comments = obj.GetComment() if len(comments) != 0: classPage.AddDescription('<br>\n'.join(comments) + '<br>\n') subArchRoot.AddPage(classPage) path = os.path.join(pObj.GetFileObj().GetPackageRootPath(), obj.GetHeaderFile()) path = path[len(pObj.GetWorkspace()) + 1:] if len(comments) == 0: classPage.AddDescription('\copydoc %s<p>' % obj.GetHeaderFile()) section = doxygen.Section('ref', 'Refer to Header File') section.AddDescription('\link %s\n' % obj.GetHeaderFile()) section.AddDescription(' \endlink<p>\n') classPage.AddSection(section) fullPath = os.path.join(pObj.GetFileObj().GetPackageRootPath(), obj.GetHeaderFile()) self.ProcessSourceFileForInclude(fullPath, pObj, configFile) rootArray.append(pageRoot) return rootArray
def GenerateModulePage(self, pObj, infObj, configFile, isLib): """ Generate page for a module/library. @param infObj INF file object for module/library @param configFile doxygen config file object @param isLib Whether this module is libary @param module doxygen page object """ workspace = pObj.GetWorkspace() refDecObjs = [] for obj in infObj.GetSectionObjectsByName('packages'): decObj = dec.DECFile(os.path.join(workspace, obj.GetPath())) if not decObj: ErrorMsg ('Fail to create pacakge object for %s' % obj.GetPackageName()) continue if not decObj.Parse(): ErrorMsg ('Fail to load package object for %s' % obj.GetPackageName()) continue refDecObjs.append(decObj) modPage = doxygen.Page('%s' % infObj.GetBaseName(), 'module_%s' % infObj.GetBaseName()) modPage.AddDescription(infObj.GetFileHeader()) basicInfSection = doxygen.Section('BasicModuleInformation', 'Basic Module Information') desc = "<TABLE>" for obj in infObj.GetSectionObjectsByName('defines'): key = obj.GetKey() value = obj.GetValue() if key not in _inf_key_description_mapping_table.keys(): continue if key == 'LIBRARY_CLASS' and value.find('|') != -1: clsname, types = value.split('|') desc += '<TR>' desc += '<TD><B>%s</B></TD>' % _inf_key_description_mapping_table[key] desc += '<TD>%s</TD>' % clsname desc += '</TR>' desc += '<TR>' desc += '<TD><B>Supported Module Types</B></TD>' desc += '<TD>%s</TD>' % types desc += '</TR>' else: desc += '<TR>' desc += '<TD><B>%s</B></TD>' % _inf_key_description_mapping_table[key] if key == 'EFI_SPECIFICATION_VERSION' and value == '0x00020000': value = '2.0' desc += '<TD>%s</TD>' % value desc += '</TR>' desc += '</TABLE>' basicInfSection.AddDescription(desc) modPage.AddSection(basicInfSection) # Add protocol section data = [] for obj in infObj.GetSectionObjectsByName('pcd', self._arch): data.append(obj.GetPcdName().strip()) if len(data) != 0: s = doxygen.Section('Pcds', 'Pcds') desc = "<TABLE>" desc += '<TR><TD><B>PCD Name</B></TD><TD><B>TokenSpace</B></TD><TD><B>Package</B></TD></TR>' for item in data: desc += '<TR>' desc += '<TD>%s</TD>' % item.split('.')[1] desc += '<TD>%s</TD>' % item.split('.')[0] pkgbasename = self.SearchPcdPackage(item, workspace, refDecObjs) desc += '<TD>%s</TD>' % pkgbasename desc += '</TR>' desc += "</TABLE>" s.AddDescription(desc) modPage.AddSection(s) # Add protocol section #sects = infObj.GetSectionByString('protocol') data = [] #for sect in sects: for obj in infObj.GetSectionObjectsByName('protocol', self._arch): data.append(obj.GetName().strip()) if len(data) != 0: s = doxygen.Section('Protocols', 'Protocols') desc = "<TABLE>" desc += '<TR><TD><B>Name</B></TD><TD><B>Package</B></TD></TR>' for item in data: desc += '<TR>' desc += '<TD>%s</TD>' % item pkgbasename = self.SearchProtocolPackage(item, workspace, refDecObjs) desc += '<TD>%s</TD>' % pkgbasename desc += '</TR>' desc += "</TABLE>" s.AddDescription(desc) modPage.AddSection(s) # Add ppi section #sects = infObj.GetSectionByString('ppi') data = [] #for sect in sects: for obj in infObj.GetSectionObjectsByName('ppi', self._arch): data.append(obj.GetName().strip()) if len(data) != 0: s = doxygen.Section('Ppis', 'Ppis') desc = "<TABLE>" desc += '<TR><TD><B>Name</B></TD><TD><B>Package</B></TD></TR>' for item in data: desc += '<TR>' desc += '<TD>%s</TD>' % item pkgbasename = self.SearchPpiPackage(item, workspace, refDecObjs) desc += '<TD>%s</TD>' % pkgbasename desc += '</TR>' desc += "</TABLE>" s.AddDescription(desc) modPage.AddSection(s) # Add guid section #sects = infObj.GetSectionByString('guid') data = [] #for sect in sects: for obj in infObj.GetSectionObjectsByName('guid', self._arch): data.append(obj.GetName().strip()) if len(data) != 0: s = doxygen.Section('Guids', 'Guids') desc = "<TABLE>" desc += '<TR><TD><B>Name</B></TD><TD><B>Package</B></TD></TR>' for item in data: desc += '<TR>' desc += '<TD>%s</TD>' % item pkgbasename = self.SearchGuidPackage(item, workspace, refDecObjs) desc += '<TD>%s</TD>' % pkgbasename desc += '</TR>' desc += "</TABLE>" s.AddDescription(desc) modPage.AddSection(s) section = doxygen.Section('LibraryClasses', 'Library Classes') desc = "<TABLE>" desc += '<TR><TD><B>Name</B></TD><TD><B>Type</B></TD><TD><B>Package</B></TD><TD><B>Header File</B></TD></TR>' if isLib: desc += '<TR>' desc += '<TD>%s</TD>' % infObj.GetProduceLibraryClass() desc += '<TD>Produce</TD>' try: pkgname, hPath = self.SearchLibraryClassHeaderFile(infObj.GetProduceLibraryClass(), workspace, refDecObjs) except: self.Log ('fail to get package header file for lib class %s' % infObj.GetProduceLibraryClass()) pkgname = 'NULL' hPath = 'NULL' desc += '<TD>%s</TD>' % pkgname if hPath != "NULL": desc += '<TD>\link %s \endlink</TD>' % hPath else: desc += '<TD>%s</TD>' % hPath desc += '</TR>' for lcObj in infObj.GetSectionObjectsByName('libraryclasses', self._arch): desc += '<TR>' desc += '<TD>%s</TD>' % lcObj.GetClass() retarr = self.SearchLibraryClassHeaderFile(lcObj.GetClass(), workspace, refDecObjs) if retarr is not None: pkgname, hPath = retarr else: self.Log('Fail find the library class %s definition from module %s dependent package!' % (lcObj.GetClass(), infObj.GetFilename()), 'error') pkgname = 'NULL' hPath = 'NULL' desc += '<TD>Consume</TD>' desc += '<TD>%s</TD>' % pkgname desc += '<TD>\link %s \endlink</TD>' % hPath desc += '</TR>' desc += "</TABLE>" section.AddDescription(desc) modPage.AddSection(section) section = doxygen.Section('SourceFiles', 'Source Files') section.AddDescription('<ul>\n') for obj in infObj.GetSourceObjects(self._arch, self._tooltag): sPath = infObj.GetModuleRootPath() sPath = os.path.join(sPath, obj.GetSourcePath()).replace('\\', '/').strip() if sPath.lower().endswith('.uni') or sPath.lower().endswith('.s') or sPath.lower().endswith('.asm') or sPath.lower().endswith('.nasm'): newPath = self.TranslateUniFile(sPath) configFile.AddFile(newPath) newPath = newPath[len(pObj.GetWorkspace()) + 1:] section.AddDescription('<li> \link %s \endlink </li>' % newPath) else: self.ProcessSourceFileForInclude(sPath, pObj, configFile, infObj) sPath = sPath[len(pObj.GetWorkspace()) + 1:] section.AddDescription('<li>\link %s \endlink </li>' % sPath) section.AddDescription('</ul>\n') modPage.AddSection(section) #sects = infObj.GetSectionByString('depex') data = [] #for sect in sects: for obj in infObj.GetSectionObjectsByName('depex'): data.append(str(obj)) if len(data) != 0: s = doxygen.Section('DependentSection', 'Module Dependencies') s.AddDescription('<br>'.join(data)) modPage.AddSection(s) return modPage
def GeneratePcdSubPages(self, pObj, configFile): """ Generate sub pages for package's PCD definition. @param pObj package object @param configFile config file object """ rootArray = [] objs = pObj.GetFileObj().GetSectionObjectsByName('pcd') if len(objs) == 0: return [] pcdRootPage = doxygen.Page('PCD', 'pcd_root_page') typeRootPageDict = {} typeArchRootPageDict = {} for obj in objs: if obj.GetPcdType() not in typeRootPageDict.keys(): typeRootPageDict[obj.GetPcdType()] = doxygen.Page(obj.GetPcdType(), 'pcd_%s_root_page' % obj.GetPcdType()) pcdRootPage.AddPage(typeRootPageDict[obj.GetPcdType()]) typeRoot = typeRootPageDict[obj.GetPcdType()] if self._arch is not None: pcdPage = doxygen.Page('%s' % obj.GetPcdName(), 'pcd_%s_%s_%s' % (obj.GetPcdType(), obj.GetArch(), obj.GetPcdName().split('.')[1])) pcdPage.AddDescription('<br>\n'.join(obj.GetComment()) + '<br>\n') section = doxygen.Section('PCDinformation', 'PCD Information') desc = '<TABLE>' desc += '<TR>' desc += '<TD><CAPTION>Name</CAPTION></TD>' desc += '<TD><CAPTION>Token Space</CAPTION></TD>' desc += '<TD><CAPTION>Token number</CAPTION></TD>' desc += '<TD><CAPTION>Data Type</CAPTION></TD>' desc += '<TD><CAPTION>Default Value</CAPTION></TD>' desc += '</TR>' desc += '<TR>' desc += '<TD><CAPTION>%s</CAPTION></TD>' % obj.GetPcdName().split('.')[1] desc += '<TD><CAPTION>%s</CAPTION></TD>' % obj.GetPcdName().split('.')[0] desc += '<TD><CAPTION>%s</CAPTION></TD>' % obj.GetPcdToken() desc += '<TD><CAPTION>%s</CAPTION></TD>' % obj.GetPcdDataType() desc += '<TD><CAPTION>%s</CAPTION></TD>' % obj.GetPcdValue() desc += '</TR>' desc += '</TABLE>' section.AddDescription(desc) pcdPage.AddSection(section) typeRoot.AddPage(pcdPage) else: keystr = obj.GetPcdType() + obj.GetArch() if keystr not in typeArchRootPageDict.keys(): typeArchRootPage = doxygen.Page(obj.GetArch(), 'pcd_%s_%s_root_page' % (obj.GetPcdType(), obj.GetArch())) typeArchRootPageDict[keystr] = typeArchRootPage typeRoot.AddPage(typeArchRootPage) typeArchRoot = typeArchRootPageDict[keystr] pcdPage = doxygen.Page('%s' % obj.GetPcdName(), 'pcd_%s_%s_%s' % (obj.GetPcdType(), obj.GetArch(), obj.GetPcdName().split('.')[1])) pcdPage.AddDescription('<br>\n'.join(obj.GetComment()) + '<br>\n') section = doxygen.Section('PCDinformation', 'PCD Information') desc = '<TABLE>' desc += '<TR>' desc += '<TD><CAPTION>Name</CAPTION></TD>' desc += '<TD><CAPTION>Token Space</CAPTION></TD>' desc += '<TD><CAPTION>Token number</CAPTION></TD>' desc += '<TD><CAPTION>Data Type</CAPTION></TD>' desc += '<TD><CAPTION>Default Value</CAPTION></TD>' desc += '</TR>' desc += '<TR>' desc += '<TD><CAPTION>%s</CAPTION></TD>' % obj.GetPcdName().split('.')[1] desc += '<TD><CAPTION>%s</CAPTION></TD>' % obj.GetPcdName().split('.')[0] desc += '<TD><CAPTION>%s</CAPTION></TD>' % obj.GetPcdToken() desc += '<TD><CAPTION>%s</CAPTION></TD>' % obj.GetPcdDataType() desc += '<TD><CAPTION>%s</CAPTION></TD>' % obj.GetPcdValue() desc += '</TR>' desc += '</TABLE>' section.AddDescription(desc) pcdPage.AddSection(section) typeArchRoot.AddPage(pcdPage) return [pcdRootPage]