git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@374 7335b...
authorhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 23 Jul 2007 05:39:15 +0000 (05:39 +0000)
committerhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 23 Jul 2007 05:39:15 +0000 (05:39 +0000)
Source/Python/Common/DataType.py
Source/Python/Common/InfClassObject.py
Source/Python/Common/String.py
Source/Python/CommonDataClass/CommonClass.py
Source/Python/CommonDataClass/ModuleClass.py

index a7e968d..c9600e2 100644 (file)
@@ -87,6 +87,8 @@ PLATFORM_COMPONENT_TYPE_LIBRARY = 'LIBRARY'
 PLATFORM_COMPONENT_TYPE_LIBRARY_CLASS = 'LIBRARY_CLASS'\r
 PLATFORM_COMPONENT_TYPE_MODULE = 'MODULE'\r
 \r
+TAB_LIBRARIES = 'Libraries'\r
+\r
 TAB_SOURCES = 'Sources'\r
 TAB_SOURCES_COMMON = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_COMMON\r
 TAB_SOURCES_IA32 = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_IA32\r
@@ -253,11 +255,9 @@ TAB_INF_DEFINES_UNLOAD_IMAGE = 'UNLOAD_IMAGE'
 TAB_INF_DEFINES_CONSTRUCTOR = 'CONSTRUCTOR'\r
 TAB_INF_DEFINES_DESTRUCTOR = 'DESTRUCTOR'\r
 TAB_INF_DEFINES_DEFINE = 'DEFINE'\r
+TAB_INF_DEFINES_SPEC = 'SPEC'\r
 TAB_INF_DEFINES_CUSTOM_MAKEFILE = 'CUSTOM_MAKEFILE'\r
-TAB_INF_DEFINES_TOOLS_FLAGS = 'ToolFlags'              #TBD\r
 TAB_INF_DEFINES_MACRO_NAME = 'MacroName'               #TBD\r
-TAB_INF_DEFINES_VARIABLE_NAME = 'VariableName'         #TBD\r
-TAB_INF_DEFINES_SPEC = 'Spec'                          #TBD\r
 \r
 #Dec Definitions\r
 TAB_DEC_DEFINES = TAB_COMMON_DEFINES\r
index dc36845..2ba764f 100644 (file)
 \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
@@ -52,10 +55,9 @@ class InfDefines(InfObject):
             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
@@ -66,6 +68,7 @@ class InfContents(InfObject):
         self.Guids = []\r
         self.Protocols = []\r
         self.Ppis = []\r
+        self.Libraries = []\r
         self.LibraryClasses = []\r
         self.Packages = []\r
         self.PcdsFixedAtBuild = []\r
@@ -76,16 +79,17 @@ class InfContents(InfObject):
         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
@@ -95,6 +99,9 @@ class Inf(InfObject):
         \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
@@ -103,15 +110,204 @@ class Inf(InfObject):
                 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
@@ -132,7 +328,7 @@ class Inf(InfObject):
                         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
@@ -143,17 +339,64 @@ class Inf(InfObject):
                             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
@@ -165,5 +408,6 @@ if __name__ == '__main__':
             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
index ac1d797..5ed7c9c 100644 (file)
@@ -15,6 +15,40 @@ import DataType
 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
@@ -161,41 +195,47 @@ def GetDynamics(Lines, Key, KeyValues, CommentCharacter):
 \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
@@ -212,11 +252,31 @@ def GetMultipleValuesOfKeyFromLines(Lines, Key, KeyValues, CommentCharacter):
 \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
@@ -233,6 +293,14 @@ def GetSingleValueOfKeyFromLines(Lines, Dictionary, CommentCharacter, KeySplitCh
                     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
@@ -240,3 +308,5 @@ if __name__ == '__main__':
     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
index 2597bfd..fda27ca 100644 (file)
@@ -28,7 +28,7 @@ class CommonHeaderClass(object):
 \r
 class DefineClass(object):\r
     def __init__(self):\r
-        self.Define = {}                                  #{ DefineName : DefineValue, ...}\r
+        self.Define = {}                                  #{ (DefineName, Arch) : DefineValue, ...}\r
         \r
 class ClonedRecordClass(object):\r
     def __init__(self):\r
index f0d926e..4340f19 100644 (file)
@@ -36,7 +36,7 @@ class ModuleHeaderClass(IdentificationClass, CommonHeaderClass, DefineClass):
         self.FfsExt = ''\r
         self.FvExt = ''\r
         self.SourceFv = ''\r
-        self.CustomMakefile = ''\r
+        self.CustomMakefile = {}                    #{ Family : Filename, ... }\r
         \r
 class ModuleSourceFileClass(CommonClass):\r
     def __init__(self):\r