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

index c9600e2..6d97fe2 100644 (file)
@@ -225,6 +225,8 @@ TAB_COMPONENTS_EBC = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_EBC
 TAB_BUILD_OPTIONS = 'BuildOptions'\r
 \r
 TAB_DEFINE = 'DEFINE'\r
+TAB_NMAKE = 'Nmake'\r
+TAB_USER_EXTENSIONS = 'UserExtensions'\r
 \r
 #Common Define\r
 TAB_COMMON_DEFINES = 'Defines'\r
index 2ba764f..02f1b78 100644 (file)
@@ -77,12 +77,14 @@ class InfContents(InfObject):
         self.PcdsDynamic = []\r
         self.PcdsDynamicEx = []\r
         self.Depex = []\r
+        self.Nmake = []\r
         \r
 class Inf(InfObject):\r
     def __init__(self, filename = None, isMergeAllArches = False, isToModule = False):\r
         self.Identification = Identification()\r
         self.Defines = InfDefines()\r
         self.Contents = {}\r
+        self.UserExtensions = ''\r
         self.Module = ModuleClass()\r
         \r
         for key in DataType.ARCH_LIST_FULL:\r
@@ -91,7 +93,7 @@ class Inf(InfObject):
         self.KeyList = [\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
+            TAB_PCDS_DYNAMIC_NULL, TAB_PCDS_DYNAMIC_EX_NULL, TAB_DEPEX, TAB_NMAKE\r
         ]\r
                 \r
         if filename != None:\r
@@ -263,7 +265,7 @@ class Inf(InfObject):
                     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
+                    ItemList = GetSplitValueList((Item[0] + DataType.TAB_VALUE_SPLIT * 2))\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
@@ -299,8 +301,174 @@ class Inf(InfObject):
             \r
         #Nmake\r
         Nmakes = {}\r
