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,201 @@
|
||||
## @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 DSCFile(ini.BaseINIFile):
|
||||
def GetSectionInstance(self, parent, name, isCombined=False):
|
||||
return DSCSection(parent, name, isCombined)
|
||||
|
||||
def GetComponents(self):
|
||||
return self.GetSectionObjectsByName('Components')
|
||||
|
||||
class DSCSection(ini.BaseINISection):
|
||||
def GetSectionINIObject(self, parent):
|
||||
type = self.GetType()
|
||||
|
||||
if type.lower() == 'components':
|
||||
return DSCComponentObject(self)
|
||||
if type.lower() == 'libraryclasses':
|
||||
return DSCLibraryClassObject(self)
|
||||
if type.lower() == 'defines':
|
||||
return ini.BaseINISectionObject(self)
|
||||
if type.lower() == 'pcdsfeatureflag' or \
|
||||
type.lower() == 'pcdsfixedatbuild' or \
|
||||
type.lower() == 'pcdspatchableinmodule' or\
|
||||
type.lower() == 'pcdsdynamicdefault' or \
|
||||
type.lower() == 'pcdsdynamicex' or \
|
||||
type.lower() == 'pcdsdynamichii' or \
|
||||
type.lower() == 'pcdsdynamicvpd':
|
||||
return DSCPcdObject(self)
|
||||
|
||||
return DSCSectionObject(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 GetModuleType(self):
|
||||
arr = self._name.split('.')
|
||||
if len(arr) < 3:
|
||||
return 'common'
|
||||
return arr[2]
|
||||
|
||||
class DSCSectionObject(ini.BaseINISectionObject):
|
||||
def GetArch(self):
|
||||
return self.GetParent().GetArch()
|
||||
|
||||
class DSCPcdObject(DSCSectionObject):
|
||||
|
||||
def __init__(self, parent):
|
||||
ini.BaseINISectionObject.__init__(self, parent)
|
||||
self._name = None
|
||||
|
||||
def Parse(self):
|
||||
line = self.GetLineByOffset(self._start).strip().split('#')[0]
|
||||
self._name = line.split('|')[0]
|
||||
self._value = line.split('|')[1]
|
||||
return True
|
||||
|
||||
def GetPcdName(self):
|
||||
return self._name
|
||||
|
||||
def GetPcdType(self):
|
||||
return self.GetParent().GetType()
|
||||
|
||||
def GetPcdValue(self):
|
||||
return self._value
|
||||
|
||||
class DSCLibraryClassObject(DSCSectionObject):
|
||||
def __init__(self, parent):
|
||||
ini.BaseINISectionObject.__init__(self, parent)
|
||||
|
||||
def GetClass(self):
|
||||
line = self.GetLineByOffset(self._start)
|
||||
return line.split('#')[0].split('|')[0].strip()
|
||||
|
||||
def GetInstance(self):
|
||||
line = self.GetLineByOffset(self._start)
|
||||
return line.split('#')[0].split('|')[1].strip()
|
||||
|
||||
def GetArch(self):
|
||||
return self.GetParent().GetArch()
|
||||
|
||||
def GetModuleType(self):
|
||||
return self.GetParent().GetModuleType()
|
||||
|
||||
class DSCComponentObject(DSCSectionObject):
|
||||
|
||||
def __init__(self, parent):
|
||||
ini.BaseINISectionObject.__init__(self, parent)
|
||||
self._OveridePcds = {}
|
||||
self._OverideLibraries = {}
|
||||
self._Filename = ''
|
||||
|
||||
def __del__(self):
|
||||
self._OverideLibraries.clear()
|
||||
self._OverideLibraries.clear()
|
||||
ini.BaseINISectionObject.__del__(self)
|
||||
|
||||
def AddOverideLib(self, libclass, libinstPath):
|
||||
if libclass not in self._OverideLibraries.keys():
|
||||
self._OverideLibraries[libclass] = libinstPath
|
||||
|
||||
def AddOveridePcd(self, name, type, value=None):
|
||||
if type not in self._OveridePcds.keys():
|
||||
self._OveridePcds[type] = []
|
||||
self._OveridePcds[type].append((name, value))
|
||||
|
||||
def GetOverideLibs(self):
|
||||
return self._OverideLibraries
|
||||
|
||||
def GetArch(self):
|
||||
return self.GetParent().GetArch()
|
||||
|
||||
def GetOveridePcds(self):
|
||||
return self._OveridePcds
|
||||
|
||||
def GetFilename(self):
|
||||
return self.GetLineByOffset(self._start).split('#')[0].split('{')[0].strip()
|
||||
|
||||
def SetFilename(self, fName):
|
||||
self._Filename = fName
|
||||
|
||||
def Parse(self):
|
||||
if (self._start < self._end):
|
||||
#
|
||||
# The first line is inf path and could be ignored
|
||||
# The end line is '}' and could be ignored
|
||||
#
|
||||
curr = self._start + 1
|
||||
end = self._end - 1
|
||||
OverideName = ''
|
||||
while (curr <= end):
|
||||
line = self.GetLineByOffset(curr).strip()
|
||||
if len(line) > 0 and line[0] != '#':
|
||||
line = line.split('#')[0].strip()
|
||||
if line[0] == '<':
|
||||
OverideName = line[1:len(line)-1]
|
||||
elif OverideName.lower() == 'libraryclasses':
|
||||
arr = line.split('|')
|
||||
self._OverideLibraries[arr[0].strip()] = arr[1].strip()
|
||||
elif OverideName.lower() == 'pcds':
|
||||
ErrorMsg('EDES does not support PCD overide',
|
||||
self.GetFileName(),
|
||||
self.GetParent().GetLinenumberByOffset(curr))
|
||||
curr = curr + 1
|
||||
return True
|
||||
|
||||
def GenerateLines(self):
|
||||
lines = []
|
||||
hasLib = False
|
||||
hasPcd = False
|
||||
if len(self._OverideLibraries) != 0:
|
||||
hasLib = True
|
||||
if len(self._OveridePcds) != 0:
|
||||
hasPcd = True
|
||||
|
||||
if hasLib or hasPcd:
|
||||
lines.append((' %s {\n' % self._Filename))
|
||||
else:
|
||||
lines.append((' %s \n' % self._Filename))
|
||||
return lines
|
||||
|
||||
if hasLib:
|
||||
lines.append(' <LibraryClasses>\n')
|
||||
for libKey in self._OverideLibraries.keys():
|
||||
lines.append(' %s|%s\n' % (libKey, self._OverideLibraries[libKey]))
|
||||
|
||||
if hasPcd:
|
||||
for key in self._OveridePcds.keys():
|
||||
lines.append(' <%s>\n' % key)
|
||||
|
||||
for name, value in self._OveridePcds[key]:
|
||||
if value != None:
|
||||
lines.append(' %s|%s\n' % (name, value))
|
||||
else:
|
||||
lines.append(' %s\n' % name)
|
||||
|
||||
if hasLib or hasPcd:
|
||||
lines.append(' }\n')
|
||||
|
||||
return lines
|
||||
|
Reference in New Issue
Block a user