\r
import os\r
import EdkLogger\r
+from CommonDataClass.CommonClass import LibraryClassClass\r
+from CommonDataClass.ModuleClass import *\r
from String import *\r
from DataType import *\r
from Identification import *\r
from Dictionary import *\r
+from BuildToolError import *\r
\r
class InfObject(object):\r
def __init__(self):\r
TAB_INF_DEFINES_CONSTRUCTOR : [''],\r
TAB_INF_DEFINES_DESTRUCTOR : [''],\r
TAB_INF_DEFINES_DEFINE : [''],\r
+ TAB_INF_DEFINES_SPEC : [''],\r
TAB_INF_DEFINES_CUSTOM_MAKEFILE : ['']\r
}\r
- self.ToolFlags = [] #'${FAMILY}:${TARGET}_${TAGNAME}_${ARCH}_${TOOLCODE}_FLAGS'\r
- self.MacroName = '$(MACRO_NAME)'\r
\r
class InfContents(InfObject):\r
def __init__(self):\r
self.Guids = []\r
self.Protocols = []\r
self.Ppis = []\r
+ self.Libraries = []\r
self.LibraryClasses = []\r
self.Packages = []\r
self.PcdsFixedAtBuild = []\r
self.Depex = []\r
\r
class Inf(InfObject):\r
- def __init__(self, filename = None, isMergeAllArches = False):\r
- self.identification = Identification()\r
+ def __init__(self, filename = None, isMergeAllArches = False, isToModule = False):\r
+ self.Identification = Identification()\r
self.Defines = InfDefines()\r
self.Contents = {}\r
+ self.Module = ModuleClass()\r
\r
for key in DataType.ARCH_LIST_FULL:\r
self.Contents[key] = InfContents()\r
\r
self.KeyList = [\r
- TAB_BINARIES, TAB_SOURCES, TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, TAB_PACKAGES, TAB_BUILD_OPTIONS, \\r
+ TAB_SOURCES, TAB_BUILD_OPTIONS, TAB_BINARIES, TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, TAB_PACKAGES, TAB_LIBRARIES, \\r
TAB_PCDS_FIXED_AT_BUILD_NULL, TAB_PCDS_PATCHABLE_IN_MODULE_NULL, TAB_PCDS_FEATURE_FLAG_NULL, \\r
TAB_PCDS_DYNAMIC_NULL, TAB_PCDS_DYNAMIC_EX_NULL, TAB_DEPEX\r
]\r
\r
if isMergeAllArches:\r
self.MergeAllArches()\r
+ \r
+ if isToModule:\r
+ self.InfToModule()\r
\r
def MergeAllArches(self):\r
for key in self.KeyList:\r
eval(Command) \r
\r
def ParseInf(self, Lines, Key, KeyField):\r
+ newKey = SplitModuleType(Key)\r
+ if newKey[0].find(DataType.TAB_LIBRARY_CLASSES.upper()) != -1:\r
+ GetLibraryClassesWithModuleType(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
+ else:\r
GetMultipleValuesOfKeyFromLines(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
\r
- def LoadInfFile(self, filename): \r
- (filepath, name) = os.path.split(filename)\r
- self.identification.FileName = name\r
- self.identification.FileFullPath = filename\r
- self.identification.FileRelativePath = filepath\r
+ def InfToModule(self):\r
+ #\r
+ # Get value for Header\r
+ #\r
+ self.Module.Header.Name = self.Defines.DefinesDictionary[TAB_INF_DEFINES_BASE_NAME][0]\r
+ self.Module.Header.Guid = self.Defines.DefinesDictionary[TAB_INF_DEFINES_FILE_GUID][0]\r
+ self.Module.Header.Version = self.Defines.DefinesDictionary[TAB_INF_DEFINES_VERSION_NUMBER][0]\r
+ self.Module.Header.FileName = self.Identification.FileName\r
+ self.Module.Header.FullPath = self.Identification.FileFullPath\r
+ \r
+ self.Module.Header.EfiSpecificationVersion = self.Defines.DefinesDictionary[TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION][0]\r
+ self.Module.Header.EdkReleaseVersion = self.Defines.DefinesDictionary[TAB_INF_DEFINES_EDK_RELEASE_VERSION][0]\r
+ self.Module.Header.InfVersion = self.Defines.DefinesDictionary[TAB_INF_DEFINES_INF_VERSION][0]\r
+ \r
+ self.Module.Header.ModuleType = self.Defines.DefinesDictionary[TAB_INF_DEFINES_MODULE_TYPE][0]\r
+ self.Module.Header.BinaryModule = self.Defines.DefinesDictionary[TAB_INF_DEFINES_BINARY_MODULE][0]\r
+ self.Module.Header.ComponentType = self.Defines.DefinesDictionary[TAB_INF_DEFINES_COMPONENT_TYPE][0]\r
+ self.Module.Header.MakefileName = self.Defines.DefinesDictionary[TAB_INF_DEFINES_MAKEFILE_NAME][0]\r
+ self.Module.Header.BuildNumber = self.Defines.DefinesDictionary[TAB_INF_DEFINES_BUILD_NUMBER][0]\r
+ self.Module.Header.BuildType = self.Defines.DefinesDictionary[TAB_INF_DEFINES_BUILD_TYPE][0]\r
+ self.Module.Header.FfsExt = self.Defines.DefinesDictionary[TAB_INF_DEFINES_FFS_EXT][0]\r
+ self.Module.Header.FvExt = self.Defines.DefinesDictionary[TAB_INF_DEFINES_FV_EXT][0]\r
+ self.Module.Header.SourceFv = self.Defines.DefinesDictionary[TAB_INF_DEFINES_SOURCE_FV][0]\r
+ self.Module.Header.PcdIsDriver = self.Defines.DefinesDictionary[TAB_INF_DEFINES_PCD_IS_DRIVER][0]\r
+ self.Module.Header.TianoR8FlashMap_h = self.Defines.DefinesDictionary[TAB_INF_DEFINES_TIANO_R8_FLASHMAP_H][0]\r
+ \r
+ #LibraryClass of Define\r
+ if self.Defines.DefinesDictionary[TAB_INF_DEFINES_LIBRARY_CLASS][0] != '':\r
+ for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_LIBRARY_CLASS]:\r
+ List = Item.split(DataType.TAB_VALUE_SPLIT, 1)\r
+ Lib = LibraryClassClass()\r
+ Lib.LibraryClass = CleanString(List[0])\r
+ Lib.SupModuleList = GetSplitValueList(CleanString(List[1]))\r
+ self.Module.Header.LibraryClass.append(Lib)\r
+ \r
+ #Custom makefile\r
+ if self.Defines.DefinesDictionary[TAB_INF_DEFINES_CUSTOM_MAKEFILE][0] != '':\r
+ for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_CUSTOM_MAKEFILE]:\r
+ List = Item.split(DataType.TAB_VALUE_SPLIT)\r
+ if len(List) == 2:\r
+ self.Module.Header.CustomMakefile[CleanString(List[0])] = CleanString(List[1])\r
+ else:\r
+ ErrorMsg = "Wrong CUSTOM_MAKEFILE statement '%s' found in section Defines in file '%s', correct format is 'CUSTOM_MAKEFILE = Family|Filename'" % (Item, self.Module.Header.FullPath) \r
+ raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
\r
- f = open(filename, 'r').read()\r
+ #EntryPoint and UnloadImage\r
+ if self.Defines.DefinesDictionary[TAB_INF_DEFINES_ENTRY_POINT][0] != '':\r
+ for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_ENTRY_POINT]:\r
+ Image = ModuleExternImageClass()\r
+ Image.ModuleEntryPoint = CleanString(Item)\r
+ self.Module.ExternImages.append(Image)\r
+ if self.Defines.DefinesDictionary[TAB_INF_DEFINES_UNLOAD_IMAGE][0] != '':\r
+ for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_UNLOAD_IMAGE]:\r
+ Image = ModuleExternImageClass()\r
+ Image.ModuleUnloadImage = CleanString(Item)\r
+ self.Module.ExternImages.append(Image)\r
+ \r
+ #Constructor and Destructor\r
+ if self.Defines.DefinesDictionary[TAB_INF_DEFINES_CONSTRUCTOR][0] != '':\r
+ for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_CONSTRUCTOR]:\r
+ LibraryClass = ModuleExternLibraryClass()\r
+ LibraryClass.Constructor = CleanString(Item)\r
+ self.Module.ExternLibraries.append(LibraryClass)\r
+ if self.Defines.DefinesDictionary[TAB_INF_DEFINES_DESTRUCTOR][0] != '':\r
+ for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_DESTRUCTOR]:\r
+ LibraryClass = ModuleExternLibraryClass()\r
+ LibraryClass.Destructor = CleanString(Item)\r
+ self.Module.ExternLibraries.append(LibraryClass)\r
+ \r
+ #Define\r
+ if self.Defines.DefinesDictionary[TAB_INF_DEFINES_DEFINE][0] != '':\r
+ for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_DEFINE]:\r
+ List = Item.split(DataType.TAB_EQUAL_SPLIT)\r
+ if len(List) != 2:\r
+ ErrorMsg = "Wrong DEFINE statement '%s' found in section Defines in file '%s', correct format is 'DEFINE <Word> = <Word>'" % (Item, self.Module.Header.FullPath) \r
+ raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+ else:\r
+ self.Module.Header.Define[CleanString(List[0])] = CleanString(List[1])\r
+ \r
+ #Spec\r
+ if self.Defines.DefinesDictionary[TAB_INF_DEFINES_SPEC][0] != '':\r
+ for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_SPEC]:\r
+ List = Item.split(DataType.TAB_EQUAL_SPLIT)\r
+ if len(List) != 2:\r
+ ErrorMsg = "Wrong SPEC statement '%s' found in section Defines in file '%s', correct format is 'SPEC <Word> = <Version>'" % (Item, self.Module.Header.FullPath) \r
+ raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+ else:\r
+ self.Module.Header.Specification[CleanString(List[0])] = CleanString(List[1])\r
+ \r
+ #BuildOptions\r
+ BuildOptions = {}\r
+ for Arch in DataType.ARCH_LIST:\r
+ for Item in self.Contents[Arch].BuildOptions:\r
+ ToolChainFamily = ''\r
+ Statement = ''\r
+ Option = ''\r
+ List = Item.split(DataType.TAB_EQUAL_SPLIT, 1)\r
+ if List[0].find(':') > -1:\r
+ ToolChainFamily = CleanString(List[0][ : List[0].find(':')])\r
+ Statement = CleanString(List[0][List[0].find(':') + 1 : ])\r
+ else:\r
+ Statement = CleanString(List[0]) \r
+ Option = CleanString(List[1])\r
+ MergeArches(BuildOptions, (ToolChainFamily, Statement, Option), Arch)\r
+ for Key in BuildOptions.keys():\r
+ BuildOption = BuildOptionClass()\r
+ BuildOption.ToolChainFamily = Key[0]\r
+ BuildOption.Statement = Key[1]\r
+ BuildOption.Option = Key[2]\r
+ BuildOption.SupArchList = BuildOptions[Key]\r
+ self.Module.BuildOptions.append(BuildOption) \r
+ \r
+ #Includes\r
+ Includes = {}\r
+ for Arch in DataType.ARCH_LIST:\r
+ for Item in self.Contents[Arch].Includes:\r
+ MergeArches(Includes, Item, Arch)\r
+ for Key in Includes.keys():\r
+ Include = IncludeClass()\r
+ Include.FilePath = Key\r
+ Include.SupArchList = Includes[Key]\r
+ self.Module.Includes.append(Include)\r
+ \r
+ #Libraries\r
+ Libraries = {}\r
+ for Arch in DataType.ARCH_LIST:\r
+ for Item in self.Contents[Arch].Libraries:\r
+ MergeArches(Libraries, Item, Arch)\r
+ for Key in Libraries.keys():\r
+ Library = ModuleLibraryClass()\r
+ Library.Library = Key\r
+ Library.SupArchList = Libraries[Key]\r
+ self.Module.Libraries.append(Library)\r
+ \r
+ #LibraryClasses\r
+ LibraryClasses = {}\r
+ Defines = {}\r
+ for Arch in DataType.ARCH_LIST:\r
+ for Item in self.Contents[Arch].LibraryClasses:\r
+ Status = GenDefines(Item[0], Arch, Defines)\r
+ if Status == 0: # Find DEFINE statement\r
+ pass\r
+ elif Status == -1: # Find DEFINE statement but in wrong format\r
+ ErrorMsg = "Wrong DEFINE statement '%s' found in section LibraryClasses in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item[0], self.Module.Header.FullPath) \r
+ raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+ elif Status == 1: # Not find DEFINE statement\r
+ #{ (LibraryClass, Instance, PcdFeatureFlag, ModuleType1|ModuleType2|ModuleType3) : [Arch1, Arch2, ...] }\r
+ ItemList = GetSplitValueList((Item[0] + DataType.TAB_VALUE_SPLIT + DataType.TAB_VALUE_SPLIT))\r
+ MergeArches(LibraryClasses, (ItemList[0], ItemList[1], ItemList[2], DataType.TAB_VALUE_SPLIT.join(Item[1])), Arch)\r
+ for Key in LibraryClasses.keys():\r
+ KeyList = Key[0].split(DataType.TAB_VALUE_SPLIT)\r
+ LibraryClass = LibraryClassClass()\r
+ LibraryClass.Define = Defines\r
+ LibraryClass.LibraryClass = Key[0]\r
+ LibraryClass.RecommendedInstance = Key[1]\r
+ LibraryClass.FeatureFlag = Key[2]\r
+ LibraryClass.SupArchList = LibraryClasses[Key]\r
+ if Key[3] != ['']:\r
+ LibraryClass.SupModuleList = GetSplitValueList(Key[3])\r
+ self.Module.LibraryClasses.append(LibraryClass)\r
+ \r
+ #Packages\r
+ Packages = {}\r
+ Defines = {}\r
+ for Arch in DataType.ARCH_LIST:\r
+ for Item in self.Contents[Arch].Packages:\r
+ Status = GenDefines(Item, Arch, Defines)\r
+ if Status == 0: # Find DEFINE statement\r
+ pass\r
+ elif Status == -1: # Find DEFINE statement but in wrong format\r
+ ErrorMsg = "Wrong DEFINE statement '%s' found in section Packages in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Module.Header.FullPath) \r
+ raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+ elif Status == 1: # Not find DEFINE statement\r
+ MergeArches(Packages, Item, Arch)\r
+ for Key in Packages.keys():\r
+ Package = ModulePackageDependencyClass()\r
+ Package.Define = Defines\r
+ Package.FilePath = Key\r
+ Package.SupArchList = Packages[Key]\r
+ self.Module.PackageDependencies.append(Package)\r
+ \r
+ #Nmake\r
+ Nmakes = {}\r
+ \r
+ \r
+ def LoadInfFile(self, Filename): \r
+ (Filepath, Name) = os.path.split(Filename)\r
+ self.Identification.FileName = Name\r
+ self.Identification.FileFullPath = Filename\r
+ self.Identification.FileRelativePath = Filepath\r
+ \r
+ f = open(Filename, 'r').read()\r
sects = f.split('[')\r
for sect in sects:\r
tab = (sect.split(TAB_SECTION_END, 1)[0]).upper()\r
target = (key + DataType.TAB_SPLIT + arch).upper()\r
else:\r
target = key.upper()\r
- if tab == target:\r
+ if SplitModuleType(tab)[0] == target:\r
if arch != DataType.TAB_ARCH_NULL:\r
Command = 'self.ParseInf(sect, tab, self.Contents[arch].' + key + ')'\r
eval(Command)\r
continue\r
#EndFor\r
\r
- def showInf(self):\r
+ def ShowInf(self):\r
print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END\r
printDict(self.Defines.DefinesDictionary)\r
\r
for key in self.KeyList:\r
for arch in DataType.ARCH_LIST_FULL:\r
Command = "printList(TAB_SECTION_START + '" + \\r
- key + DataType.TAB_SPLIT + arch + \\r
- "' + TAB_SECTION_END, self.Contents[arch]." + key + ')'\r
+ key + DataType.TAB_SPLIT + arch + \\r
+ "' + TAB_SECTION_END, self.Contents[arch]." + key + ')'\r
eval(Command)\r
print ""\r
+ \r
+ def ShowModule(self):\r
+ m = self.Module\r
+ print 'Filename =', m.Header.FileName\r
+ print 'FullPath =', m.Header.FullPath\r
+ print 'BaseName =', m.Header.Name\r
+ print 'Guid =', m.Header.Guid\r
+ print 'Version =', m.Header.Version\r
+ print 'InfVersion =', m.Header.InfVersion\r
+ print 'EfiSpecificationVersion =', m.Header.EfiSpecificationVersion\r
+ print 'EdkReleaseVersion =', m.Header.EdkReleaseVersion \r
+ print 'ModuleType =', m.Header.ModuleType\r
+ print 'BinaryModule =', m.Header.BinaryModule\r
+ print 'ComponentType =', m.Header.ComponentType\r
+ print 'MakefileName =', m.Header.MakefileName\r
+ print 'BuildNumber =', m.Header.BuildNumber\r
+ print 'BuildType =', m.Header.BuildType\r
+ print 'FfsExt =', m.Header.FfsExt\r
+ print 'FvExt =', m.Header.FvExt\r
+ print 'SourceFv =', m.Header.SourceFv\r
+ print 'PcdIsDriver =', m.Header.PcdIsDriver\r
+ print 'TianoR8FlashMap_h =', m.Header.TianoR8FlashMap_h\r
+ print 'LibraryClass =', m.Header.LibraryClass\r
+ for Item in m.Header.LibraryClass:\r
+ print Item.LibraryClass, DataType.TAB_VALUE_SPLIT.join(Item.SupModuleList)\r
+ print 'CustomMakefile =', m.Header.CustomMakefile\r
+ for Item in self.Module.ExternImages:\r
+ print 'Entry_Point = %s, UnloadImage = %s' % (Item.ModuleEntryPoint, Item.ModuleUnloadImage)\r
+ for Item in self.Module.ExternLibraries:\r
+ print 'Constructor = %s, Destructor = %s' % (Item.Constructor, Item.Destructor)\r
+ print 'Define =', m.Header.Define\r
+ print 'Specification =', m.Header.Specification\r
+ print '\nBuildOptions =', m.BuildOptions\r
+ for Item in m.BuildOptions:\r
+ print Item.ToolChainFamily, Item.Statement, Item.Option, Item.SupArchList\r
+ print '\nIncludes =', m.Includes\r
+ for Item in m.Includes:\r
+ print Item.FilePath, Item.SupArchList\r
+ print '\nLibraries =', m.Libraries\r
+ for Item in m.Libraries:\r
+ print Item.Library, Item.SupArchList\r
+ print '\nLibraryClasses =', m.LibraryClasses\r
+ for Item in m.LibraryClasses:\r
+ print Item.LibraryClass, Item.RecommendedInstance, Item.FeatureFlag, Item.SupModuleList, Item.SupArchList, Item.Define\r
+ print '\nPackageDependencies =', m.PackageDependencies\r
+ for Item in m.PackageDependencies:\r
+ print Item.FilePath, Item.SupArchList, Item.Define\r
\r
if __name__ == '__main__':\r
m = Inf()\r
fileList.append(os.path.join(directory, os.path.normcase(f)))\r
\r
for f in fileList:\r
- m = Inf(f)\r
- m.showInf()\r
+ m = Inf(f, True, True)\r
+ #m.ShowInf()\r
+ m.ShowModule()\r
import os.path\r
import string\r
\r
+#\r
+# Get a value list from a string with multiple values splited with SplitTag\r
+# The default SplitTag is DataType.TAB_VALUE_SPLIT\r
+# 'AAA|BBB|CCC' -> ['AAA', 'BBB', 'CCC']\r
+#\r
+def GetSplitValueList(String, SplitTag = DataType.TAB_VALUE_SPLIT):\r
+ return map(lambda l: l.strip(), String.split(SplitTag))\r
+\r
+#\r
+# Find a key's all arches in dict, add the new arch to the list\r
+# If not exist any arch, set the arch directly\r
+#\r
+def MergeArches(Dict, Key, Arch):\r
+ if Key in Dict.keys():\r
+ Dict[Key].append(Arch)\r
+ else:\r
+ Dict[Key] = Arch.split()\r
+\r
+#\r
+# Parse a string with format "DEFINE <VarName> = <PATH>"\r
+# Generate a map Defines[VarName] = PATH\r
+# Return False if invalid format\r
+#\r
+def GenDefines(String, Arch, Defines):\r
+ if String.find(DataType.TAB_DEFINE + ' ') > -1:\r
+ List = String.replace(DataType.TAB_DEFINE + ' ', '').split(DataType.TAB_EQUAL_SPLIT)\r
+ if len(List) == 2:\r
+ Defines[(CleanString(List[0]), Arch)] = CleanString(List[1])\r
+ return 0\r
+ else:\r
+ return -1\r
+ \r
+ return 1\r
+\r
def MergeModulePcds(pcds, pcdsFixedAtBuild, pcdsPatchableInModule, pcdsFeatureFlag, pcdsDynamic):\r
#[ ['PcdName|PcdGuid|PcdType', 'IA32|X64|IPF|EBC'], ...]\r
\r
\r
return True\r
\r
+#\r
+# Split ModuleType out of section defien to get key\r
+# [LibraryClass.Arch.ModuleType|ModuleType|ModuleType] -> [ 'LibraryClass.Arch', ['ModuleType', 'ModuleType', 'ModuleType'] ]\r
+#\r
def SplitModuleType(Key):\r
- #from DataType import *\r
KeyList = Key.split(DataType.TAB_SPLIT)\r
- rtv = []\r
- if len(KeyList) == 3:\r
- rtv.append(KeyList[0] + DataType.TAB_SPLIT + KeyList[1])\r
- rtv.append(KeyList[2])\r
- return rtv\r
- else:\r
- rtv.append(Key)\r
- rtv.append(None)\r
- return rtv\r
+ KeyList.append('') # Fill in for arch\r
+ KeyList.append('') # Fill in for moduletype\r
+ ReturnValue = []\r
+ KeyValue = KeyList[0]\r
+ if KeyList[1] != '':\r
+ KeyValue = KeyValue + DataType.TAB_SPLIT + KeyList[1]\r
+ ReturnValue.append(KeyValue)\r
+ ReturnValue.append(GetSplitValueList(KeyList[2]))\r
+ \r
+ return ReturnValue\r
\r
+#\r
+# Replace '\\', '\' with '/'\r
+#\r
def NormPath(path):\r
if path != '':\r
return os.path.normpath(path)\r
else:\r
return path\r
\r
+#\r
+# Remove comments in a string\r
+# Remove spaces\r
+#\r
def CleanString(Line, CommentCharacter = DataType.TAB_COMMENT_SPLIT):\r
#remove whitespace\r
Line = Line.strip();\r
#remove comments\r
Line = Line.split(CommentCharacter, 1)[0];\r
#replace '\\', '\' with '/'\r
- Line = Line.replace('\\', '/')\r
- Line = Line.replace('//', '/')\r
+ #Line = Line.replace('\\', '/')\r
+ #Line = Line.replace('//', '/')\r
#remove ${WORKSPACE}\r
- Line = Line.replace(DataType.TAB_WORKSPACE1, '')\r
- Line = Line.replace(DataType.TAB_WORKSPACE2, '')\r
- #remove '/' at the beginning\r
-# if Line.startswith('/'):\r
-# Line = Line.replace('/', '')\r
- #Change path\r
- #Line = os.path.normpath(Line)\r
+ #Line = Line.replace(DataType.TAB_WORKSPACE1, '')\r
+ #Line = Line.replace(DataType.TAB_WORKSPACE2, '')\r
\r
#remove whitespace again\r
Line = Line.strip();\r
\r
return True\r
\r
+def GetDefineValue(String, Key, CommentCharacter):\r
+ String = CleanString(String)\r
+ return String[String.find(Key + ' ') + len(Key + ' ') : ]\r
+\r
def GetSingleValueOfKeyFromLines(Lines, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):\r
Lines = Lines.split('\n')\r
Keys = []\r
Value = ''\r
+ DefineValues = []\r
+ SpecValues = []\r
+ \r
for Line in Lines:\r
+ #\r
+ # Handle DEFINE and SPEC\r
+ #\r
+ if Line.find(DataType.TAB_INF_DEFINES_DEFINE + ' ') > -1:\r
+ DefineValues.append(GetDefineValue(Line, DataType.TAB_INF_DEFINES_DEFINE, CommentCharacter))\r
+ continue\r
+ if Line.find(DataType.TAB_INF_DEFINES_SPEC + ' ') > -1:\r
+ SpecValues.append(GetDefineValue(Line, DataType.TAB_INF_DEFINES_SPEC, CommentCharacter))\r
+ continue\r
+ \r
+ #\r
+ # Handle Others\r
+ #\r
LineList = Line.split(KeySplitCharacter, 1)\r
if len(LineList) >= 2:\r
Key = LineList[0].split()\r
Keys.append(Key[0])\r
else:\r
Dictionary[Key[0]].extend(Value) \r
+ \r
+ if DefineValues == []:\r
+ DefineValues == ['']\r
+ if SpecValues == []:\r
+ SpecValues == ['']\r
+ Dictionary[DataType.TAB_INF_DEFINES_DEFINE] = DefineValues\r
+ Dictionary[DataType.TAB_INF_DEFINES_SPEC] = SpecValues\r
+ \r
return True\r
\r
\r
print SplitModuleType('LibraryClasses.common.DXE_RUNTIME_DRIVER')\r
print SplitModuleType('Library.common')\r
print SplitModuleType('Librarsdsfwe')\r
+ print NormPath('sdfas//dsfsadf//dsfsd')\r
+ print NormPath('\\dsfsdf\\\\sd\\fsd\\dsfsdfsdf\\\\')\r