+        for Arch in DataType.ARCH_LIST:\r
+            for Item in self.Contents[Arch].Nmake:\r
+                MergeArches(Nmakes, Item, Arch)\r
+        for Key in Nmakes.keys():\r
+            List = GetSplitValueList(Key, DataType.TAB_EQUAL_SPLIT)\r
+            if len(List) != 2:\r
+                ErrorMsg = "Wrong statement '%s' found in section Nmake in file '%s', correct format is '<Word>=<Word>'" % (Item, self.Module.Header.FullPath) \r
+                raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+            Nmake = ModuleNmakeClass()\r
+            Nmake.Name = List[0]\r
+            Nmake.Value = List[1]\r
+            Nmake.SupArchList = Nmakes[Key]\r
+            self.Module.Nmake.append(Nmake)\r
+        \r
+        #Pcds\r
+        Pcds = {}\r
+        for Arch in DataType.ARCH_LIST:\r
+            for Item in self.Contents[Arch].PcdsFixedAtBuild:\r
+                Item = Item + DataType.TAB_VALUE_SPLIT\r
+                List = GetSplitValueList(Item)\r
+                if len(List) <= 2:\r
+                    ErrorMsg = "Wrong statement '%s' found in section PcdsFixedAtBuild in file '%s', correct format is '<TokenName>|<TSGuidName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
+                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                MergeArches(Pcds, (List[0], List[1], List[2], TAB_PCDS_FIXED_AT_BUILD), Arch)\r
+            for Item in self.Contents[Arch].PcdsPatchableInModule:\r
+                Item = Item + DataType.TAB_VALUE_SPLIT\r
+                List = GetSplitValueList(Item)\r
+                if len(List) <= 2:\r
+                    ErrorMsg = "Wrong statement '%s' found in section PcdsPatchableInModule in file '%s', correct format is '<TokenName>|<TSGuidName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
+                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                MergeArches(Pcds, (List[0], List[1], List[2], TAB_PCDS_PATCHABLE_IN_MODULE), Arch)\r
+            for Item in self.Contents[Arch].PcdsFeatureFlag:\r
+                Item = Item + DataType.TAB_VALUE_SPLIT\r
+                List = GetSplitValueList(Item)\r
+                if len(List) <= 2:\r
+                    ErrorMsg = "Wrong statement '%s' found in section PcdsFeatureFlag in file '%s', correct format is '<TokenName>|<TSGuidName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
+                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                MergeArches(Pcds, (List[0], List[1], List[2], TAB_PCDS_FEATURE_FLAG), Arch)\r
+            for Item in self.Contents[Arch].PcdsDynamicEx:\r
+                Item = Item + DataType.TAB_VALUE_SPLIT\r
+                List = GetSplitValueList(Item)\r
+                if len(List) <= 2:\r
+                    ErrorMsg = "Wrong statement '%s' found in section PcdsDynamicEx in file '%s', correct format is '<TokenName>|<TSGuidName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
+                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                MergeArches(Pcds, (List[0], List[1], List[2], TAB_PCDS_DYNAMIC_EX), Arch)\r
+            for Item in self.Contents[Arch].PcdsDynamic:\r
+                Item = Item + DataType.TAB_VALUE_SPLIT\r
+                List = GetSplitValueList(Item)\r
+                if len(List) <= 2:\r
+                    ErrorMsg = "Wrong statement '%s' found in section PcdsDynamic in file '%s', correct format is '<TokenName>|<TSGuidName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
+                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                MergeArches(Pcds, (List[0], List[1], List[2], TAB_PCDS_DYNAMIC), Arch)\r
+        for Key in Pcds.keys():\r
+            Pcd = PcdClass()\r
+            Pcd.Token = Key[0]\r
+            Pcd.TokenSpaceGuidCName = Key[1]\r
+            Pcd.DefaultValue = Key[2]\r
+            Pcd.ItemType = Key[3]\r
+            Pcd.SupArchList = Pcds[Key]\r
+            self.Module.PcdCodes.append(Pcd)\r
+        \r
+        #Sources\r
+        Sources = {}\r
+        for Arch in DataType.ARCH_LIST:\r
+            for Item in self.Contents[Arch].Sources:\r
+                Item = Item + DataType.TAB_VALUE_SPLIT * 4\r
+                List = GetSplitValueList(Item)\r
+                MergeArches(Sources, (List[0], List[1], List[2], List[3], List[4]), Arch)\r
+        for Key in Sources.keys():\r
+            Source = ModuleSourceFileClass()\r
+            Source.SourceFile = Key[0]\r
+            Source.ToolChainFamily = Key[1]\r
+            Source.FeatureFlag = Key[2]\r
+            Source.TagName = Key[3]\r
+            Source.ToolCode = Key[4]\r
+            Source.SupArchList = Sources[Key]\r
+            self.Module.Sources.append(Source)\r
+        \r
+        #UserExtensions\r
+        if self.UserExtensions != '':\r
+            UserExtension = UserExtensionsClass()\r
+            Lines = self.UserExtensions.splitlines()\r
+            List = GetSplitValueList(Lines[0], DataType.TAB_SPLIT, 2)\r
+            if len(List) != 3:\r
+                ErrorMsg = "Wrong statement '%s' found in section UserExtensions in file '%s', correct format is 'UserExtensions.UserId.'Identifier''" % (Item[0:-1], self.Module.Header.FullPath) \r
+                raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+            else:\r
+                UserExtension.UserID = List[1]\r
+                UserExtension.Identifier = List[2][0:-1].replace("'", '').replace('\"', '')\r
+                for Line in Lines[1:]:\r
+                    UserExtension.Content = UserExtension.Content + CleanString(Line) + '\n'\r
+            self.Module.UserExtensions.append(UserExtension)\r
+        \r
+        #Guids\r
+        Guids = {}\r
+        for Arch in DataType.ARCH_LIST:\r
+            for Item in self.Contents[Arch].Guids:\r
+                MergeArches(Guids, Item, Arch)\r
+        for Key in Guids.keys():\r
+            Guid = GuidClass()\r
+            Guid.CName = Key\r
+            Guid.SupArchList = Guids[Key]\r
+            self.Module.Guids.append(Guid)\r
+\r
+        #Protocols\r
+        Protocols = {}\r
+        for Arch in DataType.ARCH_LIST:\r
+            for Item in self.Contents[Arch].Protocols:\r
+                MergeArches(Protocols, Item, Arch)\r
+        for Key in Protocols.keys():\r
+            Protocol = ProtocolClass()\r
+            Protocol.CName = Key\r
+            Protocol.SupArchList = Protocols[Key]\r
+            self.Module.Protocols.append(Protocol)\r
+        \r
+        #Ppis\r
+        Ppis = {}\r
+        for Arch in DataType.ARCH_LIST:\r
+            for Item in self.Contents[Arch].Ppis:\r
+                MergeArches(Ppis, Item, Arch)\r
+        for Key in Ppis.keys():\r
+            Ppi = PpiClass()\r
+            Ppi.CName = Key\r
+            Ppi.SupArchList = Ppis[Key]\r
+            self.Module.Ppis.append(Ppi)\r
+        \r
+        #Depex\r
+        Depex = {}\r
+        Defines = {}\r
+        for Arch in DataType.ARCH_LIST:\r
+            Line = ''\r
+            for Item in self.Contents[Arch].Depex:\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 Depex 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
+                    Line = Line + Item + ' '\r
+            MergeArches(Depex, Line, Arch)\r
+        for Key in Depex.keys():\r
+            Dep = ModuleDepexClass()\r
+            Dep.Depex = Key\r
+            Dep.SupArchList = Depex[Key]\r
+            Dep.Define = Defines\r
+            self.Module.Depex.append(Dep)\r
+        \r
+        #Binaries\r
+        Binaries = {}\r
+        for Arch in DataType.ARCH_LIST:\r
+            for Item in self.Contents[Arch].Binaries:\r
+                Item = Item + DataType.TAB_VALUE_SPLIT\r
+                List = GetSplitValueList(Item)\r
+                if len(List) < 4:\r
+                    ErrorMsg = "Wrong DEFINE statement '%s' found in section Binaries in file '%s', correct format is '<FileType>|<Target>|<FileName>[|<PcdFeatureFlag>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
+                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                else:\r
+                    MergeArches(Binaries, (List[0], List[1], List[2], List[3]), Arch)\r
+        for Key in Binaries.keys():\r
+            Binary = ModuleBinaryFileClass()\r
+            Binary.FileType = Key[0]\r
+            Binary.Target = Key[1]\r
+            Binary.BinaryFile = Key[2]\r
+            Binary.FeatureFlag = Key[3]\r
+            Binary.SupArchList = Binaries[Key]\r
+            self.Module.Binaries.append(Binary)\r
         \r
