]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Common/Misc.py
BaseTools: remove unused import thread
[mirror_edk2.git] / BaseTools / Source / Python / Common / Misc.py
index d80f645d2edd933136c25b7d1f0bbe350ea7a7a9..fd948c727a4f9b7a09360529f38533d3243f8654 100644 (file)
 ##\r
 # Import Modules\r
 #\r
 ##\r
 # Import Modules\r
 #\r
+from __future__ import absolute_import\r
 import Common.LongFilePathOs as os\r
 import sys\r
 import string\r
 import Common.LongFilePathOs as os\r
 import sys\r
 import string\r
-import thread\r
 import threading\r
 import time\r
 import re\r
 import threading\r
 import time\r
 import re\r
@@ -30,10 +30,10 @@ from UserList import UserList
 \r
 from Common import EdkLogger as EdkLogger\r
 from Common import GlobalData as GlobalData\r
 \r
 from Common import EdkLogger as EdkLogger\r
 from Common import GlobalData as GlobalData\r
-from DataType import *\r
-from BuildToolError import *\r
+from .DataType import *\r
+from .BuildToolError import *\r
 from CommonDataClass.DataClass import *\r
 from CommonDataClass.DataClass import *\r
-from Parsing import GetSplitValueList\r
+from .Parsing import GetSplitValueList\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
 from Common.MultipleWorkspace import MultipleWorkspace as mws\r
 import uuid\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
 from Common.MultipleWorkspace import MultipleWorkspace as mws\r
 import uuid\r
@@ -42,18 +42,32 @@ import subprocess
 ## Regular expression used to find out place holders in string template\r
 gPlaceholderPattern = re.compile("\$\{([^$()\s]+)\}", re.MULTILINE | re.UNICODE)\r
 \r
 ## Regular expression used to find out place holders in string template\r
 gPlaceholderPattern = re.compile("\$\{([^$()\s]+)\}", re.MULTILINE | re.UNICODE)\r
 \r
+## regular expressions for map file processing\r
+startPatternGeneral = re.compile("^Start[' ']+Length[' ']+Name[' ']+Class")\r
+addressPatternGeneral = re.compile("^Address[' ']+Publics by Value[' ']+Rva\+Base")\r
+valuePatternGcc = re.compile('^([\w_\.]+) +([\da-fA-Fx]+) +([\da-fA-Fx]+)$')\r
+pcdPatternGcc = re.compile('^([\da-fA-Fx]+) +([\da-fA-Fx]+)')\r
+secReGeneral = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\da-fA-F]+)[Hh]? +([.\w\$]+) +(\w+)', re.UNICODE)\r
+\r
 ## Dictionary used to store file time stamp for quick re-access\r
 gFileTimeStampCache = {}    # {file path : file time stamp}\r
 \r
 ## Dictionary used to store dependencies of files\r
 gDependencyDatabase = {}    # arch : {file path : [dependent files list]}\r
 \r
 ## Dictionary used to store file time stamp for quick re-access\r
 gFileTimeStampCache = {}    # {file path : file time stamp}\r
 \r
 ## Dictionary used to store dependencies of files\r
 gDependencyDatabase = {}    # arch : {file path : [dependent files list]}\r
 \r
+#\r
+# If a module is built more than once with different PCDs or library classes\r
+# a temporary INF file with same content is created, the temporary file is removed\r
+# when build exits.\r
+#\r
+_TempInfs = []\r
+\r
 def GetVariableOffset(mapfilepath, efifilepath, varnames):\r
 def GetVariableOffset(mapfilepath, efifilepath, varnames):\r
-    """ Parse map file to get variable offset in current EFI file \r
+    """ Parse map file to get variable offset in current EFI file\r
     @param mapfilepath    Map file absolution path\r
     @param efifilepath:   EFI binary file full path\r
     @param varnames       iteratable container whose elements are variable names to be searched\r
     @param mapfilepath    Map file absolution path\r
     @param efifilepath:   EFI binary file full path\r
     @param varnames       iteratable container whose elements are variable names to be searched\r
-    \r
+\r
     @return List whos elements are tuple with variable name and raw offset\r
     """\r
     lines = []\r
     @return List whos elements are tuple with variable name and raw offset\r
     """\r
     lines = []\r
@@ -63,7 +77,7 @@ def GetVariableOffset(mapfilepath, efifilepath, varnames):
         f.close()\r
     except:\r
         return None\r
         f.close()\r
     except:\r
         return None\r
-    \r
+\r
     if len(lines) == 0: return None\r
     firstline = lines[0].strip()\r
     if (firstline.startswith("Archive member included ") and\r
     if len(lines) == 0: return None\r
     firstline = lines[0].strip()\r
     if (firstline.startswith("Archive member included ") and\r
@@ -76,7 +90,7 @@ def GetVariableOffset(mapfilepath, efifilepath, varnames):
 def _parseForXcode(lines, efifilepath, varnames):\r
     status = 0\r
     ret = []\r
 def _parseForXcode(lines, efifilepath, varnames):\r
     status = 0\r
     ret = []\r
-    for index, line in enumerate(lines):\r
+    for line in lines:\r
         line = line.strip()\r
         if status == 0 and line == "# Symbols:":\r
             status = 1\r
         line = line.strip()\r
         if status == 0 and line == "# Symbols:":\r
             status = 1\r
@@ -84,8 +98,9 @@ def _parseForXcode(lines, efifilepath, varnames):
         if status == 1 and len(line) != 0:\r
             for varname in varnames:\r
                 if varname in line:\r
         if status == 1 and len(line) != 0:\r
             for varname in varnames:\r
                 if varname in line:\r
+                    # cannot pregenerate this RegEx since it uses varname from varnames.\r
                     m = re.match('^([\da-fA-FxX]+)([\s\S]*)([_]*%s)$' % varname, line)\r
                     m = re.match('^([\da-fA-FxX]+)([\s\S]*)([_]*%s)$' % varname, line)\r
-                    if m != None:\r
+                    if m is not None:\r
                         ret.append((varname, m.group(1)))\r
     return ret\r
 \r
                         ret.append((varname, m.group(1)))\r
     return ret\r
 \r
@@ -109,28 +124,28 @@ def _parseForGCC(lines, efifilepath, varnames):
 \r
         # status handler\r
         if status == 3:\r
 \r
         # status handler\r
         if status == 3:\r
-            m = re.match('^([\w_\.]+) +([\da-fA-Fx]+) +([\da-fA-Fx]+)$', line)\r
-            if m != None:\r
+            m = valuePatternGcc.match(line)\r
+            if m is not None:\r
                 sections.append(m.groups(0))\r
             for varname in varnames:\r
                 Str = ''\r
                 m = re.match("^.data.(%s)" % varname, line)\r
                 sections.append(m.groups(0))\r
             for varname in varnames:\r
                 Str = ''\r
                 m = re.match("^.data.(%s)" % varname, line)\r
-                if m != None:\r
+                if m is not None:\r
                     m = re.match(".data.(%s)$" % varname, line)\r
                     m = re.match(".data.(%s)$" % varname, line)\r
-                    if m != None:\r
+                    if m is not None:\r
                         Str = lines[index + 1]\r
                     else:\r
                         Str = line[len(".data.%s" % varname):]\r
                     if Str:\r
                         Str = lines[index + 1]\r
                     else:\r
                         Str = line[len(".data.%s" % varname):]\r
                     if Str:\r
-                        m = re.match('^([\da-fA-Fx]+) +([\da-fA-Fx]+)', Str.strip())\r
-                        if m != None:\r
-                            varoffset.append((varname, int(m.groups(0)[0], 16) , int(sections[-1][1], 16), sections[-1][0]))\r
+                        m = pcdPatternGcc.match(Str.strip())\r
+                        if m is not None:\r
+                            varoffset.append((varname, int(m.groups(0)[0], 16), int(sections[-1][1], 16), sections[-1][0]))\r
 \r
     if not varoffset:\r
         return []\r
     # get section information from efi file\r
     efisecs = PeImageClass(efifilepath).SectionHeaderList\r
 \r
     if not varoffset:\r
         return []\r
     # get section information from efi file\r
     efisecs = PeImageClass(efifilepath).SectionHeaderList\r
-    if efisecs == None or len(efisecs) == 0:\r
+    if efisecs is None or len(efisecs) == 0:\r
         return []\r
     #redirection\r
     redirection = 0\r
         return []\r
     #redirection\r
     redirection = 0\r
@@ -150,35 +165,35 @@ def _parseGeneral(lines, efifilepath, varnames):
     status = 0    #0 - beginning of file; 1 - PE section definition; 2 - symbol table\r
     secs  = []    # key = section name\r
     varoffset = []\r
     status = 0    #0 - beginning of file; 1 - PE section definition; 2 - symbol table\r
     secs  = []    # key = section name\r
     varoffset = []\r
-    secRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\da-fA-F]+)[Hh]? +([.\w\$]+) +(\w+)', re.UNICODE)\r
     symRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\.:\\\\\w\?@\$]+) +([\da-fA-F]+)', re.UNICODE)\r
 \r
     for line in lines:\r
         line = line.strip()\r
     symRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\.:\\\\\w\?@\$]+) +([\da-fA-F]+)', re.UNICODE)\r
 \r
     for line in lines:\r
         line = line.strip()\r
-        if re.match("^Start[' ']+Length[' ']+Name[' ']+Class", line):\r
+        if startPatternGeneral.match(line):\r
             status = 1\r
             continue\r
             status = 1\r
             continue\r
-        if re.match("^Address[' ']+Publics by Value[' ']+Rva\+Base", line):\r
+        if addressPatternGeneral.match(line):\r
             status = 2\r
             continue\r
             status = 2\r
             continue\r
-        if re.match("^entry point at", line):\r
+        if line.startswith("entry point at"):\r
             status = 3\r
             status = 3\r
-            continue        \r
+            continue\r
         if status == 1 and len(line) != 0:\r
         if status == 1 and len(line) != 0:\r
