]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/AutoGen.py
BaseTools: Cleanup unneeded code
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / AutoGen.py
index 0b5b3dcf465725c26398485dd8ca26ff0fbc091c..ed0be3bc74f925bfa9072ddf3a52d2b96586d7c0 100644 (file)
@@ -50,6 +50,7 @@ import hashlib
 from GenVar import VariableMgr,var_info\r
 from collections import OrderedDict\r
 from collections import defaultdict\r
+from Workspace.WorkspaceCommon import OrderedListDict\r
 \r
 ## Regular expression for splitting Dependency Expression string into tokens\r
 gDepexTokenPattern = re.compile("(\(|\)|\w+| \S+\.inf)")\r
@@ -481,7 +482,7 @@ class WorkspaceAutoGen(AutoGen):
                             'build',\r
                             FORMAT_INVALID,\r
                             "Building modules from source INFs, following PCD use %s and %s access method. It must be corrected to use only one access method." % (i, j),\r
-                            ExtraData="%s" % '\n\t'.join(str(P[1]+'.'+P[0]) for P in Intersections)\r
+                            ExtraData='\n\t'.join(str(P[1]+'.'+P[0]) for P in Intersections)\r
                             )\r
 \r
             #\r
@@ -723,10 +724,8 @@ class WorkspaceAutoGen(AutoGen):
         #\r
         if self.FdfFile:\r
             AllWorkSpaceMetaFiles.add (self.FdfFile.Path)\r
-            if self.FdfFile:\r
-                FdfFiles = GlobalData.gFdfParser.GetAllIncludedFile()\r
-                for f in FdfFiles:\r
-                    AllWorkSpaceMetaFiles.add (f.FileName)\r
+            for f in GlobalData.gFdfParser.GetAllIncludedFile():\r
+                AllWorkSpaceMetaFiles.add (f.FileName)\r
         #\r
         # add dsc\r
         #\r
@@ -747,19 +746,16 @@ class WorkspaceAutoGen(AutoGen):
         AllWorkSpaceMetaFiles.add(os.path.join(self.BuildDir, 'PcdTokenNumber'))\r
 \r
         for Arch in self.ArchList:\r
-            Platform = self.BuildDatabase[self.MetaFile, Arch, Target, Toolchain]\r
-            PGen = PlatformAutoGen(self, self.MetaFile, Target, Toolchain, Arch)\r
-\r
             #\r
             # add dec\r
             #\r
-            for Package in PGen.PackageList:\r
+            for Package in PlatformAutoGen(self, self.MetaFile, Target, Toolchain, Arch).PackageList:\r
                 AllWorkSpaceMetaFiles.add(Package.MetaFile.Path)\r
 \r
             #\r
             # add included dsc\r
             #\r
-            for filePath in Platform._RawData.IncludedFiles:\r
+            for filePath in self.BuildDatabase[self.MetaFile, Arch, Target, Toolchain]._RawData.IncludedFiles:\r
                 AllWorkSpaceMetaFiles.add(filePath.Path)\r
 \r
         return AllWorkSpaceMetaFiles\r
@@ -890,11 +886,11 @@ class WorkspaceAutoGen(AutoGen):
 \r
 \r
     def _CheckPcdDefineAndType(self):\r
-        PcdTypeList = [\r
-            TAB_PCDS_FIXED_AT_BUILD, TAB_PCDS_PATCHABLE_IN_MODULE, TAB_PCDS_FEATURE_FLAG,\r
-            TAB_PCDS_DYNAMIC, #TAB_PCDS_DYNAMIC_HII, TAB_PCDS_DYNAMIC_VPD,\r
-            TAB_PCDS_DYNAMIC_EX, # TAB_PCDS_DYNAMIC_EX_HII, TAB_PCDS_DYNAMIC_EX_VPD\r
-        ]\r
+        PcdTypeSet = {TAB_PCDS_FIXED_AT_BUILD,\r
+            TAB_PCDS_PATCHABLE_IN_MODULE,\r
+            TAB_PCDS_FEATURE_FLAG,\r
+            TAB_PCDS_DYNAMIC,\r
+            TAB_PCDS_DYNAMIC_EX}\r
 \r
         # This dict store PCDs which are not used by any modules with specified arches\r
         UnusedPcd = OrderedDict()\r
@@ -917,7 +913,7 @@ class WorkspaceAutoGen(AutoGen):
                     # Key of DEC's Pcds dictionary is PcdCName, TokenSpaceGuid, PcdType\r
                     if (Pcd[0], Pcd[1], PcdType) in Package.Pcds:\r
                         break\r
