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
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
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 is not 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
\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 is not 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 is not 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 is not None:\r
- return True, NewFile\r
-\r
- # Second check the path with override value\r
- if OverrideDir != '' and OverrideDir is not None:\r
- NewFile = AllFiles[os.path.normpath(os.path.join(OverrideDir, File))]\r
- if NewFile is not 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 is not 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 is not 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 is not 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 is not None:\r
- NewFile = AllFiles[os.path.normpath(os.path.join(OverrideDir, File))]\r
- if NewFile is not 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 is not 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
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
-\r
def IsFieldValueAnArray (Value):\r
Value = Value.strip()\r
if Value.startswith('GUID') and Value.endswith(')'):\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
\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
-## 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