-            m =  secRe.match(line)\r
-            assert m != None, "Fail to parse the section in map file , line is %s" % line\r
+            m =  secReGeneral.match(line)\r
+            assert m is not None, "Fail to parse the section in map file , line is %s" % line\r
             sec_no, sec_start, sec_length, sec_name, sec_class = m.groups(0)\r
             secs.append([int(sec_no, 16), int(sec_start, 16), int(sec_length, 16), sec_name, sec_class])\r
         if status == 2 and len(line) != 0:\r
             for varname in varnames:\r
                 m = symRe.match(line)\r
             sec_no, sec_start, sec_length, sec_name, sec_class = m.groups(0)\r
             secs.append([int(sec_no, 16), int(sec_start, 16), int(sec_length, 16), sec_name, sec_class])\r
         if status == 2 and len(line) != 0:\r
             for varname in varnames:\r
                 m = symRe.match(line)\r
-                assert m != None, "Fail to parse the symbol in map file, line is %s" % line\r
+                assert m is not None, "Fail to parse the symbol in map file, line is %s" % line\r
                 sec_no, sym_offset, sym_name, vir_addr = m.groups(0)\r
                 sec_no     = int(sec_no,     16)\r
                 sym_offset = int(sym_offset, 16)\r
                 vir_addr   = int(vir_addr,   16)\r
                 sec_no, sym_offset, sym_name, vir_addr = m.groups(0)\r
                 sec_no     = int(sec_no,     16)\r
                 sym_offset = int(sym_offset, 16)\r
                 vir_addr   = int(vir_addr,   16)\r
+                # cannot pregenerate this RegEx since it uses varname from varnames.\r
                 m2 = re.match('^[_]*(%s)' % varname, sym_name)\r
                 m2 = re.match('^[_]*(%s)' % varname, sym_name)\r
-                if m2 != None:\r
+                if m2 is not None:\r
                     # fond a binary pcd entry in map file\r
                     for sec in secs:\r
                         if sec[0] == sec_no and (sym_offset >= sec[1] and sym_offset < sec[1] + sec[2]):\r
                     # fond a binary pcd entry in map file\r
                     for sec in secs:\r
                         if sec[0] == sec_no and (sym_offset >= sec[1] and sym_offset < sec[1] + sec[2]):\r
@@ -188,7 +203,7 @@ def _parseGeneral(lines, efifilepath, varnames):
 \r
     # get section information from efi file\r
     efisecs = PeImageClass(efifilepath).SectionHeaderList\r
 \r
     # get section information from efi file\r
     efisecs = PeImageClass(efifilepath).SectionHeaderList\r
-    if efisecs == None or len(efisecs) == 0:\r
+    if efisecs is None or len(efisecs) == 0:\r
         return []\r
 \r
     ret = []\r
         return []\r
 \r
     ret = []\r
@@ -242,7 +257,7 @@ def ProcessDuplicatedInf(Path, BaseName, Workspace):
     #\r
     # A temporary INF is copied to database path which must have write permission\r
     # The temporary will be removed at the end of build\r
     #\r
     # A temporary INF is copied to database path which must have write permission\r
     # The temporary will be removed at the end of build\r
-    # In case of name conflict, the file name is \r
+    # In case of name conflict, the file name is\r
     # FILE_GUIDBaseName (0D1B936F-68F3-4589-AFCC-FB8B7AEBC836module.inf)\r
     #\r
     TempFullPath = os.path.join(DbDir,\r
     # FILE_GUIDBaseName (0D1B936F-68F3-4589-AFCC-FB8B7AEBC836module.inf)\r
     #\r
     TempFullPath = os.path.join(DbDir,\r
@@ -253,7 +268,7 @@ def ProcessDuplicatedInf(Path, BaseName, Workspace):
     #\r
     # To build same module more than once, the module path with FILE_GUID overridden has\r
     # the file name FILE_GUIDmodule.inf, but the relative path (self.MetaFile.File) is the real path\r
     #\r
     # To build same module more than once, the module path with FILE_GUID overridden has\r
     # the file name FILE_GUIDmodule.inf, but the relative path (self.MetaFile.File) is the real path\r
-    # in DSC which is used as relative path by C files and other files in INF. \r
+    # in DSC which is used as relative path by C files and other files in INF.\r
     # A trick was used: all module paths are PathClass instances, after the initialization\r
     # of PathClass, the PathClass.Path is overridden by the temporary INF path.\r
     #\r
     # A trick was used: all module paths are PathClass instances, after the initialization\r
     # of PathClass, the PathClass.Path is overridden by the temporary INF path.\r
     #\r
@@ -272,47 +287,21 @@ def ProcessDuplicatedInf(Path, BaseName, Workspace):
     # If file exists, compare contents\r
     #\r
     if os.path.exists(TempFullPath):\r
     # If file exists, compare contents\r
     #\r
     if os.path.exists(TempFullPath):\r
-        with open(str(Path), 'rb') as f1: Src = f1.read()\r
-        with open(TempFullPath, 'rb') as f2: Dst = f2.read()\r
-        if Src == Dst:\r
-            return RtPath\r
-    GlobalData.gTempInfs.append(TempFullPath)\r
+        with open(str(Path), 'rb') as f1, open(TempFullPath, 'rb') as f2:\r
+            if f1.read() == f2.read():\r
+                return RtPath\r
+    _TempInfs.append(TempFullPath)\r
     shutil.copy2(str(Path), TempFullPath)\r
     return RtPath\r
 \r
     shutil.copy2(str(Path), TempFullPath)\r
     return RtPath\r
 \r
-## Remove temporary created INFs whose paths were saved in gTempInfs\r
+## Remove temporary created INFs whose paths were saved in _TempInfs\r
 #\r
 def ClearDuplicatedInf():\r
 #\r
 def ClearDuplicatedInf():\r
-    for File in GlobalData.gTempInfs:\r
+    while _TempInfs:\r
+        File = _TempInfs.pop()\r
         if os.path.exists(File):\r
             os.remove(File)\r
 \r
         if os.path.exists(File):\r
             os.remove(File)\r
 \r
-## callback routine for processing variable option\r
-#\r
-# This function can be used to process variable number of option values. The\r
-# typical usage of it is specify architecure list on command line.\r
-# (e.g. <tool> -a IA32 X64 IPF)\r
-#\r
-# @param  Option        Standard callback function parameter\r
-# @param  OptionString  Standard callback function parameter\r
-# @param  Value         Standard callback function parameter\r
-# @param  Parser        Standard callback function parameter\r
-#\r
-# @retval\r
-#\r
-def ProcessVariableArgument(Option, OptionString, Value, Parser):\r
-    assert Value is None\r
-    Value = []\r
-    RawArgs = Parser.rargs\r
-    while RawArgs:\r
-        Arg = RawArgs[0]\r
-        if (Arg[:2] == "--" and len(Arg) > 2) or \\r
-           (Arg[:1] == "-" and len(Arg) > 1 and Arg[1] != "-"):\r
-            break\r
-        Value.append(Arg)\r
-        del RawArgs[0]\r
-    setattr(Parser.values, Option.dest, Value)\r
-\r
 ## Convert GUID string in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx style to C structure style\r
 #\r
 #   @param      Guid    The GUID string\r
 ## Convert GUID string in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx style to C structure style\r
 #\r
 #   @param      Guid    The GUID string\r
@@ -423,7 +412,7 @@ def GuidStructureStringToGuidValueName(GuidValue):
 #   @param      Directory   The directory name\r
 #\r
 def CreateDirectory(Directory):\r
 #   @param      Directory   The directory name\r
 #\r
 def CreateDirectory(Directory):\r
-    if Directory == None or Directory.strip() == "":\r
+    if Directory is None or Directory.strip() == "":\r
         return True\r
     try:\r
         if not os.access(Directory, os.F_OK):\r
         return True\r
     try:\r
         if not os.access(Directory, os.F_OK):\r
@@ -437,7 +426,7 @@ def CreateDirectory(Directory):
 #   @param      Directory   The directory name\r
 #\r
 def RemoveDirectory(Directory, Recursively=False):\r
 #   @param      Directory   The directory name\r
 #\r
 def RemoveDirectory(Directory, Recursively=False):\r
-    if Directory == None or Directory.strip() == "" or not os.path.exists(Directory):\r
+    if Directory is None or Directory.strip() == "" or not os.path.exists(Directory):\r
         return\r
     if Recursively:\r
         CurrentDirectory = os.getcwd()\r
         return\r
     if Recursively:\r
         CurrentDirectory = os.getcwd()\r
@@ -450,32 +439,6 @@ def RemoveDirectory(Directory, Recursively=False):
         os.chdir(CurrentDirectory)\r
     os.rmdir(Directory)\r
 \r
         os.chdir(CurrentDirectory)\r
     os.rmdir(Directory)\r
 \r
-## Check if given file is changed or not\r
-#\r
-#  This method is used to check if a file is changed or not between two build\r
-#  actions. It makes use a cache to store files timestamp.\r
-#\r
-#   @param      File    The path of file\r
-#\r
-#   @retval     True    If the given file is changed, doesn't exist, or can't be\r
-#                       found in timestamp cache\r
-#   @retval     False   If the given file is changed\r
-#\r
-def IsChanged(File):\r
-    if not os.path.exists(File):\r
-        return True\r
-\r
-    FileState = os.stat(File)\r
-    TimeStamp = FileState[-2]\r
-\r
-    if File in gFileTimeStampCache and TimeStamp == gFileTimeStampCache[File]:\r
-        FileChanged = False\r
-    else:\r
-        FileChanged = True\r
-        gFileTimeStampCache[File] = TimeStamp\r
-\r
-    return FileChanged\r
-\r
 ## Store content in file\r
 #\r
 #  This method is used to save file only when its content is changed. This is\r
 ## Store content in file\r
 #\r
 #  This method is used to save file only when its content is changed. This is\r
@@ -511,7 +474,7 @@ def SaveFileOnChange(File, Content, IsBinaryFile=True):
     try:\r
         if GlobalData.gIsWindows:\r
             try:\r
     try:\r
         if GlobalData.gIsWindows:\r
             try:\r
-                from PyUtility import SaveFileToDisk\r
+                from .PyUtility import SaveFileToDisk\r
                 if not SaveFileToDisk(File, Content):\r
                     EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData=File)\r
             except:\r
                 if not SaveFileToDisk(File, Content):\r
                     EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData=File)\r
             except:\r
