BaseTools: Add PackageDocumentTools into Scripts folder
This tool is used to generate the document for edk2 packages. The generated document will be in UDK release. For example, UDK2017 document can be found in: https://github.com/tianocore/tianocore.github.io/wiki/UDK2017#documentation Cc: Star Zeng <star.zeng@intel.com> Cc: Liming Gao <liming.gao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
@ -0,0 +1,341 @@
|
||||
## @file
|
||||
#
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials are licensed and made available
|
||||
# under the terms and conditions of the BSD License which accompanies this
|
||||
# distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
|
||||
import plugins.EdkPlugins.basemodel.ini as ini
|
||||
import re, os
|
||||
from plugins.EdkPlugins.basemodel.message import *
|
||||
|
||||
class INFFile(ini.BaseINIFile):
|
||||
_libobjs = {}
|
||||
|
||||
def GetSectionInstance(self, parent, name, isCombined=False):
|
||||
return INFSection(parent, name, isCombined)
|
||||
|
||||
def GetProduceLibraryClass(self):
|
||||
obj = self.GetDefine("LIBRARY_CLASS")
|
||||
if obj == None: return None
|
||||
|
||||
return obj.split('|')[0].strip()
|
||||
|
||||
def GetSectionObjectsByName(self, name, arch=None):
|
||||
arr = []
|
||||
sects = self.GetSectionByName(name)
|
||||
for sect in sects:
|
||||
# skip unmatched archtecture content
|
||||
if not sect.IsArchMatch(arch):
|
||||
continue
|
||||
|
||||
for obj in sect.GetObjects():
|
||||
arr.append(obj)
|
||||
|
||||
return arr
|
||||
|
||||
def GetSourceObjects(self, arch=None, tool=None):
|
||||
arr = []
|
||||
sects = self.GetSectionByName('sources')
|
||||
for sect in sects:
|
||||
# skip unmatched archtecture content
|
||||
if not sect.IsArchMatch(arch):
|
||||
continue
|
||||
|
||||
for obj in sect.GetObjects():
|
||||
if not obj.IsMatchFamily(tool):
|
||||
continue
|
||||
arr.append(obj)
|
||||
|
||||
return arr
|
||||
|
||||
def Parse(self):
|
||||
if not ini.BaseINIFile.Parse(self):
|
||||
return False
|
||||
classname = self.GetProduceLibraryClass()
|
||||
if classname != None:
|
||||
libobjdict = INFFile._libobjs
|
||||
if libobjdict.has_key(classname):
|
||||
if self not in libobjdict[classname]:
|
||||
libobjdict[classname].append(self)
|
||||
else:
|
||||
libobjdict[classname] = [self]
|
||||
|
||||
return True
|
||||
|
||||
def GetBaseName(self):
|
||||
return self.GetDefine("BASE_NAME").strip()
|
||||
|
||||
def GetModuleRootPath(self):
|
||||
return os.path.dirname(self.GetFilename())
|
||||
|
||||
def Clear(self):
|
||||
classname = self.GetProduceLibraryClass()
|
||||
if classname != None:
|
||||
libobjdict = INFFile._libobjs
|
||||
libobjdict[classname].remove(self)
|
||||
if len(libobjdict[classname]) == 0:
|
||||
del libobjdict[classname]
|
||||
ini.BaseINIFile.Clear(self)
|
||||
|
||||
|
||||
class INFSection(ini.BaseINISection):
|
||||
def GetSectionINIObject(self, parent):
|
||||
type = self.GetType()
|
||||
|
||||
if type.lower() == 'libraryclasses':
|
||||
return INFLibraryClassObject(self)
|
||||
if type.lower() == 'sources':
|
||||
return INFSourceObject(self)
|
||||
if type.lower().find('pcd') != -1:
|
||||
return INFPcdObject(self)
|
||||
if type.lower() == 'packages':
|
||||
return INFDependentPackageObject(self)
|
||||
if type.lower() in ['guids', 'protocols', 'ppis']:
|
||||
return INFGuidObject(self)
|
||||
if type.lower() == 'defines':
|
||||
return INFDefineSectionObject(self)
|
||||
return INFSectionObject(self)
|
||||
|
||||
def GetType(self):
|
||||
arr = self._name.split('.')
|
||||
return arr[0].strip()
|
||||
|
||||
def GetArch(self):
|
||||
arr = self._name.split('.')
|
||||
if len(arr) == 1:
|
||||
return 'common'
|
||||
return arr[1]
|
||||
|
||||
def IsArchMatch(self, arch):
|
||||
if arch == None or self.GetArch() == 'common':
|
||||
return True
|
||||
|
||||
if self.GetArch().lower() != arch.lower():
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
class INFSectionObject(ini.BaseINISectionObject):
|
||||
def GetArch(self):
|
||||
return self.GetParent().GetArch()
|
||||
|
||||
class INFDefineSectionObject(INFSectionObject):
|
||||
def __init__(self, parent):
|
||||
INFSectionObject.__init__(self, parent)
|
||||
self._key = None
|
||||
self._value = None
|
||||
|
||||
def Parse(self):
|
||||
assert (self._start == self._end), 'The object in define section must be in single line'
|
||||
|
||||
line = self.GetLineByOffset(self._start).strip()
|
||||
|
||||
line = line.split('#')[0]
|
||||
arr = line.split('=')
|
||||
if len(arr) != 2:
|
||||
ErrorMsg('Invalid define section object',
|
||||
self.GetFilename(),
|
||||
self._start
|
||||
)
|
||||
return False
|
||||
|
||||
self._key = arr[0].strip()
|
||||
self._value = arr[1].strip()
|
||||
|
||||
return True
|
||||
|
||||
def GetKey(self):
|
||||
return self._key
|
||||
|
||||
def GetValue(self):
|
||||
return self._value
|
||||
|
||||
class INFLibraryClassObject(INFSectionObject):
|
||||
_objs = {}
|
||||
def __init__(self, parent):
|
||||
INFSectionObject.__init__(self, parent)
|
||||
self._classname = None
|
||||
|
||||
def GetClass(self):
|
||||
return self._classname
|
||||
|
||||
def Parse(self):
|
||||
self._classname = self.GetLineByOffset(self._start).split('#')[0].strip()
|
||||
objdict = INFLibraryClassObject._objs
|
||||
if objdict.has_key(self._classname):
|
||||
objdict[self._classname].append(self)
|
||||
else:
|
||||
objdict[self._classname] = [self]
|
||||
return True
|
||||
|
||||
def Destroy(self):
|
||||
objdict = INFLibraryClassObject._objs
|
||||
objdict[self._classname].remove(self)
|
||||
if len(objdict[self._classname]) == 0:
|
||||
del objdict[self._classname]
|
||||
|
||||
def GetName(self):
|
||||
return self._classname
|
||||
|
||||
@staticmethod
|
||||
def GetObjectDict():
|
||||
return INFLibraryClassObject._objs
|
||||
|
||||
class INFDependentPackageObject(INFSectionObject):
|
||||
def GetPath(self):
|
||||
return self.GetLineByOffset(self._start).split('#')[0].strip()
|
||||
|
||||
class INFSourceObject(INFSectionObject):
|
||||
_objs = {}
|
||||
def __init__(self, parent):
|
||||
INFSectionObject.__init__(self, parent)
|
||||
|
||||
self.mSourcename = None
|
||||
self.mToolCode = None
|
||||
self.mFamily = None
|
||||
self.mTagName = None
|
||||
self.mFeaturePcd = None
|
||||
self.mFilename = None
|
||||
|
||||
def GetSourcePath(self):
|
||||
return self.mSourcename
|
||||
|
||||
def GetSourceFullPath(self):
|
||||
path = os.path.dirname(self.GetFilename())
|
||||
path = os.path.join(path, self.GetSourcePath())
|
||||
return os.path.normpath(path)
|
||||
|
||||
def GetToolCode(self):
|
||||
return self.mToolCode
|
||||
|
||||
def GetFamily(self):
|
||||
return self.mFamily
|
||||
|
||||
def GetTagName(self):
|
||||
return self.mTagName
|
||||
|
||||
def GetFeaturePcd(self):
|
||||
return self.mFeaturePcd
|
||||
|
||||
def Parse(self):
|
||||
line = self.GetLineByOffset(self._start).strip().split('#')[0]
|
||||
|
||||
arr = line.split('|')
|
||||
|
||||
self.mSourcename = arr[0].strip()
|
||||
if len(arr) >= 2:
|
||||
self.mFamily = arr[1].strip()
|
||||
if len(arr) >= 3:
|
||||
self.mTagName = arr[2].strip()
|
||||
if len(arr) >= 4:
|
||||
self.mToolCode = arr[3].strip()
|
||||
if len(arr) >= 5:
|
||||
self.mFeaturePcd = arr[4].strip()
|
||||
|
||||
self.mFilename = os.path.basename(self.GetSourceFullPath())
|
||||
objdict = INFSourceObject._objs
|
||||
if not objdict.has_key(self.mFilename):
|
||||
objdict[self.mFilename] = [self]
|
||||
else:
|
||||
objdict[self.mFilename].append(self)
|
||||
|
||||
return True
|
||||
|
||||
def GetName(self):
|
||||
return self.mFilename
|
||||
|
||||
def Destroy(self):
|
||||
objdict = INFSourceObject._objs
|
||||
objdict[self.mFilename].remove(self)
|
||||
if len(objdict[self.mFilename]) == 0:
|
||||
del objdict[self.mFilename]
|
||||
|
||||
def IsMatchFamily(self, family):
|
||||
if family == None:
|
||||
return True
|
||||
if self.mFamily != None:
|
||||
if family.strip().lower() == self.mFamily.lower():
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
else:
|
||||
fname = self.GetSourcePath()
|
||||
if fname.endswith('.S') and family.lower() != 'gcc':
|
||||
return False
|
||||
if fname.endswith('.s') and (self.GetArch().lower() != 'ipf' and self.GetArch().lower() != 'common'):
|
||||
return False
|
||||
if fname.lower().endswith('.asm') and (family.lower() != 'msft' and family.lower() != 'intel'):
|
||||
return False
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def GetObjectDict():
|
||||
return INFSourceObject._objs
|
||||
|
||||
class INFPcdObject(INFSectionObject):
|
||||
_objs = {}
|
||||
|
||||
def __init__(self, parent):
|
||||
INFSectionObject.__init__(self, parent)
|
||||
|
||||
self.mPcdType = None
|
||||
self.mDefaultValue = None
|
||||
self.mPcdName = None
|
||||
|
||||
@staticmethod
|
||||
def GetObjectDict():
|
||||
return INFPcdObject._objs
|
||||
|
||||
def Parse(self):
|
||||
line = self.GetLineByOffset(self._start).strip().split('#')[0]
|
||||
|
||||
arr = line.split('|')
|
||||
self.mPcdName = arr[0].strip()
|
||||
|
||||
if len(arr) >= 2:
|
||||
self.mDefaultValue = arr[1].strip()
|
||||
|
||||
objdict = INFPcdObject._objs
|
||||
if objdict.has_key(self.GetName()):
|
||||
if self not in objdict[self.GetName()]:
|
||||
objdict[self.GetName()].append(self)
|
||||
else:
|
||||
objdict[self.GetName()] = [self]
|
||||
return True
|
||||
|
||||
def GetPcdName(self):
|
||||
return self.mPcdName
|
||||
|
||||
def GetPcdType(self):
|
||||
return self.GetParent().GetType()
|
||||
|
||||
def GetName(self):
|
||||
return self.mPcdName.split('.')[1]
|
||||
|
||||
def Destroy(self):
|
||||
objdict = INFPcdObject._objs
|
||||
objdict[self.GetName()].remove(self)
|
||||
if len(objdict[self.GetName()]) == 0:
|
||||
del objdict[self.GetName()]
|
||||
|
||||
class INFGuidObject(INFSectionObject):
|
||||
def __init__(self, parent):
|
||||
INFSectionObject.__init__(self, parent)
|
||||
self._name = None
|
||||
|
||||
def Parse(self):
|
||||
line = self.GetLineByOffset(self._start).strip().split('#')[0].split("|")[0]
|
||||
self._name = line.strip()
|
||||
return True
|
||||
|
||||
def GetName(self):
|
||||
return self._name
|
||||
|
||||
|
Reference in New Issue
Block a user