-                    for Type in PcdTypeList:\r
+                    for Type in PcdTypeSet:\r
                         if (Pcd[0], Pcd[1], Type) in Package.Pcds:\r
                             EdkLogger.error(\r
                                 'build',\r
@@ -1075,9 +1071,10 @@ class WorkspaceAutoGen(AutoGen):
     #                                       modules will be created as well\r
     #\r
     def CreateMakeFile(self, CreateDepsMakeFile=False):\r
-        if CreateDepsMakeFile:\r
-            for Pa in self.AutoGenObjectList:\r
-                Pa.CreateMakeFile(CreateDepsMakeFile)\r
+        if not CreateDepsMakeFile:\r
+            return\r
+        for Pa in self.AutoGenObjectList:\r
+            Pa.CreateMakeFile(True)\r
 \r
     ## Create autogen code for platform and modules\r
     #\r
@@ -1091,7 +1088,7 @@ class WorkspaceAutoGen(AutoGen):
         if not CreateDepsCodeFile:\r
             return\r
         for Pa in self.AutoGenObjectList:\r
-            Pa.CreateCodeFile(CreateDepsCodeFile)\r
+            Pa.CreateCodeFile(True)\r
 \r
     ## Create AsBuilt INF file the platform\r
     #\r
@@ -1396,11 +1393,7 @@ class PlatformAutoGen(AutoGen):
                             del self.Platform.Pcds[key]\r
                             self.Platform.Pcds[newkey] = Value\r
                             break\r
-                        else:\r
-                            pass\r
                     break\r
-                else:\r
-                    pass\r
 \r
         # for gathering error information\r
         NoDatumTypePcdList = set()\r
@@ -1585,8 +1578,7 @@ class PlatformAutoGen(AutoGen):
                         PcdNvStoreDfBuffer.SkuInfoList[skuname].DefaultValue = vardump\r
                         PcdNvStoreDfBuffer.MaxDatumSize = str(len(vardump.split(",")))\r
 \r
-            PlatformPcds = self._PlatformPcds.keys()\r
-            PlatformPcds.sort()\r
+            PlatformPcds = sorted(self._PlatformPcds.keys())\r
             #\r
             # Add VPD type PCD into VpdFile and determine whether the VPD PCD need to be fixed up.\r
             #\r
@@ -1892,7 +1884,7 @@ class PlatformAutoGen(AutoGen):
                         if Flags.startswith('='):\r
                             self._BuildCommand = [self._BuildCommand[0]] + [Flags[1:]]\r
                         else:\r
-                            self._BuildCommand += [Flags]\r
+                            self._BuildCommand.append(Flags)\r
         return self._BuildCommand\r
 \r
     ## Get tool chain definition\r
@@ -2087,32 +2079,28 @@ class PlatformAutoGen(AutoGen):
             # TokeNumber 11 ~ 20\r
             #\r
             for Pcd in self.DynamicPcdList:\r
-                if Pcd.Phase == "PEI":\r
-                    if Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
-                        EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
-                        self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
-                        TokenNumber += 1\r
+                if Pcd.Phase == "PEI" and Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
+                    EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
+                    self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
+                    TokenNumber += 1\r
 \r
             for Pcd in self.DynamicPcdList:\r
-                if Pcd.Phase == "PEI":\r
-                    if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
-                        EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
-                        self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
-                        TokenNumber += 1\r
+                if Pcd.Phase == "PEI" and Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
+                    EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
+                    self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
+                    TokenNumber += 1\r
 \r
             for Pcd in self.DynamicPcdList:\r
-                if Pcd.Phase == "DXE":\r
-                    if Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
-                        EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
-                        self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
-                        TokenNumber += 1\r
+                if Pcd.Phase == "DXE" and Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
+                    EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
+                    self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
+                    TokenNumber += 1\r
 \r
             for Pcd in self.DynamicPcdList:\r
-                if Pcd.Phase == "DXE":\r
-                    if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
-                        EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
-                        self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
-                        TokenNumber += 1\r
+                if Pcd.Phase == "DXE" and Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
+                    EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
+                    self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
+                    TokenNumber += 1\r
 \r
             for Pcd in self.NonDynamicPcdList:\r
                 self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
@@ -2203,8 +2191,8 @@ class PlatformAutoGen(AutoGen):
         if FromPcd is not None:\r
             if ToPcd.Pending and FromPcd.Type:\r
                 ToPcd.Type = FromPcd.Type\r
-            elif (ToPcd.Type) and (FromPcd.Type)\\r
-                and (ToPcd.Type != FromPcd.Type) and (ToPcd.Type in FromPcd.Type):\r
+            elif ToPcd.Type and FromPcd.Type\\r
+                and ToPcd.Type != FromPcd.Type and ToPcd.Type in FromPcd.Type:\r
                 if ToPcd.Type.strip() == TAB_PCDS_DYNAMIC_EX:\r
                     ToPcd.Type = FromPcd.Type\r
             elif ToPcd.Type and FromPcd.Type \\r
@@ -2417,13 +2405,14 @@ class PlatformAutoGen(AutoGen):
             if (Key[0] == self.BuildRuleFamily and\r
                 (ModuleStyle is None or len(Key) < 3 or (len(Key) > 2 and Key[2] == ModuleStyle))):\r
                 Target, ToolChain, Arch, CommandType, Attr = Key[1].split('_')\r
-                if Target == self.BuildTarget or Target == "*":\r
-                    if ToolChain == self.ToolChain or ToolChain == "*":\r
-                        if Arch == self.Arch or Arch == "*":\r
-                            if Options[Key].startswith("="):\r
-                                if OverrideList.get(Key[1]) is not None:\r
-                                    OverrideList.pop(Key[1])\r
-                                OverrideList[Key[1]] = Options[Key]\r
+                if (Target == self.BuildTarget or Target == "*") and\\r
+                    (ToolChain == self.ToolChain or ToolChain == "*") and\\r
+                    (Arch == self.Arch or Arch == "*") and\\r
+                    Options[Key].startswith("="):\r
+\r
+                    if OverrideList.get(Key[1]) is not None:\r
+                        OverrideList.pop(Key[1])\r
+                    OverrideList[Key[1]] = Options[Key]\r
         \r
         #\r
         # Use the highest priority value. \r
@@ -2439,17 +2428,18 @@ class PlatformAutoGen(AutoGen):
                     # Compare two Key, if one is included by another, choose the higher priority one\r
                     #                    \r
                     Target2, ToolChain2, Arch2, CommandType2, Attr2 = NextKey.split("_")\r
-                    if Target1 == Target2 or Target1 == "*" or Target2 == "*":\r
-                        if ToolChain1 == ToolChain2 or ToolChain1 == "*" or ToolChain2 == "*":\r
-                            if Arch1 == Arch2 or Arch1 == "*" or Arch2 == "*":\r
-                                if CommandType1 == CommandType2 or CommandType1 == "*" or CommandType2 == "*":\r
-                                    if Attr1 == Attr2 or Attr1 == "*" or Attr2 == "*":\r
-                                        if self.CalculatePriorityValue(NowKey) > self.CalculatePriorityValue(NextKey):\r
-                                            if Options.get((self.BuildRuleFamily, NextKey)) is not None:\r
-                                                Options.pop((self.BuildRuleFamily, NextKey))\r
-                                        else:\r
-                                            if Options.get((self.BuildRuleFamily, NowKey)) is not None:\r
-                                                Options.pop((self.BuildRuleFamily, NowKey))\r
+                    if (Target1 == Target2 or Target1 == "*" or Target2 == "*") and\\r
+                        (ToolChain1 == ToolChain2 or ToolChain1 == "*" or ToolChain2 == "*") and\\r
+                        (Arch1 == Arch2 or Arch1 == "*" or Arch2 == "*") and\\r
+                        (CommandType1 == CommandType2 or CommandType1 == "*" or CommandType2 == "*") and\\r
+                        (Attr1 == Attr2 or Attr1 == "*" or Attr2 == "*"):\r
+\r
+                        if self.CalculatePriorityValue(NowKey) > self.CalculatePriorityValue(NextKey):\r
+                            if Options.get((self.BuildRuleFamily, NextKey)) is not None:\r
+                                Options.pop((self.BuildRuleFamily, NextKey))\r
+                        else:\r
+                            if Options.get((self.BuildRuleFamily, NowKey)) is not None:\r
+                                Options.pop((self.BuildRuleFamily, NowKey))\r
                                                            \r
         for Key in Options:\r
             if ModuleStyle is not None and len (Key) > 2:\r
@@ -2611,6 +2601,15 @@ class PlatformAutoGen(AutoGen):
     LibraryAutoGenList  = property(_GetLibraryAutoGenList)\r
     GenFdsCommand       = property(_GenFdsCommand)\r
 \r
+#\r
+# extend lists contained in a dictionary with lists stored in another dictionary\r
+# if CopyToDict is not derived from DefaultDict(list) then this may raise exception\r
+#\r
+def ExtendCopyDictionaryLists(CopyToDict, CopyFromDict):\r
+    for Key in CopyFromDict:\r
+        CopyToDict[Key].extend(CopyFromDict[Key])\r
+\r
+\r
 ## ModuleAutoGen class\r
 #\r
 # This class encapsules the AutoGen behaviors for the build tools. In addition to\r
@@ -2701,7 +2700,6 @@ class ModuleAutoGen(AutoGen):
         self._MakeFileDir     = None\r
 \r
         self._IncludePathList = None\r
-        self._IncludePathLength = 0\r
         self._AutoGenFileList = None\r
         self._UnicodeFileList = None\r
         self._VfrFileList = None\r
@@ -2716,16 +2714,16 @@ class ModuleAutoGen(AutoGen):
         self._DerivedPackageList      = None\r
         self._ModulePcdList           = None\r
         self._LibraryPcdList          = None\r
-        self._PcdComments = OrderedDict()\r
+        self._PcdComments = OrderedListDict()\r
         self._GuidList                = None\r
         self._GuidsUsedByPcd = None\r
-        self._GuidComments = OrderedDict()\r
+        self._GuidComments = OrderedListDict()\r
         self._ProtocolList            = None\r
-        self._ProtocolComments = OrderedDict()\r
+        self._ProtocolComments = OrderedListDict()\r
         self._PpiList                 = None\r
-        self._PpiComments = OrderedDict()\r
-        self._DepexList               = None\r
-        self._DepexExpressionList     = None\r
+        self._PpiComments = OrderedListDict()\r
+        self._DepexDict               = None\r
+        self._DepexExpressionDict     = None\r
         self._BuildOption             = None\r
         self._BuildOptionIncPathList  = None\r
         self._BuildTargets            = None\r
@@ -2747,7 +2745,6 @@ class ModuleAutoGen(AutoGen):
         #  \r
         self._FixedAtBuildPcds         = []\r
         self.ConstPcd                  = {}\r
-        return True\r
 \r
     def __repr__(self):\r
         return "%s [%s]" % (self.MetaFile, self.Arch)\r
@@ -2875,10 +2872,7 @@ class ModuleAutoGen(AutoGen):
     ## Check if the module is library or not\r
     def _IsLibrary(self):\r
         if self._LibraryFlag is None:\r
-            if self.Module.LibraryClass is not None and self.Module.LibraryClass != []:\r
-                self._LibraryFlag = True\r
-            else:\r
-                self._LibraryFlag = False\r
+            self._LibraryFlag = True if self.Module.LibraryClass else False\r
         return self._LibraryFlag\r
 \r
     ## Check if the module is binary module or not\r
@@ -3030,15 +3024,15 @@ class ModuleAutoGen(AutoGen):
     #   @retval     list    The token list of the dependency expression after parsed\r
     #\r
     def _GetDepexTokenList(self):\r
-        if self._DepexList is None:\r
-            self._DepexList = {}\r
+        if self._DepexDict is None:\r
+            self._DepexDict = {}\r
             if self.DxsFile or self.IsLibrary or TAB_DEPENDENCY_EXPRESSION_FILE in self.FileTypes:\r
-                return self._DepexList\r
+                return self._DepexDict\r
 \r
-            self._DepexList[self.ModuleType] = []\r
+            self._DepexDict[self.ModuleType] = []\r
 \r
-            for ModuleType in self._DepexList:\r
-                DepexList = self._DepexList[ModuleType]\r
+            for ModuleType in self._DepexDict:\r
+                DepexList = self._DepexDict[ModuleType]\r
                 #\r
                 # Append depex from dependent libraries, if not "BEFORE", "AFTER" expresion\r
                 #\r
@@ -3059,43 +3053,43 @@ class ModuleAutoGen(AutoGen):
                         break\r
                 if len(DepexList) > 0:\r
                     EdkLogger.verbose('')\r
-        return self._DepexList\r
+        return self._DepexDict\r
 \r
     ## Merge dependency expression\r
     #\r
     #   @retval     list    The token list of the dependency expression after parsed\r
     #\r
     def _GetDepexExpressionTokenList(self):\r
-        if self._DepexExpressionList is None:\r
-            self._DepexExpressionList = {}\r
+        if self._DepexExpressionDict is None:\r
+            self._DepexExpressionDict = {}\r
             if self.DxsFile or self.IsLibrary or TAB_DEPENDENCY_EXPRESSION_FILE in self.FileTypes:\r
-                return self._DepexExpressionList\r
+                return self._DepexExpressionDict\r
 \r
-            self._DepexExpressionList[self.ModuleType] = ''\r
+            self._DepexExpressionDict[self.ModuleType] = ''\r
 \r
-            for ModuleType in self._DepexExpressionList:\r
-                DepexExpressionList = self._DepexExpressionList[ModuleType]\r
+            for ModuleType in self._DepexExpressionDict:\r
+                DepexExpressionString = self._DepexExpressionDict[ModuleType]\r
                 #\r
                 # Append depex from dependent libraries, if not "BEFORE", "AFTER" expresion\r
                 #\r
                 for M in [self.Module] + self.DependentLibraryList:\r
                     Inherited = False\r
                     for D in M.DepexExpression[self.Arch, ModuleType]:\r
-                        if DepexExpressionList != '':\r
-                            DepexExpressionList += ' AND '\r
-                        DepexExpressionList += '('\r
-                        DepexExpressionList += D\r
-                        DepexExpressionList = DepexExpressionList.rstrip('END').strip()\r
-                        DepexExpressionList += ')'\r
+                        if DepexExpressionString != '':\r
+                            DepexExpressionString += ' AND '\r
+                        DepexExpressionString += '('\r
+                        DepexExpressionString += D\r
+                        DepexExpressionString = DepexExpressionString.rstrip('END').strip()\r
+                        DepexExpressionString += ')'\r
                         Inherited = True\r
                     if Inherited:\r
-                        EdkLogger.verbose("DEPEX[%s] (+%s) = %s" % (self.Name, M.BaseName, DepexExpressionList))\r
-                    if 'BEFORE' in DepexExpressionList or 'AFTER' in DepexExpressionList:\r
+                        EdkLogger.verbose("DEPEX[%s] (+%s) = %s" % (self.Name, M.BaseName, DepexExpressionString))\r
+                    if 'BEFORE' in DepexExpressionString or 'AFTER' in DepexExpressionString:\r
                         break\r
-                if len(DepexExpressionList) > 0:\r
+                if len(DepexExpressionString) > 0:\r
                     EdkLogger.verbose('')\r
-                self._DepexExpressionList[ModuleType] = DepexExpressionList\r
-        return self._DepexExpressionList\r
+                self._DepexExpressionDict[ModuleType] = DepexExpressionString\r
+        return self._DepexExpressionDict\r
 \r
     # Get the tiano core user extension, it is contain dependent library.\r
     # @retval: a list contain tiano core userextension.\r
@@ -3163,9 +3157,8 @@ class ModuleAutoGen(AutoGen):
             \r
             BuildOptionIncPathList = []\r
             for Tool in ('CC', 'PP', 'VFRPP', 'ASLPP', 'ASLCC', 'APP', 'ASM'):\r
-                Attr = 'FLAGS'\r
                 try:\r
-                    FlagOption = self.BuildOption[Tool][Attr]\r
+                    FlagOption = self.BuildOption[Tool]['FLAGS']\r
                 except KeyError:\r
                     FlagOption = ''\r
                 \r
@@ -3178,13 +3171,13 @@ class ModuleAutoGen(AutoGen):
                     IncPathList = []\r
                     for Path in BuildOptIncludeRegEx.findall(FlagOption):\r
                         PathList = GetSplitList(Path, TAB_COMMA_SPLIT)\r
-                        IncPathList += [NormPath(PathEntry, self.Macros) for PathEntry in PathList]\r
+                        IncPathList.extend(NormPath(PathEntry, self.Macros) for PathEntry in PathList)\r
 \r
                 #\r
                 # EDK II modules must not reference header files outside of the packages they depend on or \r
                 # within the module's directory tree. Report error if violation.\r
                 #\r
-                if self.AutoGenVersion >= 0x00010005 and len(IncPathList) > 0:\r
+                if self.AutoGenVersion >= 0x00010005:\r
                     for Path in IncPathList:\r
                         if (Path not in self.IncludePathList) and (CommonPath([Path, self.MetaFile.Dir]) != self.MetaFile.Dir):\r
                             ErrMsg = "The include directory for the EDK II module in this line is invalid %s specified in %s FLAGS '%s'" % (Path, Tool, FlagOption)\r
@@ -3338,7 +3331,7 @@ class ModuleAutoGen(AutoGen):
         if not os.path.exists(SubDirectory):\r
             CreateDirectory(SubDirectory)\r
         LastTarget = None\r
-        RuleChain = []\r
+        RuleChain = set()\r
         SourceList = [File]\r
         Index = 0\r
         #\r
@@ -3395,7 +3388,7 @@ class ModuleAutoGen(AutoGen):
             if FileType in RuleChain:\r
                 break\r
 \r
-            RuleChain.append(FileType)\r
+            RuleChain.add(FileType)\r
             SourceList.extend(Target.Outputs)\r
             LastTarget = Target\r
             FileType = TAB_UNKNOWN_FILE\r
@@ -3504,12 +3497,6 @@ class ModuleAutoGen(AutoGen):
                     self._DependentLibraryList = self.PlatformInfo.ApplyLibraryInstance(self.Module)\r
         return self._DependentLibraryList\r
 \r
-    @staticmethod\r
-    def UpdateComments(Recver, Src):\r
-        for Key in Src:\r
-            if Key not in Recver:\r
-                Recver[Key] = []\r
-            Recver[Key].extend(Src[Key])\r
     ## Get the list of PCDs from current module\r
     #\r
     #   @retval     list                    The list of PCD\r
@@ -3518,7 +3505,7 @@ class ModuleAutoGen(AutoGen):
         if self._ModulePcdList is None:\r
             # apply PCD settings from platform\r
             self._ModulePcdList = self.PlatformInfo.ApplyPcdSetting(self.Module, self.Module.Pcds)\r
-            self.UpdateComments(self._PcdComments, self.Module.PcdComments)\r
+            ExtendCopyDictionaryLists(self._PcdComments, self.Module.PcdComments)\r
         return self._ModulePcdList\r
 \r
     ## Get the list of PCDs from dependent libraries\r
@@ -3533,7 +3520,7 @@ class ModuleAutoGen(AutoGen):
                 self._LibraryPcdList = []\r
                 for Library in self.DependentLibraryList:\r
                     PcdsInLibrary = OrderedDict()\r
-                    self.UpdateComments(self._PcdComments, Library.PcdComments)\r
+                    ExtendCopyDictionaryLists(self._PcdComments, Library.PcdComments)\r
                     for Key in Library.Pcds:\r
                         # skip duplicated PCDs\r
                         if Key in self.Module.Pcds or Key in Pcds:\r
@@ -3555,8 +3542,8 @@ class ModuleAutoGen(AutoGen):
             self._GuidList.update(self.Module.Guids)\r
             for Library in self.DependentLibraryList:\r
                 self._GuidList.update(Library.Guids)\r
-                self.UpdateComments(self._GuidComments, Library.GuidComments)\r
-            self.UpdateComments(self._GuidComments, self.Module.GuidComments)\r
+                ExtendCopyDictionaryLists(self._GuidComments, Library.GuidComments)\r
+            ExtendCopyDictionaryLists(self._GuidComments, self.Module.GuidComments)\r
         return self._GuidList\r
 \r
     def GetGuidsUsedByPcd(self):\r
@@ -3576,8 +3563,8 @@ class ModuleAutoGen(AutoGen):
             self._ProtocolList.update(self.Module.Protocols)\r
             for Library in self.DependentLibraryList:\r
                 self._ProtocolList.update(Library.Protocols)\r
-                self.UpdateComments(self._ProtocolComments, Library.ProtocolComments)\r
-            self.UpdateComments(self._ProtocolComments, self.Module.ProtocolComments)\r
+                ExtendCopyDictionaryLists(self._ProtocolComments, Library.ProtocolComments)\r
+            ExtendCopyDictionaryLists(self._ProtocolComments, self.Module.ProtocolComments)\r
         return self._ProtocolList\r
 \r
     ## Get the PPI value mapping\r
@@ -3590,8 +3577,8 @@ class ModuleAutoGen(AutoGen):
             self._PpiList.update(self.Module.Ppis)\r
             for Library in self.DependentLibraryList:\r
                 self._PpiList.update(Library.Ppis)\r
-                self.UpdateComments(self._PpiComments, Library.PpiComments)\r
-            self.UpdateComments(self._PpiComments, self.Module.PpiComments)\r
+                ExtendCopyDictionaryLists(self._PpiComments, Library.PpiComments)\r
+            ExtendCopyDictionaryLists(self._PpiComments, self.Module.PpiComments)\r
         return self._PpiList\r
 \r
     ## Get the list of include search path\r
@@ -3629,11 +3616,7 @@ class ModuleAutoGen(AutoGen):
         return self._IncludePathList\r
 \r
     def _GetIncludePathLength(self):\r
-        self._IncludePathLength = 0\r
-        if self._IncludePathList:\r
-            for inc in self._IncludePathList:\r
-                self._IncludePathLength += len(' ' + inc)\r
-        return self._IncludePathLength\r
+        return sum(len(inc)+1 for inc in self._IncludePathList)\r
 \r
     ## Get HII EX PCDs which maybe used by VFR\r
     #\r
@@ -3687,12 +3670,11 @@ class ModuleAutoGen(AutoGen):
         for Pcd in self.PlatformInfo.Platform.Pcds.values():\r
             if Pcd.Type != TAB_PCDS_DYNAMIC_EX_HII:\r
                 continue\r
-            for SkuName in Pcd.SkuInfoList:\r
-                SkuInfo = Pcd.SkuInfoList[SkuName]\r
-                Name = ConvertStringToByteArray(SkuInfo.VariableName)\r
+            for SkuInfo in Pcd.SkuInfoList.values():\r
                 Value = GuidValue(SkuInfo.VariableGuid, self.PlatformInfo.PackageList, self.MetaFile.Path)\r
                 if not Value:\r
                     continue\r
+                Name = ConvertStringToByteArray(SkuInfo.VariableName)\r
                 Guid = GuidStructureStringToGuidString(Value)\r
                 if (Name, Guid) in NameGuids and Pcd not in HiiExPcds:\r
                     HiiExPcds.append(Pcd)\r
@@ -3708,13 +3690,13 @@ class ModuleAutoGen(AutoGen):
                 # search the .map file to find the offset of vfr binary in the PE32+/TE file. \r
                 #\r
                 VfrUniBaseName[SourceFile.BaseName] = (SourceFile.BaseName + "Bin")\r
-            if SourceFile.Type.upper() == ".UNI" :\r
+            elif SourceFile.Type.upper() == ".UNI" :\r
                 #\r
                 # search the .map file to find the offset of Uni strings binary in the PE32+/TE file. \r
                 #\r
                 VfrUniBaseName["UniOffsetName"] = (self.Name + "Strings")\r
 \r
-        if len(VfrUniBaseName) == 0:\r
+        if not VfrUniBaseName:\r
             return None\r
         MapFileName = os.path.join(self.OutputDir, self.Name + ".map")\r
         EfiFileName = os.path.join(self.OutputDir, self.Name + ".efi")\r
@@ -3773,10 +3755,9 @@ class ModuleAutoGen(AutoGen):
     #\r
     def CreateAsBuiltInf(self, IsOnlyCopy = False):\r
         self.OutputFile = set()\r
-        if IsOnlyCopy:\r
-            if GlobalData.gBinCacheDest:\r
-                self.CopyModuleToCache()\r
-                return\r
+        if IsOnlyCopy and GlobalData.gBinCacheDest:\r
+            self.CopyModuleToCache()\r
+            return\r
 \r
         if self.IsAsBuiltInfCreated:\r
             return\r
@@ -3808,11 +3789,11 @@ class ModuleAutoGen(AutoGen):
         PcdTokenSpaceList = []\r
         for Pcd in self.ModulePcdList + self.LibraryPcdList:\r
             if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
-                PatchablePcds += [Pcd]\r
+                PatchablePcds.append(Pcd)\r
                 PcdCheckList.append((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, TAB_PCDS_PATCHABLE_IN_MODULE))\r
             elif Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
                 if Pcd not in Pcds:\r
-                    Pcds += [Pcd]\r
+                    Pcds.append(Pcd)\r
                     PcdCheckList.append((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, TAB_PCDS_DYNAMIC_EX))\r
                     PcdCheckList.append((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, TAB_PCDS_DYNAMIC))\r
                     PcdTokenSpaceList.append(Pcd.TokenSpaceGuidCName)\r
@@ -3832,10 +3813,11 @@ class ModuleAutoGen(AutoGen):
             for Index in range(len(BeChecked)):\r
                 for Item in CheckList[Index]:\r
                     if Item in BeChecked[Index]:\r
-                        Packages += [Package]\r
+                        Packages.append(Package)\r
                         Found = True\r
                         break\r
-                if Found: break\r
+                if Found:\r
+                    break\r
 \r
         VfrPcds = self._GetPcdsMaybeUsedByVfr()\r
         for Pkg in self.PlatformInfo.PackageList:\r
@@ -3844,17 +3826,11 @@ class ModuleAutoGen(AutoGen):
             for VfrPcd in VfrPcds:\r
                 if ((VfrPcd.TokenCName, VfrPcd.TokenSpaceGuidCName, TAB_PCDS_DYNAMIC_EX) in Pkg.Pcds or\r
                     (VfrPcd.TokenCName, VfrPcd.TokenSpaceGuidCName, TAB_PCDS_DYNAMIC) in Pkg.Pcds):\r
-                    Packages += [Pkg]\r
+                    Packages.append(Pkg)\r
                     break\r
 \r
-        ModuleType = self.ModuleType\r
-        if ModuleType == SUP_MODULE_UEFI_DRIVER and self.DepexGenerated:\r
-            ModuleType = SUP_MODULE_DXE_DRIVER\r
-\r
-        DriverType = ''\r
-        if self.PcdIsDriver != '':\r
-            DriverType = self.PcdIsDriver\r
-\r
+        ModuleType = SUP_MODULE_DXE_DRIVER if self.ModuleType == SUP_MODULE_UEFI_DRIVER and self.DepexGenerated else self.ModuleType\r
+        DriverType = self.PcdIsDriver if self.PcdIsDriver else ''\r
         Guid = self.Guid\r
         MDefs = self.Module.Defines\r
 \r
@@ -3880,7 +3856,7 @@ class ModuleAutoGen(AutoGen):
           'module_uefi_hii_resource_section'  : [MDefs['UEFI_HII_RESOURCE_SECTION']] if 'UEFI_HII_RESOURCE_SECTION' in MDefs else [],\r
           'module_uni_file'                   : [MDefs['MODULE_UNI_FILE']] if 'MODULE_UNI_FILE' in MDefs else [],\r
           'module_arch'                       : self.Arch,\r
-          'package_item'                      : ['%s' % (Package.MetaFile.File.replace('\\', '/')) for Package in Packages],\r
+          'package_item'                      : [Package.MetaFile.File.replace('\\', '/') for Package in Packages],\r
           'binary_item'                       : [],\r
           'patchablepcd_item'                 : [],\r
           'pcd_item'                          : [],\r
@@ -3902,12 +3878,12 @@ class ModuleAutoGen(AutoGen):
             AsBuiltInfDict['module_inf_version'] = gInfSpecVersion\r
 \r
         if DriverType:\r
-            AsBuiltInfDict['pcd_is_driver_string'] += [DriverType]\r
+            AsBuiltInfDict['pcd_is_driver_string'].append(DriverType)\r
 \r
         if 'UEFI_SPECIFICATION_VERSION' in self.Specification:\r
-            AsBuiltInfDict['module_uefi_specification_version'] += [self.Specification['UEFI_SPECIFICATION_VERSION']]\r
+            AsBuiltInfDict['module_uefi_specification_version'].append(self.Specification['UEFI_SPECIFICATION_VERSION'])\r
         if 'PI_SPECIFICATION_VERSION' in self.Specification:\r
-            AsBuiltInfDict['module_pi_specification_version'] += [self.Specification['PI_SPECIFICATION_VERSION']]\r
+            AsBuiltInfDict['module_pi_specification_version'].append(self.Specification['PI_SPECIFICATION_VERSION'])\r
 \r
         OutputDir = self.OutputDir.replace('\\', '/').strip('/')\r
         DebugDir = self.DebugDir.replace('\\', '/').strip('/')\r
@@ -3917,31 +3893,31 @@ class ModuleAutoGen(AutoGen):
             if os.path.isabs(File):\r
                 File = File.replace('\\', '/').strip('/').replace(OutputDir, '').strip('/')\r
             if Item.Target.Ext.lower() == '.aml':\r
-                AsBuiltInfDict['binary_item'] += ['ASL|' + File]\r
+                AsBuiltInfDict['binary_item'].append('ASL|' + File)\r
             elif Item.Target.Ext.lower() == '.acpi':\r
-                AsBuiltInfDict['binary_item'] += ['ACPI|' + File]\r
+                AsBuiltInfDict['binary_item'].append('ACPI|' + File)\r
             elif Item.Target.Ext.lower() == '.efi':\r
-                AsBuiltInfDict['binary_item'] += ['PE32|' + self.Name + '.efi']\r
+                AsBuiltInfDict['binary_item'].append('PE32|' + self.Name + '.efi')\r
             else:\r
-                AsBuiltInfDict['binary_item'] += ['BIN|' + File]\r
+                AsBuiltInfDict['binary_item'].append('BIN|' + File)\r
         if self.DepexGenerated:\r
             self.OutputFile.add(self.Name + '.depex')\r
             if self.ModuleType in [SUP_MODULE_PEIM]:\r
-                AsBuiltInfDict['binary_item'] += ['PEI_DEPEX|' + self.Name + '.depex']\r
-            if self.ModuleType in [SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER]:\r
-                AsBuiltInfDict['binary_item'] += ['DXE_DEPEX|' + self.Name + '.depex']\r
-            if self.ModuleType in [SUP_MODULE_DXE_SMM_DRIVER]:\r
-                AsBuiltInfDict['binary_item'] += ['SMM_DEPEX|' + self.Name + '.depex']\r
+                AsBuiltInfDict['binary_item'].append('PEI_DEPEX|' + self.Name + '.depex')\r
+            elif self.ModuleType in [SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER]:\r
+                AsBuiltInfDict['binary_item'].append('DXE_DEPEX|' + self.Name + '.depex')\r
+            elif self.ModuleType in [SUP_MODULE_DXE_SMM_DRIVER]:\r
+                AsBuiltInfDict['binary_item'].append('SMM_DEPEX|' + self.Name + '.depex')\r
 \r
         Bin = self._GenOffsetBin()\r
         if Bin:\r
-            AsBuiltInfDict['binary_item'] += ['BIN|%s' % Bin]\r
+            AsBuiltInfDict['binary_item'].append('BIN|%s' % Bin)\r
             self.OutputFile.add(Bin)\r
 \r
         for Root, Dirs, Files in os.walk(OutputDir):\r
             for File in Files:\r
                 if File.lower().endswith('.pdb'):\r
-                    AsBuiltInfDict['binary_item'] += ['DISPOSABLE|' + File]\r
+                    AsBuiltInfDict['binary_item'].append('DISPOSABLE|' + File)\r
                     self.OutputFile.add(File)\r
         HeaderComments = self.Module.HeaderComments\r
         StartPos = 0\r
@@ -3960,12 +3936,8 @@ class ModuleAutoGen(AutoGen):
         ]\r
         for Item in GenList:\r
             for CName in Item[0]:\r