@@ -522,7 +485,7 @@ def SaveFileOnChange(File, Content, IsBinaryFile=True):
             Fd = open(File, "wb")\r
             Fd.write(Content)\r
             Fd.close()\r
             Fd = open(File, "wb")\r
             Fd.write(Content)\r
             Fd.close()\r
-    except IOError, X:\r
+    except IOError as X:\r
         EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData='IOError %s' % X)\r
 \r
     return True\r
         EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData='IOError %s' % X)\r
 \r
     return True\r
@@ -540,7 +503,7 @@ def DataDump(Data, File):
     except:\r
         EdkLogger.error("", FILE_OPEN_FAILURE, ExtraData=File, RaiseError=False)\r
     finally:\r
     except:\r
         EdkLogger.error("", FILE_OPEN_FAILURE, ExtraData=File, RaiseError=False)\r
     finally:\r
-        if Fd != None:\r
+        if Fd is not None:\r
             Fd.close()\r
 \r
 ## Restore a Python object from a file\r
             Fd.close()\r
 \r
 ## Restore a Python object from a file\r
@@ -556,11 +519,11 @@ def DataRestore(File):
     try:\r
         Fd = open(File, 'rb')\r
         Data = cPickle.load(Fd)\r
     try:\r
         Fd = open(File, 'rb')\r
         Data = cPickle.load(Fd)\r
-    except Exception, e:\r
+    except Exception as e:\r
         EdkLogger.verbose("Failed to load [%s]\n\t%s" % (File, str(e)))\r
         Data = None\r
     finally:\r
         EdkLogger.verbose("Failed to load [%s]\n\t%s" % (File, str(e)))\r
         Data = None\r
     finally:\r
-        if Fd != None:\r
+        if Fd is not None:\r
             Fd.close()\r
     return Data\r
 \r
             Fd.close()\r
     return Data\r
 \r
@@ -635,47 +598,6 @@ class DirCache:
             return os.path.join(self._Root, self._UPPER_CACHE_[UpperPath])\r
         return None\r
 \r
             return os.path.join(self._Root, self._UPPER_CACHE_[UpperPath])\r
         return None\r
 \r
-## Get all files of a directory\r
-#\r
-# @param Root:       Root dir\r
-# @param SkipList :  The files need be skipped\r
-#\r
-# @retval  A list of all files\r
-#\r
-def GetFiles(Root, SkipList=None, FullPath=True):\r
-    OriPath = Root\r
-    FileList = []\r
-    for Root, Dirs, Files in os.walk(Root):\r
-        if SkipList:\r
-            for Item in SkipList:\r
-                if Item in Dirs:\r
-                    Dirs.remove(Item)\r
-\r
-        for File in Files:\r
-            File = os.path.normpath(os.path.join(Root, File))\r
-            if not FullPath:\r
-                File = File[len(OriPath) + 1:]\r
-            FileList.append(File)\r
-\r
-    return FileList\r
-\r
-## Check if gvien file exists or not\r
-#\r
-#   @param      File    File name or path to be checked\r
-#   @param      Dir     The directory the file is relative to\r
-#\r
-#   @retval     True    if file exists\r
-#   @retval     False   if file doesn't exists\r
-#\r
-def ValidFile(File, Ext=None):\r
-    if Ext != None:\r
-        Dummy, FileExt = os.path.splitext(File)\r
-        if FileExt.lower() != Ext.lower():\r
-            return False\r
-    if not os.path.exists(File):\r
-        return False\r
-    return True\r
-\r
 def RealPath(File, Dir='', OverrideDir=''):\r
     NewFile = os.path.normpath(os.path.join(Dir, File))\r
     NewFile = GlobalData.gAllFiles[NewFile]\r
 def RealPath(File, Dir='', OverrideDir=''):\r
     NewFile = os.path.normpath(os.path.join(Dir, File))\r
     NewFile = GlobalData.gAllFiles[NewFile]\r
@@ -710,115 +632,6 @@ def RealPath2(File, Dir='', OverrideDir=''):
 \r
     return None, None\r
 \r
 \r
     return None, None\r
 \r
-## Check if gvien file exists or not\r
-#\r
-#\r
-def ValidFile2(AllFiles, File, Ext=None, Workspace='', EfiSource='', EdkSource='', Dir='.', OverrideDir=''):\r
-    NewFile = File\r
-    if Ext != None:\r
-        Dummy, FileExt = os.path.splitext(File)\r
-        if FileExt.lower() != Ext.lower():\r
-            return False, File\r
-\r
-    # Replace the Edk macros\r
-    if OverrideDir != '' and OverrideDir != None:\r
-        if OverrideDir.find('$(EFI_SOURCE)') > -1:\r
-            OverrideDir = OverrideDir.replace('$(EFI_SOURCE)', EfiSource)\r
-        if OverrideDir.find('$(EDK_SOURCE)') > -1:\r
-            OverrideDir = OverrideDir.replace('$(EDK_SOURCE)', EdkSource)\r
-\r
-    # Replace the default dir to current dir\r
-    if Dir == '.':\r
-        Dir = os.getcwd()\r
-        Dir = Dir[len(Workspace) + 1:]\r
-\r
-    # First check if File has Edk definition itself\r
-    if File.find('$(EFI_SOURCE)') > -1 or File.find('$(EDK_SOURCE)') > -1:\r
-        NewFile = File.replace('$(EFI_SOURCE)', EfiSource)\r
-        NewFile = NewFile.replace('$(EDK_SOURCE)', EdkSource)\r
-        NewFile = AllFiles[os.path.normpath(NewFile)]\r
-        if NewFile != None:\r
-            return True, NewFile\r
-\r
-    # Second check the path with override value\r
-    if OverrideDir != '' and OverrideDir != None:\r
-        NewFile = AllFiles[os.path.normpath(os.path.join(OverrideDir, File))]\r
-        if NewFile != None:\r
-            return True, NewFile\r
-\r
-    # Last check the path with normal definitions\r
-    File = os.path.join(Dir, File)\r
-    NewFile = AllFiles[os.path.normpath(File)]\r
-    if NewFile != None:\r
-        return True, NewFile\r
-\r
-    return False, File\r
-\r
-## Check if gvien file exists or not\r
-#\r
-#\r
-def ValidFile3(AllFiles, File, Workspace='', EfiSource='', EdkSource='', Dir='.', OverrideDir=''):\r
-    # Replace the Edk macros\r
-    if OverrideDir != '' and OverrideDir != None:\r
-        if OverrideDir.find('$(EFI_SOURCE)') > -1:\r
-            OverrideDir = OverrideDir.replace('$(EFI_SOURCE)', EfiSource)\r
-        if OverrideDir.find('$(EDK_SOURCE)') > -1:\r
-            OverrideDir = OverrideDir.replace('$(EDK_SOURCE)', EdkSource)\r
-\r
-    # Replace the default dir to current dir\r
-    # Dir is current module dir related to workspace\r
-    if Dir == '.':\r
-        Dir = os.getcwd()\r
-        Dir = Dir[len(Workspace) + 1:]\r
-\r
-    NewFile = File\r
-    RelaPath = AllFiles[os.path.normpath(Dir)]\r
-    NewRelaPath = RelaPath\r
-\r
-    while(True):\r
-        # First check if File has Edk definition itself\r
-        if File.find('$(EFI_SOURCE)') > -1 or File.find('$(EDK_SOURCE)') > -1:\r
-            File = File.replace('$(EFI_SOURCE)', EfiSource)\r
-            File = File.replace('$(EDK_SOURCE)', EdkSource)\r
-            NewFile = AllFiles[os.path.normpath(File)]\r
-            if NewFile != None:\r
-                NewRelaPath = os.path.dirname(NewFile)\r
-                File = os.path.basename(NewFile)\r
-                #NewRelaPath = NewFile[:len(NewFile) - len(File.replace("..\\", '').replace("../", '')) - 1]\r
-                break\r
-\r
-        # Second check the path with override value\r
-        if OverrideDir != '' and OverrideDir != None:\r
-            NewFile = AllFiles[os.path.normpath(os.path.join(OverrideDir, File))]\r
-            if NewFile != None:\r
-                #NewRelaPath = os.path.dirname(NewFile)\r
-                NewRelaPath = NewFile[:len(NewFile) - len(File.replace("..\\", '').replace("../", '')) - 1]\r
-                break\r
-\r
-        # Last check the path with normal definitions\r
-        NewFile = AllFiles[os.path.normpath(os.path.join(Dir, File))]\r
-        if NewFile != None:\r
-            break\r
-\r
-        # No file found\r
-        break\r
-\r
-    return NewRelaPath, RelaPath, File\r
-\r
-\r
-def GetRelPath(Path1, Path2):\r
-    FileName = os.path.basename(Path2)\r
-    L1 = os.path.normpath(Path1).split(os.path.normpath('/'))\r
-    L2 = os.path.normpath(Path2).split(os.path.normpath('/'))\r
-    for Index in range(0, len(L1)):\r
-        if L1[Index] != L2[Index]:\r
-            FileName = '../' * (len(L1) - Index)\r
-            for Index2 in range(Index, len(L2)):\r
-                FileName = os.path.join(FileName, L2[Index2])\r
-            break\r
-    return os.path.normpath(FileName)\r
-\r
-\r
 ## Get GUID value from given packages\r
 #\r
 #   @param      CName           The CName of the GUID\r
 ## Get GUID value from given packages\r
 #\r
 #   @param      CName           The CName of the GUID\r
@@ -833,7 +646,7 @@ def GuidValue(CName, PackageList, Inffile = None):
         GuidKeys = P.Guids.keys()\r
         if Inffile and P._PrivateGuids:\r
             if not Inffile.startswith(P.MetaFile.Dir):\r
         GuidKeys = P.Guids.keys()\r
         if Inffile and P._PrivateGuids:\r
             if not Inffile.startswith(P.MetaFile.Dir):\r
-                GuidKeys = (dict.fromkeys(x for x in P.Guids if x not in P._PrivateGuids)).keys()\r
+                GuidKeys = [x for x in P.Guids if x not in P._PrivateGuids]\r
         if CName in GuidKeys:\r
             return P.Guids[CName]\r
     return None\r
         if CName in GuidKeys:\r
             return P.Guids[CName]\r
     return None\r