-                    \r
     def LoadInfFile(self, Filename):     \r
         (Filepath, Name) = os.path.split(Filename)\r
         self.Identification.FileName = Name\r
@@ -322,6 +490,9 @@ class Inf(InfObject):
                 if self.Defines.DefinesDictionary[TAB_INF_DEFINES_DESTRUCTOR][0] == '':\r
                     self.Defines.DefinesDictionary[TAB_INF_DEFINES_DESTRUCTOR] = []\r
                 continue\r
+            if tab.find(DataType.TAB_USER_EXTENSIONS.upper()) > -1:\r
+                self.UserExtensions = sect\r
+                continue\r
             for arch in DataType.ARCH_LIST_FULL + [DataType.TAB_ARCH_NULL]:\r
                 for key in self.KeyList:\r
                     if arch != DataType.TAB_ARCH_NULL:\r
@@ -397,6 +568,33 @@ class Inf(InfObject):
         print '\nPackageDependencies =', m.PackageDependencies\r
         for Item in m.PackageDependencies:\r
             print Item.FilePath, Item.SupArchList, Item.Define\r
+        print '\nNmake =', m.Nmake\r
+        for Item in m.Nmake:\r
+            print Item.Name, Item.Value, Item.SupArchList\r
+        print '\nPcds =', m.PcdCodes\r
+        for Item in m.PcdCodes:\r
+            print Item.Token, Item.TokenSpaceGuidCName, Item.DefaultValue, Item.ItemType, Item.SupArchList\r
+        print '\nSources =', m.Sources\r
+        for Source in m.Sources:\r
+            print Source.SourceFile, Source.ToolChainFamily, Source.FeatureFlag, Source.TagName, Source.ToolCode, Source.SupArchList\r
+        print '\nUserExtensions =', m.UserExtensions\r
+        for UserExtension in m.UserExtensions:\r
+            print UserExtension.UserID, UserExtension.Identifier,UserExtension.Content\r
+        print '\nGuids =', m.Guids\r
+        for Item in m.Guids:\r
+            print Item.CName, Item.SupArchList\r
+        print '\nProtocols =', m.Protocols\r
+        for Item in m.Protocols:\r
+            print Item.CName, Item.SupArchList\r
+        print '\nPpis =', m.Ppis\r
+        for Item in m.Ppis:\r
+            print Item.CName, Item.SupArchList\r
+        print '\nDepex =', m.Depex\r
+        for Item in m.Depex:\r
+            print Item.Depex, Item.SupArchList, Item.Define\r
+        print '\nBinaries =', m.Binaries\r
+        for Binary in m.Binaries:\r
+            print Binary.FileType, Binary.Target, Binary.BinaryFile, Binary.FeatureFlag\r
         \r
 if __name__ == '__main__':\r
     m = Inf()\r