-                Comments = ''\r
-                if CName in Item[1]:\r
-                    Comments = '\n  '.join(Item[1][CName])\r
-                Entry = CName\r
-                if Comments:\r
-                    Entry = Comments + '\n  ' + CName\r
+                Comments = '\n  '.join(Item[1][CName]) if CName in Item[1] else ''\r
+                Entry = Comments + '\n  ' + CName if Comments else CName\r
                 AsBuiltInfDict[Item[2]].append(Entry)\r
         PatchList = parsePcdInfoFromMapFile(\r
                             os.path.join(self.OutputDir, self.Name + '.map'),\r
@@ -4056,7 +4028,6 @@ class ModuleAutoGen(AutoGen):
 \r
         HiiPcds = set()\r
         for Pcd in Pcds + VfrPcds:\r
-            PcdComments = ''\r
             PcdCommentList = []\r
             HiiInfo = ''\r
             SkuId = ''\r
@@ -4097,14 +4068,14 @@ class ModuleAutoGen(AutoGen):
             PcdEntry = Pcd.TokenSpaceGuidCName + '.' + TokenCName\r
             if PcdComments:\r
                 PcdEntry = PcdComments + '\n  ' + PcdEntry\r
-            AsBuiltInfDict['pcd_item'] += [PcdEntry]\r
+            AsBuiltInfDict['pcd_item'].append(PcdEntry)\r
         for Item in self.BuildOption:\r
             if 'FLAGS' in self.BuildOption[Item]:\r
-                AsBuiltInfDict['flags_item'] += ['%s:%s_%s_%s_%s_FLAGS = %s' % (self.ToolChainFamily, self.BuildTarget, self.ToolChain, self.Arch, Item, self.BuildOption[Item]['FLAGS'].strip())]\r
+                AsBuiltInfDict['flags_item'].append('%s:%s_%s_%s_%s_FLAGS = %s' % (self.ToolChainFamily, self.BuildTarget, self.ToolChain, self.Arch, Item, self.BuildOption[Item]['FLAGS'].strip()))\r
 \r
         # Generated LibraryClasses section in comments.\r
         for Library in self.LibraryAutoGenList:\r
-            AsBuiltInfDict['libraryclasses_item'] += [Library.MetaFile.File.replace('\\', '/')]\r
+            AsBuiltInfDict['libraryclasses_item'].append(Library.MetaFile.File.replace('\\', '/'))\r
         \r
         # Generated UserExtensions TianoCore section.\r
         # All tianocore user extensions are copied.\r
@@ -4117,10 +4088,8 @@ class ModuleAutoGen(AutoGen):
         AsBuiltInfDict['userextension_tianocore_item'] = UserExtStr\r
 \r
         # Generated depex expression section in comments.\r
-        AsBuiltInfDict['depexsection_item'] = ''\r
         DepexExpresion = self._GetDepexExpresionString()\r
-        if DepexExpresion:\r
-            AsBuiltInfDict['depexsection_item'] = DepexExpresion\r
+        AsBuiltInfDict['depexsection_item'] = DepexExpresion if DepexExpresion else ''\r
         \r
         AsBuiltInf = TemplateString()\r
         AsBuiltInf.Append(gAsBuiltInfHeaderString.Replace(AsBuiltInfDict))\r
@@ -4339,8 +4308,7 @@ class ModuleAutoGen(AutoGen):
         if self.Name not in GlobalData.gModuleHash[self.Arch]:\r
             GlobalData.gModuleHash[self.Arch][self.Name] = m.hexdigest()\r
         if GlobalData.gBinCacheSource:\r
-            CacheValid = self.AttemptModuleCacheCopy()\r
-            if CacheValid:\r
+            if self.AttemptModuleCacheCopy():\r
                 return False\r
         return SaveFileOnChange(ModuleHashFile, m.hexdigest(), True)\r
 \r
@@ -4379,9 +4347,7 @@ class ModuleAutoGen(AutoGen):
         return self._TimeStampPath\r
     def CreateTimeStamp(self, Makefile):\r
 \r
-        FileSet = set()\r
-\r
-        FileSet.add (self.MetaFile.Path)\r
+        FileSet = {self.MetaFile.Path}\r
 \r
         for SourceFile in self.Module.Sources:\r
             FileSet.add (SourceFile.Path)\r
@@ -4445,7 +4411,7 @@ class ModuleAutoGen(AutoGen):
     PpiList                 = property(_GetPpiList)\r
     DepexList               = property(_GetDepexTokenList)\r
     DxsFile                 = property(_GetDxsFile)\r
-    DepexExpressionList     = property(_GetDepexExpressionTokenList)\r
+    DepexExpressionDict     = property(_GetDepexExpressionTokenList)\r
     BuildOption             = property(_GetModuleBuildOption)\r
     BuildOptionIncPathList  = property(_GetBuildOptionIncPathList)\r
     BuildCommand            = property(_GetBuildCommand)\r