@@ -852,7 +665,7 @@ def ProtocolValue(CName, PackageList, Inffile = None):
         ProtocolKeys = P.Protocols.keys()\r
         if Inffile and P._PrivateProtocols:\r
             if not Inffile.startswith(P.MetaFile.Dir):\r
         ProtocolKeys = P.Protocols.keys()\r
         if Inffile and P._PrivateProtocols:\r
             if not Inffile.startswith(P.MetaFile.Dir):\r
-                ProtocolKeys = (dict.fromkeys(x for x in P.Protocols if x not in P._PrivateProtocols)).keys()\r
+                ProtocolKeys = [x for x in P.Protocols if x not in P._PrivateProtocols]\r
         if CName in ProtocolKeys:\r
             return P.Protocols[CName]\r
     return None\r
         if CName in ProtocolKeys:\r
             return P.Protocols[CName]\r
     return None\r
@@ -871,7 +684,7 @@ def PpiValue(CName, PackageList, Inffile = None):
         PpiKeys = P.Ppis.keys()\r
         if Inffile and P._PrivatePpis:\r
             if not Inffile.startswith(P.MetaFile.Dir):\r
         PpiKeys = P.Ppis.keys()\r
         if Inffile and P._PrivatePpis:\r
             if not Inffile.startswith(P.MetaFile.Dir):\r
-                PpiKeys = (dict.fromkeys(x for x in P.Ppis if x not in P._PrivatePpis)).keys()\r
+                PpiKeys = [x for x in P.Ppis if x not in P._PrivatePpis]\r
         if CName in PpiKeys:\r
             return P.Ppis[CName]\r
     return None\r
         if CName in PpiKeys:\r
             return P.Ppis[CName]\r
     return None\r
@@ -1027,7 +840,7 @@ class TemplateString(object):
     def Append(self, AppendString, Dictionary=None):\r
         if Dictionary:\r
             SectionList = self._Parse(AppendString)\r
     def Append(self, AppendString, Dictionary=None):\r
         if Dictionary:\r
             SectionList = self._Parse(AppendString)\r
-            self.String += "".join([S.Instantiate(Dictionary) for S in SectionList])\r
+            self.String += "".join(S.Instantiate(Dictionary) for S in SectionList)\r
         else:\r
             self.String += AppendString\r
 \r
         else:\r
             self.String += AppendString\r
 \r
@@ -1038,7 +851,7 @@ class TemplateString(object):
     #   @retval     str             The string replaced with placeholder values\r
     #\r
     def Replace(self, Dictionary=None):\r
     #   @retval     str             The string replaced with placeholder values\r
     #\r
     def Replace(self, Dictionary=None):\r
-        return "".join([S.Instantiate(Dictionary) for S in self._TemplateSectionList])\r
+        return "".join(S.Instantiate(Dictionary) for S in self._TemplateSectionList)\r
 \r
 ## Progress indicator class\r
 #\r
 \r
 ## Progress indicator class\r
 #\r
@@ -1062,7 +875,7 @@ class Progressor:
         self.CodaMessage = CloseMessage\r
         self.ProgressChar = ProgressChar\r
         self.Interval = Interval\r
         self.CodaMessage = CloseMessage\r
         self.ProgressChar = ProgressChar\r
         self.Interval = Interval\r
-        if Progressor._StopFlag == None:\r
+        if Progressor._StopFlag is None:\r
             Progressor._StopFlag = threading.Event()\r
 \r
     ## Start to print progress charater\r
             Progressor._StopFlag = threading.Event()\r
 \r
     ## Start to print progress charater\r
@@ -1070,10 +883,10 @@ class Progressor:
     #   @param      OpenMessage     The string printed before progress charaters\r
     #\r
     def Start(self, OpenMessage=None):\r
     #   @param      OpenMessage     The string printed before progress charaters\r
     #\r
     def Start(self, OpenMessage=None):\r
-        if OpenMessage != None:\r
+        if OpenMessage is not None:\r
             self.PromptMessage = OpenMessage\r
         Progressor._StopFlag.clear()\r
             self.PromptMessage = OpenMessage\r
         Progressor._StopFlag.clear()\r
-        if Progressor._ProgressThread == None:\r
+        if Progressor._ProgressThread is None:\r
             Progressor._ProgressThread = threading.Thread(target=self._ProgressThreadEntry)\r
             Progressor._ProgressThread.setDaemon(False)\r
             Progressor._ProgressThread.start()\r
             Progressor._ProgressThread = threading.Thread(target=self._ProgressThreadEntry)\r
             Progressor._ProgressThread.setDaemon(False)\r
             Progressor._ProgressThread.start()\r
@@ -1084,7 +897,7 @@ class Progressor:
     #\r
     def Stop(self, CloseMessage=None):\r
         OriginalCodaMessage = self.CodaMessage\r
     #\r
     def Stop(self, CloseMessage=None):\r
         OriginalCodaMessage = self.CodaMessage\r
-        if CloseMessage != None:\r
+        if CloseMessage is not None:\r
             self.CodaMessage = CloseMessage\r
         self.Abort()\r
         self.CodaMessage = OriginalCodaMessage\r
             self.CodaMessage = CloseMessage\r
         self.Abort()\r
         self.CodaMessage = OriginalCodaMessage\r
@@ -1107,9 +920,9 @@ class Progressor:
     ## Abort the progress display\r
     @staticmethod\r
     def Abort():\r
     ## Abort the progress display\r
     @staticmethod\r
     def Abort():\r
-        if Progressor._StopFlag != None:\r
+        if Progressor._StopFlag is not None:\r
             Progressor._StopFlag.set()\r
             Progressor._StopFlag.set()\r
-        if Progressor._ProgressThread != None:\r
+        if Progressor._ProgressThread is not None:\r
             Progressor._ProgressThread.join()\r
             Progressor._ProgressThread = None\r
 \r
             Progressor._ProgressThread.join()\r
             Progressor._ProgressThread = None\r
 \r
@@ -1228,7 +1041,7 @@ class sdict(IterableUserDict):
         return key, value\r
 \r
     def update(self, dict=None, **kwargs):\r
         return key, value\r
 \r
     def update(self, dict=None, **kwargs):\r
-        if dict != None:\r
+        if dict is not None:\r
             for k, v in dict.items():\r
                 self[k] = v\r
         if len(kwargs):\r
             for k, v in dict.items():\r
                 self[k] = v\r
         if len(kwargs):\r
@@ -1301,7 +1114,7 @@ class tdict:
             if self._Level_ > 1:\r
                 RestKeys = [self._Wildcard for i in range(0, self._Level_ - 1)]\r
 \r
             if self._Level_ > 1:\r
                 RestKeys = [self._Wildcard for i in range(0, self._Level_ - 1)]\r
 \r
-        if FirstKey == None or str(FirstKey).upper() in self._ValidWildcardList:\r
+        if FirstKey is None or str(FirstKey).upper() in self._ValidWildcardList:\r
             FirstKey = self._Wildcard\r
 \r
         if self._Single_:\r
             FirstKey = self._Wildcard\r
 \r
         if self._Single_:\r
@@ -1316,24 +1129,24 @@ class tdict:
             if FirstKey == self._Wildcard:\r
                 if FirstKey in self.data:\r
                     Value = self.data[FirstKey][RestKeys]\r
             if FirstKey == self._Wildcard:\r
                 if FirstKey in self.data:\r
                     Value = self.data[FirstKey][RestKeys]\r
-                if Value == None:\r
+                if Value is None:\r
                     for Key in self.data:\r
                         Value = self.data[Key][RestKeys]\r
                     for Key in self.data:\r
                         Value = self.data[Key][RestKeys]\r
-                        if Value != None: break\r
+                        if Value is not None: break\r
             else:\r
                 if FirstKey in self.data:\r
                     Value = self.data[FirstKey][RestKeys]\r
             else:\r
                 if FirstKey in self.data:\r
                     Value = self.data[FirstKey][RestKeys]\r
-                if Value == None and self._Wildcard in self.data:\r
+                if Value is None and self._Wildcard in self.data:\r
                     #print "Value=None"\r
                     Value = self.data[self._Wildcard][RestKeys]\r
         else:\r
             if FirstKey == self._Wildcard:\r
                 if FirstKey in self.data:\r
                     Value = self.data[FirstKey]\r
                     #print "Value=None"\r
                     Value = self.data[self._Wildcard][RestKeys]\r
         else:\r
             if FirstKey == self._Wildcard:\r
                 if FirstKey in self.data:\r
                     Value = self.data[FirstKey]\r
-                if Value == None:\r
+                if Value is None:\r
                     for Key in self.data:\r
                         Value = self.data[Key]\r
                     for Key in self.data:\r
                         Value = self.data[Key]\r
-                        if Value != None: break\r
+                        if Value is not None: break\r
             else:\r
                 if FirstKey in self.data:\r
                     Value = self.data[FirstKey]\r
             else:\r
                 if FirstKey in self.data:\r
                     Value = self.data[FirstKey]\r
@@ -1411,53 +1224,44 @@ class tdict:
                 keys |= self.data[Key].GetKeys(KeyIndex - 1)\r
             return keys\r
 \r
                 keys |= self.data[Key].GetKeys(KeyIndex - 1)\r
             return keys\r
 \r
