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