]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Common/EdkIIWorkspace.py
BaseTools: Add new RegExp for future use
[mirror_edk2.git] / BaseTools / Source / Python / Common / EdkIIWorkspace.py
CommitLineData
30fdf114
LG
1## @file\r
2# This is the base class for applications that operate on an EDK II Workspace \r
3#\r
1be2ed90 4# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
40d841f6 5# This program and the accompanying materials\r
30fdf114
LG
6# are licensed and made available under the terms and conditions of the BSD License\r
7# which accompanies this distribution. The full text of the license may be found at\r
8# http://opensource.org/licenses/bsd-license.php\r
9#\r
10# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12#\r
13\r
14##\r
15# Import Modules\r
16#\r
1be2ed90 17import Common.LongFilePathOs as os, sys, time\r
30fdf114 18from DataType import *\r
1be2ed90 19from Common.LongFilePathSupport import OpenLongFilePath as open\r
05cc51ad 20from Common.MultipleWorkspace import MultipleWorkspace as mws\r
30fdf114
LG
21\r
22## EdkIIWorkspace\r
23#\r
24# Collect WorkspaceDir from the environment, the Verbose command line flag, and detect an icon bitmap file.\r
25# \r
26# @var StartTime: Time of build system starting\r
27# @var PrintRunTime: Printable time of build system running\r
28# @var PrintRunStatus: Printable status of build system running\r
29# @var RunStatus: Status of build system running\r
30#\r
31class EdkIIWorkspace:\r
32 def __init__(self):\r
33 self.StartTime = time.time()\r
34 self.PrintRunTime = False\r
35 self.PrintRunStatus = False\r
36 self.RunStatus = ''\r
37 \r
38 #\r
39 # Check environment valiable 'WORKSPACE'\r
40 #\r
41 if os.environ.get('WORKSPACE') == None:\r
42 print 'ERROR: WORKSPACE not defined. Please run EdkSetup from the EDK II install directory.'\r
43 return False\r
44\r
45 self.CurrentWorkingDir = os.getcwd()\r
46 \r
47 self.WorkspaceDir = os.path.realpath(os.environ.get('WORKSPACE'))\r
48 (Drive, Path) = os.path.splitdrive(self.WorkspaceDir)\r
49 if Drive == '':\r
50 (Drive, CwdPath) = os.path.splitdrive(self.CurrentWorkingDir)\r
51 if Drive != '':\r
52 self.WorkspaceDir = Drive + Path\r
53 else:\r
54 self.WorkspaceDir = Drive.upper() + Path\r
55\r
56 self.WorkspaceRelativeWorkingDir = self.WorkspaceRelativePath (self.CurrentWorkingDir)\r
57 \r
58 try:\r
59 #\r
60 # Load TianoCoreOrgLogo, used for GUI tool\r
61 #\r
47fea6af 62 self.Icon = wx.Icon(self.WorkspaceFile('tools/Python/TianoCoreOrgLogo.gif'), wx.BITMAP_TYPE_GIF)\r
30fdf114
LG
63 except:\r
64 self.Icon = None\r
65 \r
66 self.Verbose = False\r
67 for Arg in sys.argv:\r
68 if Arg.lower() == '-v':\r
69 self.Verbose = True\r
70 \r
71 ## Close build system\r
72 #\r
73 # Close build system and print running time and status\r
74 #\r
75 def Close(self):\r
76 if self.PrintRunTime:\r
77 Seconds = int(time.time() - self.StartTime)\r
78 if Seconds < 60:\r
79 print 'Run Time: %d seconds' % (Seconds)\r
80 else:\r
81 Minutes = Seconds / 60\r
82 Seconds = Seconds % 60\r
83 if Minutes < 60:\r
84 print 'Run Time: %d minutes %d seconds' % (Minutes, Seconds)\r
85 else:\r
86 Hours = Minutes / 60\r
87 Minutes = Minutes % 60\r
88 print 'Run Time: %d hours %d minutes %d seconds' % (Hours, Minutes, Seconds)\r
89 if self.RunStatus != '':\r
90 print self.RunStatus\r
91\r
92 ## Convert to a workspace relative filename\r
93 #\r
94 # Convert a full path filename to a workspace relative filename.\r
95 #\r
96 # @param FileName: The filename to be Converted\r
97 #\r
98 # @retval None Workspace dir is not found in the full path\r
99 # @retval string The relative filename\r
100 #\r
101 def WorkspaceRelativePath(self, FileName):\r
102 FileName = os.path.realpath(FileName)\r
103 if FileName.find(self.WorkspaceDir) != 0:\r
104 return None\r
105 return FileName.replace (self.WorkspaceDir, '').strip('\\').strip('/')\r
106\r
107 ## Convert to a full path filename\r
108 #\r
109 # Convert a workspace relative filename to a full path filename.\r
110 #\r
111 # @param FileName: The filename to be Converted\r
112 #\r
113 # @retval string The full path filename\r
114 #\r
115 def WorkspaceFile(self, FileName):\r
05cc51ad 116 return os.path.realpath(mws.join(self.WorkspaceDir,FileName))\r
30fdf114
LG
117\r
118 ## Convert to a real path filename\r
119 #\r
120 # Convert ${WORKSPACE} to real path\r
121 #\r
122 # @param FileName: The filename to be Converted\r
123 #\r
124 # @retval string The full path filename\r
125 #\r
126 def WorkspacePathConvert(self, FileName):\r
127 return os.path.realpath(FileName.replace(TAB_WORKSPACE, self.WorkspaceDir))\r
128\r
129 ## Convert XML into a DOM\r
130 #\r
131 # Parse an XML file into a DOM and return the DOM.\r
132 #\r
133 # @param FileName: The filename to be parsed\r
134 #\r
135 # @retval XmlParseFile (self.WorkspaceFile(FileName))\r
136 #\r
137 def XmlParseFile (self, FileName):\r
138 if self.Verbose:\r
139 print FileName\r
140 return XmlParseFile (self.WorkspaceFile(FileName))\r
141\r
142 ## Convert a XML section\r
143 #\r
144 # Parse a section of an XML file into a DOM(Document Object Model) and return the DOM.\r
145 #\r
146 # @param FileName: The filename to be parsed\r
147 # @param SectionTag: The tag name of the section to be parsed\r
148 #\r
149 # @retval XmlParseFileSection (self.WorkspaceFile(FileName), SectionTag)\r
150 #\r
151 def XmlParseFileSection (self, FileName, SectionTag):\r
152 if self.Verbose:\r
153 print FileName\r
47fea6af 154 return XmlParseFileSection (self.WorkspaceFile(FileName), SectionTag)\r
30fdf114
LG
155\r
156 ## Save a XML file\r
157 #\r
158 # Save a DOM(Document Object Model) into an XML file.\r
159 #\r
160 # @param Dom: The Dom to be saved\r
161 # @param FileName: The filename\r
162 #\r
163 # @retval XmlSaveFile (Dom, self.WorkspaceFile(FileName))\r
164 #\r
165 def XmlSaveFile (self, Dom, FileName):\r
166 if self.Verbose:\r
167 print FileName\r
168 return XmlSaveFile (Dom, self.WorkspaceFile(FileName))\r
169\r
170 ## Convert Text File To Dictionary\r
171 #\r
172 # Convert a workspace relative text file to a dictionary of (name:value) pairs.\r
173 #\r
174 # @param FileName: Text filename\r
175 # @param Dictionary: Dictionary to store data\r
176 # @param CommentCharacter: Comment char, be used to ignore comment content\r
177 # @param KeySplitCharacter: Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
178 # @param ValueSplitFlag: Value split flag, be used to decide if has multiple values\r
179 # @param ValueSplitCharacter: Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char\r
180 #\r
181 # @retval ConvertTextFileToDictionary(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)\r
182 #\r
183 def ConvertTextFileToDictionary(self, FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):\r
184 if self.Verbose:\r
185 print FileName\r
186 return ConvertTextFileToDictionary(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)\r
187\r
188 ## Convert Dictionary To Text File\r
189 #\r
190 # Convert a dictionary of (name:value) pairs to a workspace relative text file.\r
191 #\r
192 # @param FileName: Text filename\r
193 # @param Dictionary: Dictionary to store data\r
194 # @param CommentCharacter: Comment char, be used to ignore comment content\r
195 # @param KeySplitCharacter: Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
196 # @param ValueSplitFlag: Value split flag, be used to decide if has multiple values\r
197 # @param ValueSplitCharacter: Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char\r
198 #\r
199 # @retval ConvertDictionaryToTextFile(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)\r
200 #\r
201 def ConvertDictionaryToTextFile(self, FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):\r
202 if self.Verbose:\r
203 print FileName\r
204 return ConvertDictionaryToTextFile(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)\r
205\r
206## Convert Text File To Dictionary\r
207#\r
208# Convert a text file to a dictionary of (name:value) pairs.\r
209#\r
210# @param FileName: Text filename\r
211# @param Dictionary: Dictionary to store data\r
212# @param CommentCharacter: Comment char, be used to ignore comment content\r
213# @param KeySplitCharacter: Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
214# @param ValueSplitFlag: Value split flag, be used to decide if has multiple values\r
215# @param ValueSplitCharacter: Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char\r
216#\r
217# @retval True Convert successfully\r
218# @retval False Open file failed\r
219#\r
220def ConvertTextFileToDictionary(FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):\r
221 try:\r
47fea6af 222 F = open(FileName, 'r')\r
30fdf114
LG
223 except:\r
224 return False\r
225 Keys = []\r
226 for Line in F:\r
47fea6af 227 LineList = Line.split(KeySplitCharacter, 1)\r
30fdf114
LG
228 if len(LineList) >= 2:\r
229 Key = LineList[0].split()\r
47fea6af 230 if len(Key) == 1 and Key[0][0] != CommentCharacter and Key[0] not in Keys:\r
30fdf114 231 if ValueSplitFlag:\r
47fea6af 232 Dictionary[Key[0]] = LineList[1].replace('\\', '/').split(ValueSplitCharacter)\r
30fdf114 233 else:\r
47fea6af 234 Dictionary[Key[0]] = LineList[1].strip().replace('\\', '/')\r
30fdf114
LG
235 Keys += [Key[0]]\r
236 F.close()\r
237 return True\r
238\r
239## Convert Dictionary To Text File\r
240#\r
241# Convert a dictionary of (name:value) pairs to a text file.\r
242#\r
243# @param FileName: Text filename\r
244# @param Dictionary: Dictionary to store data\r
245# @param CommentCharacter: Comment char, be used to ignore comment content\r
246# @param KeySplitCharacter: Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
247# @param ValueSplitFlag: Value split flag, be used to decide if has multiple values\r
248# @param ValueSplitCharacter: Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char\r
249#\r
250# @retval True Convert successfully\r
251# @retval False Open file failed\r
252#\r
253def ConvertDictionaryToTextFile(FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):\r
254 try:\r
47fea6af 255 F = open(FileName, 'r')\r
30fdf114
LG
256 Lines = []\r
257 Lines = F.readlines()\r
258 F.close()\r
259 except:\r
260 Lines = []\r
261 Keys = Dictionary.keys()\r
262 MaxLength = 0\r
263 for Key in Keys:\r
264 if len(Key) > MaxLength:\r
265 MaxLength = len(Key)\r
266 Index = 0\r
267 for Line in Lines:\r
47fea6af 268 LineList = Line.split(KeySplitCharacter, 1)\r
30fdf114
LG
269 if len(LineList) >= 2:\r
270 Key = LineList[0].split()\r
271 if len(Key) == 1 and Key[0][0] != CommentCharacter and Key[0] in Dictionary:\r
272 if ValueSplitFlag:\r
273 Line = '%-*s %c %s\n' % (MaxLength, Key[0], KeySplitCharacter, ' '.join(Dictionary[Key[0]]))\r
274 else:\r
275 Line = '%-*s %c %s\n' % (MaxLength, Key[0], KeySplitCharacter, Dictionary[Key[0]])\r
276 Lines.pop(Index)\r
277 if Key[0] in Keys:\r
47fea6af 278 Lines.insert(Index, Line)\r
30fdf114
LG
279 Keys.remove(Key[0])\r
280 Index += 1\r
281 for RemainingKey in Keys:\r
282 if ValueSplitFlag:\r
47fea6af 283 Line = '%-*s %c %s\n' % (MaxLength, RemainingKey, KeySplitCharacter, ' '.join(Dictionary[RemainingKey]))\r
30fdf114
LG
284 else:\r
285 Line = '%-*s %c %s\n' % (MaxLength, RemainingKey, KeySplitCharacter, Dictionary[RemainingKey])\r
286 Lines.append(Line)\r
287 try:\r
47fea6af 288 F = open(FileName, 'w')\r
30fdf114
LG
289 except:\r
290 return False\r
291 F.writelines(Lines)\r
292 F.close()\r
293 return True\r
294\r
295## Create a new directory\r
296#\r
297# @param Directory: Directory to be created\r
298#\r
299def CreateDirectory(Directory):\r
300 if not os.access(Directory, os.F_OK):\r
301 os.makedirs (Directory)\r
302\r
303## Create a new file\r
304#\r
305# @param Directory: Directory to be created\r
306# @param FileName: Filename to be created\r
307# @param Mode: The mode of open file, defautl is 'w'\r
308#\r
309def CreateFile(Directory, FileName, Mode='w'):\r
310 CreateDirectory (Directory)\r
311 return open(os.path.join(Directory, FileName), Mode)\r
312\r
313##\r
314#\r
315# This acts like the main() function for the script, unless it is 'import'ed into another\r
316# script.\r
317#\r
318if __name__ == '__main__':\r
319 # Nothing to do here. Could do some unit tests\r
320 pass