-## Boolean chain list\r
-#\r
-class Blist(UserList):\r
-    def __init__(self, initlist=None):\r
-        UserList.__init__(self, initlist)\r
-    def __setitem__(self, i, item):\r
-        if item not in [True, False]:\r
-            if item == 0:\r
-                item = False\r
-            else:\r
-                item = True\r
-        self.data[i] = item\r
-    def _GetResult(self):\r
-        Value = True\r
-        for item in self.data:\r
-            Value &= item\r
-        return Value\r
-    Result = property(_GetResult)\r
-\r
-def ParseConsoleLog(Filename):\r
-    Opr = open(os.path.normpath(Filename), 'r')\r
-    Opw = open(os.path.normpath(Filename + '.New'), 'w+')\r
-    for Line in Opr.readlines():\r
-        if Line.find('.efi') > -1:\r
-            Line = Line[Line.rfind(' ') : Line.rfind('.efi')].strip()\r
-            Opw.write('%s\n' % Line)\r
-\r
-    Opr.close()\r
-    Opw.close()\r
+def IsFieldValueAnArray (Value):\r
+    Value = Value.strip()\r
+    if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
+        return True\r
+    if Value.startswith('L"') and Value.endswith('"')  and len(list(Value[2:-1])) > 1:\r
+        return True\r
+    if Value[0] == '"' and Value[-1] == '"' and len(list(Value[1:-1])) > 1:\r
+        return True\r
+    if Value[0] == '{' and Value[-1] == '}':\r
+        return True\r
+    if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
+        return True\r
+    if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
+        return True\r
+    return False\r
 \r
 def AnalyzePcdExpression(Setting):\r
     Setting = Setting.strip()\r
 \r
 def AnalyzePcdExpression(Setting):\r
     Setting = Setting.strip()\r
-    # There might be escaped quote in a string: \", \\\"\r
-    Data = Setting.replace('\\\\', '//').replace('\\\"', '\\\'')\r
+    # There might be escaped quote in a string: \", \\\" , \', \\\'\r
+    Data = Setting\r
     # There might be '|' in string and in ( ... | ... ), replace it with '-'\r
     NewStr = ''\r
     # There might be '|' in string and in ( ... | ... ), replace it with '-'\r
     NewStr = ''\r
-    InStr = False\r
+    InSingleQuoteStr = False\r
+    InDoubleQuoteStr = False\r
     Pair = 0\r
     Pair = 0\r
-    for ch in Data:\r
-        if ch == '"':\r
-            InStr = not InStr\r
-        elif ch == '(' and not InStr:\r
+    for Index, ch in enumerate(Data):\r
+        if ch == '"' and not InSingleQuoteStr:\r
+            if Data[Index - 1] != '\\':\r
+                InDoubleQuoteStr = not InDoubleQuoteStr\r
+        elif ch == "'" and not InDoubleQuoteStr:\r
+            if Data[Index - 1] != '\\':\r
+                InSingleQuoteStr = not InSingleQuoteStr\r
+        elif ch == '(' and not (InSingleQuoteStr or InDoubleQuoteStr):\r
             Pair += 1\r
             Pair += 1\r
-        elif ch == ')' and not InStr:\r
+        elif ch == ')' and not (InSingleQuoteStr or InDoubleQuoteStr):\r
             Pair -= 1\r
 \r
             Pair -= 1\r
 \r
-        if (Pair > 0 or InStr) and ch == TAB_VALUE_SPLIT:\r
+        if (Pair > 0 or InSingleQuoteStr or InDoubleQuoteStr) and ch == TAB_VALUE_SPLIT:\r
             NewStr += '-'\r
         else:\r
             NewStr += ch\r
             NewStr += '-'\r
         else:\r
             NewStr += ch\r
@@ -1474,27 +1278,14 @@ def AnalyzePcdExpression(Setting):
     return FieldList\r
 \r
 def ParseDevPathValue (Value):\r
     return FieldList\r
 \r
 def ParseDevPathValue (Value):\r
-    DevPathList = [ "Path","HardwarePath","Pci","PcCard","MemoryMapped","VenHw","Ctrl","BMC","AcpiPath","Acpi","PciRoot",\r
-                    "PcieRoot","Floppy","Keyboard","Serial","ParallelPort","AcpiEx","AcpiExp","AcpiAdr","Msg","Ata","Scsi",\r
-                    "Fibre","FibreEx","I1394","USB","I2O","Infiniband","VenMsg","VenPcAnsi","VenVt100","VenVt100Plus",\r
-                    "VenUtf8","UartFlowCtrl","SAS","SasEx","NVMe","UFS","SD","eMMC","DebugPort","MAC","IPv4","IPv6","Uart",\r
-                    "UsbClass","UsbAudio","UsbCDCControl","UsbHID","UsbImage","UsbPrinter","UsbMassStorage","UsbHub",\r
-                    "UsbCDCData","UsbSmartCard","UsbVideo","UsbDiagnostic","UsbWireless","UsbDeviceFirmwareUpdate",\r
-                    "UsbIrdaBridge","UsbTestAndMeasurement","UsbWwid","Unit","iSCSI","Vlan","Uri","Bluetooth","Wi-Fi",\r
-                    "MediaPath","HD","CDROM","VenMedia","Media","Fv","FvFile","Offset","RamDisk","VirtualDisk","VirtualCD",\r
-                    "PersistentVirtualDisk","PersistentVirtualCD","BbsPath","BBS","Sata" ]\r
     if '\\' in Value:\r
         Value.replace('\\', '/').replace(' ', '')\r
     if '\\' in Value:\r
         Value.replace('\\', '/').replace(' ', '')\r