index 5ed7c9c..43e9cd7 100644 (file)
@@ -20,8 +20,8 @@ import string
 # 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
+def GetSplitValueList(String, SplitTag = DataType.TAB_VALUE_SPLIT, MaxSplit = -1):\r
+    return map(lambda l: l.strip(), String.split(SplitTag, MaxSplit))\r
 \r
 #\r
 # Find a key's all arches in dict, add the new arch to the list\r
index 4340f19..fb334c7 100644 (file)
@@ -128,21 +128,28 @@ class ModuleExternCallBackClass(object):
         self.SetVirtualAddressMapCallBack = ''\r
         self.ExitBootServicesCallBack = ''\r
 \r
-class ModuleDepexClass(CommonClass):\r
+class ModuleDepexClass(CommonClass, DefineClass):\r
     def __init__(self):\r
         CommonClass.__init__(self)\r
+        DefineClass.__init__(self)\r
         self.Depex = ''\r
 \r
+class ModuleNmakeClass(CommonClass):\r
+    def __init__(self):\r
+        CommonClass.__init__(self)\r
+        self.Name = ''\r
+        self.Value = ''\r
+\r
 class ModuleClass(object):\r
     def __init__(self):\r
         self.Header = ModuleHeaderClass()\r
         self.LibraryClasses = []                    #[ LibraryClassClass, ...]\r
         self.Libraries = []                         #[ ModuleLibraryClass, ...]\r
-        self.Sources = []                           #[ ModuleSourceFilesClass, ...]\r
-        self.Binaries = []                          #[ ModuleBinaryFilesClass, ...]\r
+        self.Sources = []                           #[ ModuleSourceFileClass, ...]\r
+        self.Binaries = []                          #[ ModuleBinaryFileClass, ...]\r
         self.NonProcessedFiles = []                 #[ '', '', ...]\r
         self.PackageDependencies = []               #[ ModulePackageDependencyClass, ... ] \r
-        self.Nmake = {}                             #{ Name : Value, ... }\r
+        self.Nmake = []                             #[ ModuleNmakeClass, ... ]\r
         self.Depex = []                             #[ ModuleDepexClass, ... ]\r
         self.Includes = []                          #[ IncludeClass, ...]\r
         self.Protocols = []                         #[ ProtocolClass, ...]\r
@@ -155,7 +162,7 @@ class ModuleClass(object):
         self.DataHubs = []                          #[ ModuleDataHubClass, ...]\r
         self.HiiPackages = []                       #[ ModuleHiiPackageClass, ...]\r
         self.Guids = []                             #[ GuidClass, ...]\r
-        self.PcdCodes = []                          #[ TokenSpaceGuidCName)] : PcdClass, ...]\r
+        self.PcdCodes = []                          #[ PcdClass, ...]\r
         self.ExternImages = []                      #[ ModuleExternImageClass, ...]\r
         self.ExternLibraries = []                   #[ ModuleExternLibraryClass, ...]\r
         self.ExternDrivers = []                     #[ ModuleExternDriverClass, ...]\r