-    for Item in Value.split('/'):\r
-        Key = Item.strip().split('(')[0]\r
-        if Key not in DevPathList:\r
-            pass\r
 \r
     Cmd = 'DevicePath ' + '"' + Value + '"'\r
     try:\r
         p = subprocess.Popen(Cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
         out, err = p.communicate()\r
 \r
     Cmd = 'DevicePath ' + '"' + Value + '"'\r
     try:\r
         p = subprocess.Popen(Cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
         out, err = p.communicate()\r
-    except Exception, X:\r
+    except Exception as X:\r
         raise BadExpression("DevicePath: %s" % (str(X)) )\r
     finally:\r
         subprocess._cleanup()\r
         raise BadExpression("DevicePath: %s" % (str(X)) )\r
     finally:\r
         subprocess._cleanup()\r
@@ -1507,55 +1298,55 @@ def ParseDevPathValue (Value):
     return '{' + out + '}', Size\r
 \r
 def ParseFieldValue (Value):\r
     return '{' + out + '}', Size\r
 \r
 def ParseFieldValue (Value):\r
-    if type(Value) == type(0):\r
+    if isinstance(Value, type(0)):\r
         return Value, (Value.bit_length() + 7) / 8\r
         return Value, (Value.bit_length() + 7) / 8\r
-    if type(Value) <> type(''):\r
+    if not isinstance(Value, type('')):\r
         raise BadExpression('Type %s is %s' %(Value, type(Value)))\r
     Value = Value.strip()\r
         raise BadExpression('Type %s is %s' %(Value, type(Value)))\r
     Value = Value.strip()\r
-    if Value.startswith('UINT8') and Value.endswith(')'):\r
+    if Value.startswith(TAB_UINT8) and Value.endswith(')'):\r
         Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
         if Size > 1:\r
             raise BadExpression('Value (%s) Size larger than %d' %(Value, Size))\r
         return Value, 1\r
         Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
         if Size > 1:\r
             raise BadExpression('Value (%s) Size larger than %d' %(Value, Size))\r
         return Value, 1\r
-    if Value.startswith('UINT16') and Value.endswith(')'):\r
+    if Value.startswith(TAB_UINT16) and Value.endswith(')'):\r
         Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
         if Size > 2:\r
             raise BadExpression('Value (%s) Size larger than %d' %(Value, Size))\r
         return Value, 2\r
         Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
         if Size > 2:\r
             raise BadExpression('Value (%s) Size larger than %d' %(Value, Size))\r
         return Value, 2\r
-    if Value.startswith('UINT32') and Value.endswith(')'):\r
+    if Value.startswith(TAB_UINT32) and Value.endswith(')'):\r
         Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
         if Size > 4:\r
             raise BadExpression('Value (%s) Size larger than %d' %(Value, Size))\r
         return Value, 4\r
         Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
         if Size > 4:\r
             raise BadExpression('Value (%s) Size larger than %d' %(Value, Size))\r
         return Value, 4\r
-    if Value.startswith('UINT64') and Value.endswith(')'):\r
+    if Value.startswith(TAB_UINT64) and Value.endswith(')'):\r
         Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
         if Size > 8:\r
             raise BadExpression('Value (%s) Size larger than %d' % (Value, Size))\r
         return Value, 8\r
         Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
         if Size > 8:\r
             raise BadExpression('Value (%s) Size larger than %d' % (Value, Size))\r
         return Value, 8\r
-    if Value.startswith('GUID') and Value.endswith(')'):\r
+    if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
         Value = Value.split('(', 1)[1][:-1].strip()\r
         if Value[0] == '{' and Value[-1] == '}':\r
         Value = Value.split('(', 1)[1][:-1].strip()\r
         if Value[0] == '{' and Value[-1] == '}':\r
-            Value = Value[1:-1].strip()\r
-            Value = Value.split('{', 1)\r
-            Value = ['%02x' % int(Item, 16) for Item in (Value[0] + Value[1][:-1]).split(',')]\r
-            if len(Value[0]) != 8:\r
-                Value[0] = '%08X' % int(Value[0], 16)\r
-            if len(Value[1]) != 4:\r
-                Value[1] = '%04X' % int(Value[1], 16)\r
-            if len(Value[2]) != 4:\r
-                Value[2] = '%04X' % int(Value[2], 16)\r
-            Value = '-'.join(Value[0:3]) + '-' + ''.join(Value[3:5]) + '-' + ''.join(Value[5:11])\r
+            TmpValue = GuidStructureStringToGuidString(Value)\r
+            if len(TmpValue) == 0:\r
+                raise BadExpression("Invalid GUID value string %s" % Value)\r
+            Value = TmpValue\r
         if Value[0] == '"' and Value[-1] == '"':\r
             Value = Value[1:-1]\r
         try:\r
             Value = "'" + uuid.UUID(Value).get_bytes_le() + "'"\r
         if Value[0] == '"' and Value[-1] == '"':\r
             Value = Value[1:-1]\r
         try:\r
             Value = "'" + uuid.UUID(Value).get_bytes_le() + "'"\r
-        except ValueError, Message:\r
-            raise BadExpression('%s' % Message)\r
+        except ValueError as Message:\r
+            raise BadExpression(Message)\r
         Value, Size = ParseFieldValue(Value)\r
         return Value, 16\r
     if Value.startswith('L"') and Value.endswith('"'):\r
         # Unicode String\r
         Value, Size = ParseFieldValue(Value)\r
         return Value, 16\r
     if Value.startswith('L"') and Value.endswith('"'):\r
         # Unicode String\r
-        List = list(Value[2:-1])\r
+        # translate escape character\r
+        Value = Value[1:]\r
+        try:\r
+            Value = eval(Value)\r
+        except:\r
+            Value = Value[1:-1]\r
+        List = list(Value)\r
         List.reverse()\r
         Value = 0\r
         for Char in List:\r
         List.reverse()\r
         Value = 0\r
         for Char in List:\r
@@ -1563,7 +1354,12 @@ def ParseFieldValue (Value):
         return Value, (len(List) + 1) * 2\r
     if Value.startswith('"') and Value.endswith('"'):\r
         # ASCII String\r
         return Value, (len(List) + 1) * 2\r
     if Value.startswith('"') and Value.endswith('"'):\r
         # ASCII String\r
-        List = list(Value[1:-1])\r
+        # translate escape character\r
+        try:\r
+            Value = eval(Value)\r
+        except:\r
+            Value = Value[1:-1]\r
+        List = list(Value)\r
         List.reverse()\r
         Value = 0\r
         for Char in List:\r
         List.reverse()\r
         Value = 0\r
         for Char in List:\r
@@ -1571,7 +1367,13 @@ def ParseFieldValue (Value):
         return Value, len(List) + 1\r
     if Value.startswith("L'") and Value.endswith("'"):\r
         # Unicode Character Constant\r
         return Value, len(List) + 1\r
     if Value.startswith("L'") and Value.endswith("'"):\r
         # Unicode Character Constant\r
-        List = list(Value[2:-1])\r
+        # translate escape character\r
+        Value = Value[1:]\r
+        try:\r
+            Value = eval(Value)\r
+        except:\r
+            Value = Value[1:-1]\r
+        List = list(Value)\r
         if len(List) == 0:\r
             raise BadExpression('Length %s is %s' % (Value, len(List)))\r
         List.reverse()\r
         if len(List) == 0:\r
             raise BadExpression('Length %s is %s' % (Value, len(List)))\r
         List.reverse()\r
@@ -1581,7 +1383,12 @@ def ParseFieldValue (Value):
         return Value, len(List) * 2\r
     if Value.startswith("'") and Value.endswith("'"):\r
         # Character constant\r
         return Value, len(List) * 2\r
     if Value.startswith("'") and Value.endswith("'"):\r
         # Character constant\r
-        List = list(Value[1:-1])\r
+        # translate escape character\r
+        try:\r
+            Value = eval(Value)\r
+        except:\r
+            Value = Value[1:-1]\r
+        List = list(Value)\r
         if len(List) == 0:\r
             raise BadExpression('Length %s is %s' % (Value, len(List)))\r
         List.reverse()\r
         if len(List) == 0:\r
             raise BadExpression('Length %s is %s' % (Value, len(List)))\r
         List.reverse()\r
@@ -1603,7 +1410,8 @@ def ParseFieldValue (Value):
                 Value = (Value << 8) | ((ItemValue >> 8 * I) & 0xff)\r
         return Value, RetSize\r
     if Value.startswith('DEVICE_PATH(') and Value.endswith(')'):\r
                 Value = (Value << 8) | ((ItemValue >> 8 * I) & 0xff)\r
         return Value, RetSize\r
     if Value.startswith('DEVICE_PATH(') and Value.endswith(')'):\r
-        Value = Value.split('"')[1]\r
+        Value = Value.replace("DEVICE_PATH(", '').rstrip(')')\r
+        Value = Value.strip().strip('"')\r
         return ParseDevPathValue(Value)\r
     if Value.lower().startswith('0x'):\r
         Value = int(Value, 16)\r
         return ParseDevPathValue(Value)\r
     if Value.lower().startswith('0x'):\r
         Value = int(Value, 16)\r
@@ -1624,7 +1432,7 @@ def ParseFieldValue (Value):
 ## AnalyzeDscPcd\r
 #\r
 #  Analyze DSC PCD value, since there is no data type info in DSC\r
 ## AnalyzeDscPcd\r
 #\r
 #  Analyze DSC PCD value, since there is no data type info in DSC\r
-#  This fuction is used to match functions (AnalyzePcdData, AnalyzeHiiPcdData, AnalyzeVpdPcdData) used for retrieving PCD value from database\r
+#  This fuction is used to match functions (AnalyzePcdData) used for retrieving PCD value from database\r
 #  1. Feature flag: TokenSpace.PcdCName|PcdValue\r
 #  2. Fix and Patch:TokenSpace.PcdCName|PcdValue[|MaxSize]\r
 #  3. Dynamic default:\r
 #  1. Feature flag: TokenSpace.PcdCName|PcdValue\r
 #  2. Fix and Patch:TokenSpace.PcdCName|PcdValue[|MaxSize]\r
 #  3. Dynamic default:\r
@@ -1668,7 +1476,7 @@ def AnalyzeDscPcd(Setting, PcdType, DataType=''):
 #         Value, Size = ParseFieldValue(Value)\r
         if Size:\r
             try:\r
 #         Value, Size = ParseFieldValue(Value)\r
         if Size:\r
             try:\r
-                int(Size,16) if Size.upper().startswith("0X") else int(Size)\r
+                int(Size, 16) if Size.upper().startswith("0X") else int(Size)\r
             except:\r
                 IsValid = False\r
                 Size = -1\r
             except:\r
                 IsValid = False\r
                 Size = -1\r
@@ -1682,14 +1490,6 @@ def AnalyzeDscPcd(Setting, PcdType, DataType=''):
             Type = DataType\r
         if len(FieldList) > 2:\r
             Size = FieldList[2]\r
             Type = DataType\r
         if len(FieldList) > 2:\r
             Size = FieldList[2]\r
-        else:\r
-            if Type == 'VOID*':\r
-                if Value.startswith("L"):\r
-                    Size = str((len(Value)- 3 + 1) * 2)\r
-                elif Value.startswith("{"):\r
-                    Size = str(len(Value.split(",")))\r
-                else:\r
-                    Size = str(len(Value) -2 + 1 )\r
         if DataType == "":\r
             IsValid = (len(FieldList) <= 1)\r
         else:\r
         if DataType == "":\r
             IsValid = (len(FieldList) <= 1)\r
         else:\r
@@ -1697,7 +1497,7 @@ def AnalyzeDscPcd(Setting, PcdType, DataType=''):
 \r
         if Size:\r
             try:\r
 \r
         if Size:\r
             try:\r
-                int(Size,16) if Size.upper().startswith("0X") else int(Size)\r
+                int(Size, 16) if Size.upper().startswith("0X") else int(Size)\r
             except:\r
                 IsValid = False\r
                 Size = -1\r
             except:\r
                 IsValid = False\r
                 Size = -1\r
@@ -1705,7 +1505,7 @@ def AnalyzeDscPcd(Setting, PcdType, DataType=''):
     elif PcdType in (MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_VPD):\r
         VpdOffset = FieldList[0]\r
         Value = Size = ''\r
     elif PcdType in (MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_VPD):\r
         VpdOffset = FieldList[0]\r
         Value = Size = ''\r
-        if not DataType == 'VOID*':\r
+        if not DataType == TAB_VOID:\r
             if len(FieldList) > 1:\r
                 Value = FieldList[1]\r
         else:\r
             if len(FieldList) > 1:\r
                 Value = FieldList[1]\r
         else:\r
@@ -1719,7 +1519,7 @@ def AnalyzeDscPcd(Setting, PcdType, DataType=''):
             IsValid = (len(FieldList) <= 3)\r
         if Size:\r
             try:\r
             IsValid = (len(FieldList) <= 3)\r
         if Size:\r
             try:\r
-                int(Size,16) if Size.upper().startswith("0X") else int(Size)\r
+                int(Size, 16) if Size.upper().startswith("0X") else int(Size)\r
             except:\r
                 IsValid = False\r
                 Size = -1\r
             except:\r
                 IsValid = False\r
                 Size = -1\r
@@ -1745,81 +1545,35 @@ def AnalyzeDscPcd(Setting, PcdType, DataType=''):
 #  Used to avoid split issue while the value string contain "|" character\r
 #\r
 #  @param[in] Setting:  A String contain value/datum type/token number information;\r
 #  Used to avoid split issue while the value string contain "|" character\r
 #\r
 #  @param[in] Setting:  A String contain value/datum type/token number information;\r
-#  \r
-#  @retval   ValueList: A List contain value, datum type and toke number. \r
+#\r
+#  @retval   ValueList: A List contain value, datum type and toke number.\r
 #\r
 def AnalyzePcdData(Setting):\r
     ValueList = ['', '', '']\r
 \r
     ValueRe = re.compile(r'^\s*L?\".*\|.*\"')\r
     PtrValue = ValueRe.findall(Setting)\r
 #\r
 def AnalyzePcdData(Setting):\r
     ValueList = ['', '', '']\r
 \r
     ValueRe = re.compile(r'^\s*L?\".*\|.*\"')\r
     PtrValue = ValueRe.findall(Setting)\r
-    \r
+\r
     ValueUpdateFlag = False\r
     ValueUpdateFlag = False\r
-    \r
+\r
     if len(PtrValue) >= 1:\r
         Setting = re.sub(ValueRe, '', Setting)\r
         ValueUpdateFlag = True\r
 \r
     TokenList = Setting.split(TAB_VALUE_SPLIT)\r
     ValueList[0:len(TokenList)] = TokenList\r
     if len(PtrValue) >= 1:\r
         Setting = re.sub(ValueRe, '', Setting)\r
         ValueUpdateFlag = True\r
 \r
     TokenList = Setting.split(TAB_VALUE_SPLIT)\r
     ValueList[0:len(TokenList)] = TokenList\r
-    \r
+\r
     if ValueUpdateFlag:\r
         ValueList[0] = PtrValue[0]\r
     if ValueUpdateFlag:\r
         ValueList[0] = PtrValue[0]\r
-        \r
-    return ValueList   \r
\r
-## AnalyzeHiiPcdData\r
-#\r
-#  Analyze the pcd Value, variable name, variable Guid and variable offset.\r
-#  Used to avoid split issue while the value string contain "|" character\r
-#\r
-#  @param[in] Setting:  A String contain VariableName, VariableGuid, VariableOffset, DefaultValue information;\r
-#  \r
-#  @retval   ValueList: A List contaian VariableName, VariableGuid, VariableOffset, DefaultValue. \r
-#\r
-def AnalyzeHiiPcdData(Setting):\r
-    ValueList = ['', '', '', '']\r
-\r
-    TokenList = GetSplitValueList(Setting)\r
-    ValueList[0:len(TokenList)] = TokenList\r
 \r
     return ValueList\r
 \r
 \r
     return ValueList\r
 \r
-## AnalyzeVpdPcdData\r
-#\r
-#  Analyze the vpd pcd VpdOffset, MaxDatumSize and InitialValue.\r
-#  Used to avoid split issue while the value string contain "|" character\r
-#\r
-#  @param[in] Setting:  A String contain VpdOffset/MaxDatumSize/InitialValue information;\r
-#  \r
-#  @retval   ValueList: A List contain VpdOffset, MaxDatumSize and InitialValue. \r
-#\r
-def AnalyzeVpdPcdData(Setting):\r
-    ValueList = ['', '', '']\r
-\r
-    ValueRe = re.compile(r'\s*L?\".*\|.*\"\s*$')\r
-    PtrValue = ValueRe.findall(Setting)\r
-    \r
-    ValueUpdateFlag = False\r
-    \r
-    if len(PtrValue) >= 1:\r
-        Setting = re.sub(ValueRe, '', Setting)\r
-        ValueUpdateFlag = True\r
-\r
-    TokenList = Setting.split(TAB_VALUE_SPLIT)\r
-    ValueList[0:len(TokenList)] = TokenList\r
-    \r
-    if ValueUpdateFlag:\r
-        ValueList[2] = PtrValue[0]\r
-        \r
-    return ValueList     \r
-\r
 ## check format of PCD value against its the datum type\r
 #\r
 # For PCD value setting\r
 #\r
 def CheckPcdDatum(Type, Value):\r
 ## check format of PCD value against its the datum type\r
 #\r
 # For PCD value setting\r
 #\r
 def CheckPcdDatum(Type, Value):\r
-    if Type == "VOID*":\r
+    if Type == TAB_VOID:\r
         ValueRe = re.compile(r'\s*L?\".*\"\s*$')\r
         if not (((Value.startswith('L"') or Value.startswith('"')) and Value.endswith('"'))\r
                 or (Value.startswith('{') and Value.endswith('}')) or (Value.startswith("L'") or Value.startswith("'") and Value.endswith("'"))\r
         ValueRe = re.compile(r'\s*L?\".*\"\s*$')\r
         if not (((Value.startswith('L"') or Value.startswith('"')) and Value.endswith('"'))\r
                 or (Value.startswith('{') and Value.endswith('}')) or (Value.startswith("L'") or Value.startswith("'") and Value.endswith("'"))\r
@@ -1837,8 +1591,7 @@ def CheckPcdDatum(Type, Value):
             Printset.add(TAB_PRINTCHAR_BS)\r
             Printset.add(TAB_PRINTCHAR_NUL)\r
             if not set(Value).issubset(Printset):\r
             Printset.add(TAB_PRINTCHAR_BS)\r
             Printset.add(TAB_PRINTCHAR_NUL)\r
             if not set(Value).issubset(Printset):\r
-                PrintList = list(Printset)\r
-                PrintList.sort()\r
+                PrintList = sorted(Printset)\r
                 return False, "Invalid PCD string value of type [%s]; must be printable chars %s." % (Type, PrintList)\r
     elif Type == 'BOOLEAN':\r
         if Value not in ['TRUE', 'True', 'true', '0x1', '0x01', '1', 'FALSE', 'False', 'false', '0x0', '0x00', '0']:\r
                 return False, "Invalid PCD string value of type [%s]; must be printable chars %s." % (Type, PrintList)\r
     elif Type == 'BOOLEAN':\r
         if Value not in ['TRUE', 'True', 'true', '0x1', '0x01', '1', 'FALSE', 'False', 'false', '0x0', '0x00', '0']:\r
@@ -1923,7 +1676,7 @@ def ConvertStringToByteArray(Value):
 \r
     Value = eval(Value)         # translate escape character\r
     NewValue = '{'\r
 \r
     Value = eval(Value)         # translate escape character\r
     NewValue = '{'\r
-    for Index in range(0,len(Value)):\r
+    for Index in range(0, len(Value)):\r
         if Unicode:\r
             NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ','\r
         else:\r
         if Unicode:\r
             NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ','\r
         else:\r
@@ -2000,7 +1753,7 @@ class PathClass(object):
     # @retval True  The two PathClass are the same\r
     #\r
     def __eq__(self, Other):\r
     # @retval True  The two PathClass are the same\r
     #\r
     def __eq__(self, Other):\r
-        if type(Other) == type(self):\r
+        if isinstance(Other, type(self)):\r
             return self.Path == Other.Path\r
         else:\r
             return self.Path == str(Other)\r
             return self.Path == Other.Path\r
         else:\r
             return self.Path == str(Other)\r
@@ -2013,11 +1766,11 @@ class PathClass(object):
     # @retval -1    The first PathClass is less than the second PathClass\r
     # @retval 1     The first PathClass is Bigger than the second PathClass\r
     def __cmp__(self, Other):\r
     # @retval -1    The first PathClass is less than the second PathClass\r
     # @retval 1     The first PathClass is Bigger than the second PathClass\r
     def __cmp__(self, Other):\r
-        if type(Other) == type(self):\r
+        if isinstance(Other, type(self)):\r
             OtherKey = Other.Path\r
         else:\r
             OtherKey = str(Other)\r
             OtherKey = Other.Path\r
         else:\r
             OtherKey = str(Other)\r
-            \r
+\r
         SelfKey = self.Path\r
         if SelfKey == OtherKey:\r
             return 0\r
         SelfKey = self.Path\r
         if SelfKey == OtherKey:\r
             return 0\r
@@ -2036,7 +1789,7 @@ class PathClass(object):
         return hash(self.Path)\r
 \r
     def _GetFileKey(self):\r
         return hash(self.Path)\r
 \r
     def _GetFileKey(self):\r
-        if self._Key == None:\r
+        if self._Key is None:\r
             self._Key = self.Path.upper()   # + self.ToolChainFamily + self.TagName + self.ToolCode + self.Target\r
         return self._Key\r
 \r
             self._Key = self.Path.upper()   # + self.ToolChainFamily + self.TagName + self.ToolCode + self.Target\r
         return self._Key\r
 \r
@@ -2155,7 +1908,7 @@ class PeImageClass():
     def _ByteListToStr(self, ByteList):\r
         String = ''\r
         for index in range(len(ByteList)):\r
     def _ByteListToStr(self, ByteList):\r
         String = ''\r
         for index in range(len(ByteList)):\r
-            if ByteList[index] == 0: \r
+            if ByteList[index] == 0:\r
                 break\r
             String += chr(ByteList[index])\r
         return String\r
                 break\r
             String += chr(ByteList[index])\r
         return String\r
@@ -2167,48 +1920,48 @@ class PeImageClass():
         return Value\r
 \r
 class DefaultStore():\r
         return Value\r
 \r
 class DefaultStore():\r
-    def __init__(self,DefaultStores ):\r
+    def __init__(self, DefaultStores ):\r
 \r
         self.DefaultStores = DefaultStores\r
 \r
         self.DefaultStores = DefaultStores\r
-    def DefaultStoreID(self,DefaultStoreName):\r
-        for key,value in self.DefaultStores.items():\r
+    def DefaultStoreID(self, DefaultStoreName):\r
+        for key, value in self.DefaultStores.items():\r
             if value == DefaultStoreName:\r
                 return key\r
         return None\r
     def GetDefaultDefault(self):\r
         if not self.DefaultStores or "0" in self.DefaultStores:\r
             if value == DefaultStoreName:\r
                 return key\r
         return None\r
     def GetDefaultDefault(self):\r
         if not self.DefaultStores or "0" in self.DefaultStores:\r
-            return "0",TAB_DEFAULT_STORES_DEFAULT\r
+            return "0", TAB_DEFAULT_STORES_DEFAULT\r
         else:\r
         else:\r
-            minvalue = min([int(value_str) for value_str in self.DefaultStores.keys()])\r
+            minvalue = min(int(value_str) for value_str in self.DefaultStores)\r
             return (str(minvalue), self.DefaultStores[str(minvalue)])\r
             return (str(minvalue), self.DefaultStores[str(minvalue)])\r
-    def GetMin(self,DefaultSIdList):\r
+    def GetMin(self, DefaultSIdList):\r
         if not DefaultSIdList:\r
         if not DefaultSIdList:\r
-            return "STANDARD"\r
+            return TAB_DEFAULT_STORES_DEFAULT\r
         storeidset = {storeid for storeid, storename in self.DefaultStores.values() if storename in DefaultSIdList}\r
         if not storeidset:\r
             return ""\r
         minid = min(storeidset )\r
         storeidset = {storeid for storeid, storename in self.DefaultStores.values() if storename in DefaultSIdList}\r
         if not storeidset:\r
             return ""\r
         minid = min(storeidset )\r
-        for sid,name in self.DefaultStores.values():\r
+        for sid, name in self.DefaultStores.values():\r
             if sid == minid:\r
                 return name\r
 class SkuClass():\r
             if sid == minid:\r
                 return name\r
 class SkuClass():\r
-    \r
+\r
     DEFAULT = 0\r
     SINGLE = 1\r
     MULTIPLE =2\r
     DEFAULT = 0\r
     SINGLE = 1\r
     MULTIPLE =2\r
-    \r
+\r
     def __init__(self,SkuIdentifier='', SkuIds=None):\r
         if SkuIds is None:\r
             SkuIds = {}\r
 \r
         for SkuName in SkuIds:\r
             SkuId = SkuIds[SkuName][0]\r
     def __init__(self,SkuIdentifier='', SkuIds=None):\r
         if SkuIds is None:\r
             SkuIds = {}\r
 \r
         for SkuName in SkuIds:\r
             SkuId = SkuIds[SkuName][0]\r
-            skuid_num = int(SkuId,16) if SkuId.upper().startswith("0X") else int(SkuId)\r
+            skuid_num = int(SkuId, 16) if SkuId.upper().startswith("0X") else int(SkuId)\r
             if skuid_num > 0xFFFFFFFFFFFFFFFF:\r
                 EdkLogger.error("build", PARAMETER_INVALID,\r
                             ExtraData = "SKU-ID [%s] value %s exceeds the max value of UINT64"\r
                                       % (SkuName, SkuId))\r
             if skuid_num > 0xFFFFFFFFFFFFFFFF:\r
                 EdkLogger.error("build", PARAMETER_INVALID,\r
                             ExtraData = "SKU-ID [%s] value %s exceeds the max value of UINT64"\r
                                       % (SkuName, SkuId))\r
-        \r
+\r
         self.AvailableSkuIds = sdict()\r
         self.SkuIdSet = []\r
         self.SkuIdNumberSet = []\r
         self.AvailableSkuIds = sdict()\r
         self.SkuIdSet = []\r
         self.SkuIdNumberSet = []\r
@@ -2222,10 +1975,10 @@ class SkuClass():
             self.SkuIdSet = SkuIds.keys()\r
             self.SkuIdNumberSet = [num[0].strip() + 'U' for num in SkuIds.values()]\r
         else:\r
             self.SkuIdSet = SkuIds.keys()\r
             self.SkuIdNumberSet = [num[0].strip() + 'U' for num in SkuIds.values()]\r
         else:\r
-            r = SkuIdentifier.split('|') \r
+            r = SkuIdentifier.split('|')\r
             self.SkuIdSet=[(r[k].strip()).upper() for k in range(len(r))]\r
             k = None\r
             self.SkuIdSet=[(r[k].strip()).upper() for k in range(len(r))]\r
             k = None\r
-            try: \r
+            try:\r
                 self.SkuIdNumberSet = [SkuIds[k][0].strip() + 'U' for k in self.SkuIdSet]\r
             except Exception:\r
                 EdkLogger.error("build", PARAMETER_INVALID,\r
                 self.SkuIdNumberSet = [SkuIds[k][0].strip() + 'U' for k in self.SkuIdSet]\r
             except Exception:\r
                 EdkLogger.error("build", PARAMETER_INVALID,\r
@@ -2244,6 +1997,10 @@ class SkuClass():
             GlobalData.gSkuids = (self.SkuIdSet)\r
             if 'COMMON' in GlobalData.gSkuids:\r
                 GlobalData.gSkuids.remove('COMMON')\r
             GlobalData.gSkuids = (self.SkuIdSet)\r
             if 'COMMON' in GlobalData.gSkuids:\r
                 GlobalData.gSkuids.remove('COMMON')\r
+            if self.SkuUsageType == self.SINGLE:\r
+                if len(GlobalData.gSkuids) != 1:\r
+                    if 'DEFAULT' in GlobalData.gSkuids:\r
+                        GlobalData.gSkuids.remove('DEFAULT')\r
             if GlobalData.gSkuids:\r
                 GlobalData.gSkuids.sort()\r
 \r
             if GlobalData.gSkuids:\r
                 GlobalData.gSkuids.sort()\r
 \r
@@ -2252,14 +2009,14 @@ class SkuClass():
             self.__SkuInherit = {}\r
             for item in self.SkuData.values():\r
                 self.__SkuInherit[item[1]]=item[2] if item[2] else "DEFAULT"\r
             self.__SkuInherit = {}\r
             for item in self.SkuData.values():\r
                 self.__SkuInherit[item[1]]=item[2] if item[2] else "DEFAULT"\r
-        return self.__SkuInherit.get(skuname,"DEFAULT")\r
+        return self.__SkuInherit.get(skuname, "DEFAULT")\r
 \r
 \r
-    def GetSkuChain(self,sku):\r
+    def GetSkuChain(self, sku):\r
         if sku == "DEFAULT":\r
             return ["DEFAULT"]\r
         skulist = [sku]\r
         nextsku = sku\r
         if sku == "DEFAULT":\r
             return ["DEFAULT"]\r
         skulist = [sku]\r
         nextsku = sku\r
-        while 1:\r
+        while True:\r
             nextsku = self.GetNextSkuId(nextsku)\r
             skulist.append(nextsku)\r
             if nextsku == "DEFAULT":\r
             nextsku = self.GetNextSkuId(nextsku)\r
             skulist.append(nextsku)\r
             if nextsku == "DEFAULT":\r
@@ -2270,9 +2027,9 @@ class SkuClass():
         skuorderset = []\r
         for skuname in self.SkuIdSet:\r
             skuorderset.append(self.GetSkuChain(skuname))\r
         skuorderset = []\r
         for skuname in self.SkuIdSet:\r
             skuorderset.append(self.GetSkuChain(skuname))\r
-        \r
+\r
         skuorder = []\r
         skuorder = []\r
-        for index in range(max([len(item) for item in skuorderset])):\r
+        for index in range(max(len(item) for item in skuorderset)):\r
             for subset in skuorderset:\r
                 if index > len(subset)-1:\r
                     continue\r
             for subset in skuorderset:\r
                 if index > len(subset)-1:\r
                     continue\r
@@ -2282,8 +2039,8 @@ class SkuClass():
 \r
         return skuorder\r
 \r
 \r
         return skuorder\r
 \r
-    def __SkuUsageType(self): \r
-        \r
+    def __SkuUsageType(self):\r
+\r
         if self.__SkuIdentifier.upper() == "ALL":\r
             return SkuClass.MULTIPLE\r
 \r
         if self.__SkuIdentifier.upper() == "ALL":\r
             return SkuClass.MULTIPLE\r
 \r
@@ -2316,7 +2073,7 @@ class SkuClass():
         return ArrayStr\r
     def __GetAvailableSkuIds(self):\r
         return self.AvailableSkuIds\r
         return ArrayStr\r
     def __GetAvailableSkuIds(self):\r
         return self.AvailableSkuIds\r
-    \r
+\r
     def __GetSystemSkuID(self):\r
         if self.__SkuUsageType() == SkuClass.SINGLE:\r
             if len(self.SkuIdSet) == 1:\r
     def __GetSystemSkuID(self):\r
         if self.__SkuUsageType() == SkuClass.SINGLE:\r
             if len(self.SkuIdSet) == 1:\r
@@ -2336,46 +2093,8 @@ class SkuClass():
 # Pack a registry format GUID\r
 #\r
 def PackRegistryFormatGuid(Guid):\r
 # Pack a registry format GUID\r
 #\r
 def PackRegistryFormatGuid(Guid):\r
-    Guid = Guid.split('-')\r
-    return pack('=LHHBBBBBBBB',\r
-                int(Guid[0], 16),\r
-                int(Guid[1], 16),\r
-                int(Guid[2], 16),\r
-                int(Guid[3][-4:-2], 16),\r
-                int(Guid[3][-2:], 16),\r
-                int(Guid[4][-12:-10], 16),\r
-                int(Guid[4][-10:-8], 16),\r
-                int(Guid[4][-8:-6], 16),\r
-                int(Guid[4][-6:-4], 16),\r
-                int(Guid[4][-4:-2], 16),\r
-                int(Guid[4][-2:], 16)\r
-                )\r
+    return PackGUID(Guid.split('-'))\r
 \r
 \r
-def BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, Value):\r
-    if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64,'BOOLEAN']:\r
-        if Value.startswith('L'):\r
-            if not Value[1]:\r
-                EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')\r
-            Value = Value[0] + '"' + Value[1:] + '"'\r
-        elif Value.startswith('H'):\r
-            if not Value[1]:\r
-                EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')\r
-            Value = Value[1:]\r
-        else:\r
-            if not Value[0]:\r
-                EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')\r
-            Value = '"' + Value + '"'\r
-\r
-    IsValid, Cause = CheckPcdDatum(PcdDatumType, Value)\r
-    if not IsValid:\r
-        EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
-    if PcdDatumType == 'BOOLEAN':\r
-        Value = Value.upper()\r
-        if Value == 'TRUE' or Value == '1':\r
-            Value = '1'\r
-        elif Value == 'FALSE' or Value == '0':\r
-            Value = '0'\r
-    return  Value\r
 ##  Get the integer value from string like "14U" or integer like 2\r
 #\r
 #   @param      Input   The object that may be either a integer value or a string\r
 ##  Get the integer value from string like "14U" or integer like 2\r
 #\r
 #   @param      Input   The object that may be either a integer value or a string\r
@@ -2400,6 +2119,42 @@ def GetIntegerValue(Input):
     else:\r
         return int(String)\r
 \r
     else:\r
         return int(String)\r
 \r
+#\r
+# Pack a GUID (registry format) list into a buffer and return it\r
+#\r
+def PackGUID(Guid):\r
+    return pack(PACK_PATTERN_GUID,\r
+                int(Guid[0], 16),\r
+                int(Guid[1], 16),\r
+                int(Guid[2], 16),\r
+                int(Guid[3][-4:-2], 16),\r
+                int(Guid[3][-2:], 16),\r
+                int(Guid[4][-12:-10], 16),\r
+                int(Guid[4][-10:-8], 16),\r
+                int(Guid[4][-8:-6], 16),\r
+                int(Guid[4][-6:-4], 16),\r
+                int(Guid[4][-4:-2], 16),\r
+                int(Guid[4][-2:], 16)\r
+                )\r
+\r
+#\r
+# Pack a GUID (byte) list into a buffer and return it\r
+#\r
+def PackByteFormatGUID(Guid):\r
+    return pack(PACK_PATTERN_GUID,\r
+                Guid[0],\r
+                Guid[1],\r
+                Guid[2],\r
+                Guid[3],\r
+                Guid[4],\r
+                Guid[5],\r
+                Guid[6],\r
+                Guid[7],\r
+                Guid[8],\r
+                Guid[9],\r
+                Guid[10],\r
+                )\r
+\r
 ##\r
 #\r
 # This acts like the main() function for the script, unless it is 'import'ed into another\r
 ##\r
 #\r
 # This acts like the main() function for the script, unless it is 'import'ed into another\r