Import BaseMemoryLibMmx;
[mirror_edk2.git] / Tools / Python / ContextTool.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2007, Intel Corporation
4 # All rights reserved. This program and the accompanying materials
5 # are licensed and made available under the terms and conditions of the BSD License
6 # which accompanies this distribution. The full text of the license may be found at
7 # http://opensource.org/licenses/bsd-license.php
8 #
9 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 """The EDK II Build System Context Tool Utility maintains Target.txt settings
13 in an EDK II Workspace."""
14
15 import wx, os, sys, copy
16 from EdkIIWorkspace import *
17
18 class ContextToolModel(EdkIIWorkspace):
19 def __init__(self):
20 self.WorkspaceStatus = EdkIIWorkspace.__init__(self)
21 self.Database = {}
22 self.OriginalDatabase = {}
23
24 def LoadTargetTxtFile(self):
25 self.ConvertTextFileToDictionary('Tools/Conf/Target.txt', self.TargetTxtDictionary, '#', '=', True, None)
26 if self.TargetTxtDictionary['ACTIVE_PLATFORM'] == []:
27 self.TargetTxtDictionary['ACTIVE_PLATFORM'] = ['']
28 else:
29 self.TargetTxtDictionary['ACTIVE_PLATFORM'] = [self.TargetTxtDictionary['ACTIVE_PLATFORM'][0]]
30 self.TargetTxtDictionary['TOOL_CHAIN_CONF'] = [self.TargetTxtDictionary['TOOL_CHAIN_CONF'][0]]
31 self.TargetTxtDictionary['MULTIPLE_THREAD'] = [self.TargetTxtDictionary['MULTIPLE_THREAD'][0]]
32 self.TargetTxtDictionary['MAX_CONCURRENT_THREAD_NUMBER'] = [self.TargetTxtDictionary['MAX_CONCURRENT_THREAD_NUMBER'][0]]
33 self.TargetTxtDictionary['TARGET'] = list(set(self.TargetTxtDictionary['TARGET']))
34 self.TargetTxtDictionary['TOOL_CHAIN_TAG'] = list(set(self.TargetTxtDictionary['TOOL_CHAIN_TAG']))
35 self.TargetTxtDictionary['TARGET_ARCH'] = list(set(self.TargetTxtDictionary['TARGET_ARCH']))
36 if self.TargetTxtDictionary['TARGET'] == []:
37 self.TargetTxtDictionary['TARGET'] = ['']
38 if self.TargetTxtDictionary['TOOL_CHAIN_TAG'] == []:
39 self.TargetTxtDictionary['TOOL_CHAIN_TAG'] = ['']
40 if self.TargetTxtDictionary['TARGET_ARCH'] == []:
41 self.TargetTxtDictionary['TARGET_ARCH'] = ['']
42 self.TargetTxtDictionary['TARGET'].sort()
43 self.TargetTxtDictionary['TOOL_CHAIN_TAG'].sort()
44 self.TargetTxtDictionary['TARGET_ARCH'].sort()
45 self.OriginalTargetTxtDictionary = copy.deepcopy(self.TargetTxtDictionary)
46
47 def LoadToolsDefTxtFile(self):
48 self.ToolsDefTxtDictionary = {}
49 if self.TargetTxtDictionary['TOOL_CHAIN_CONF'] != ['']:
50 self.ConvertTextFileToDictionary(self.TargetTxtDictionary['TOOL_CHAIN_CONF'][0], self.ToolsDefTxtDictionary, '#', '=', False, None)
51
52 def LoadFrameworkDatabase(self):
53 self.PlatformDatabase = {}
54 Fd = self.XmlParseFile ('Tools/Conf/FrameworkDatabase.db')
55 PlatformList = XmlList (Fd, '/FrameworkDatabase/PlatformList/Filename')
56 for File in PlatformList:
57 FpdFileName = XmlElementData(File)
58 FpdPlatformHeader = self.XmlParseFileSection (FpdFileName, 'PlatformHeader')
59 FpdPlatformDefinitions = self.XmlParseFileSection (FpdFileName,'PlatformDefinitions')
60 PlatformName = XmlElement (FpdPlatformHeader, '/PlatformHeader/PlatformName')
61 PlatformVersion = XmlElement (FpdPlatformHeader, '/PlatformHeader/Version')
62 PlatformUiName = PlatformName + '[' + PlatformVersion + ']'
63 if PlatformUiName not in self.PlatformDatabase:
64 self.PlatformDatabase[PlatformUiName] = {}
65 self.PlatformDatabase[PlatformUiName]['XmlFileName'] = FpdFileName
66 self.PlatformDatabase[PlatformUiName]['SupportedArchitectures'] = set(XmlElement (FpdPlatformDefinitions, '/PlatformSurfaceArea/PlatformDefinitions/SupportedArchitectures').split(' '))
67 self.PlatformDatabase[PlatformUiName]['BuildTargets'] = set(XmlElement (FpdPlatformDefinitions, '/PlatformSurfaceArea/PlatformDefinitions/BuildTargets').split(' '))
68
69 def ComputeToolsDefTxtDatabase(self):
70 self.ToolsDefTxtDatabase = {
71 'TARGET' : [],
72 'TOOL_CHAIN_TAG' : [],
73 'TARGET_ARCH' : []
74 }
75 for Key in dict(self.ToolsDefTxtDictionary):
76 List = Key.split('_')
77 if len(List) != 5:
78 del self.ToolsDefTxtDictionary[Key]
79 elif List[4] == '*':
80 del self.ToolsDefTxtDictionary[Key]
81 else:
82 if List[0] != '*':
83 self.ToolsDefTxtDatabase['TARGET'] += [List[0]]
84 if List[1] != '*':
85 self.ToolsDefTxtDatabase['TOOL_CHAIN_TAG'] += [List[1]]
86 if List[2] != '*':
87 self.ToolsDefTxtDatabase['TARGET_ARCH'] += [List[2]]
88 self.ToolsDefTxtDatabase['TARGET'] = list(set(self.ToolsDefTxtDatabase['TARGET']))
89 self.ToolsDefTxtDatabase['TOOL_CHAIN_TAG'] = list(set(self.ToolsDefTxtDatabase['TOOL_CHAIN_TAG']))
90 self.ToolsDefTxtDatabase['TARGET_ARCH'] = list(set(self.ToolsDefTxtDatabase['TARGET_ARCH']))
91 self.ToolsDefTxtDatabase['TARGET'].sort()
92 self.ToolsDefTxtDatabase['TOOL_CHAIN_TAG'].sort()
93 self.ToolsDefTxtDatabase['TARGET_ARCH'].sort()
94
95 def NewModel(self):
96 self.TargetTxtDictionary = {
97 'ACTIVE_PLATFORM' : [''],
98 'TOOL_CHAIN_CONF' : [''],
99 'MULTIPLE_THREAD' : ['Disable'],
100 'MAX_CONCURRENT_THREAD_NUMBER' : ['2'],
101 'TARGET' : [''],
102 'TOOL_CHAIN_TAG' : [''],
103 'TARGET_ARCH' : ['']
104 }
105
106 def RevertModel(self):
107 self.TargetTxtDictionary = copy.deepcopy(self.OriginalTargetTxtDictionary)
108
109 def RescanModel(self):
110 self.NewModel()
111 self.LoadTargetTxtFile()
112
113 def RefreshModel(self):
114 self.LoadFrameworkDatabase()
115 self.LoadToolsDefTxtFile()
116 self.ComputeToolsDefTxtDatabase()
117
118 if self.Verbose:
119 print self.TargetTxtDictionary
120 print 'ActivePlatform = ', self.TargetTxtDictionary['ACTIVE_PLATFORM'][0]
121 print 'ToolChainConf = ', self.TargetTxtDictionary['TOOL_CHAIN_CONF'][0]
122 print 'MultipleThread = ', self.TargetTxtDictionary['MULTIPLE_THREAD'][0]
123 print 'MaxThreads = ', self.TargetTxtDictionary['MAX_CONCURRENT_THREAD_NUMBER'][0]
124 print 'TargetSet = ', self.TargetTxtDictionary['TARGET']
125 print 'ToolChainSet = ', self.TargetTxtDictionary['TOOL_CHAIN_TAG']
126 print 'TargetArchSet = ', self.TargetTxtDictionary['TARGET_ARCH']
127 Platforms = self.PlatformDatabase.keys()
128 print 'Possible Settings:'
129 print ' Platforms = ', Platforms
130 print ' TargetSet = ', self.ToolsDefTxtDatabase['TARGET']
131 print ' ToolChainSet = ', self.ToolsDefTxtDatabase['TOOL_CHAIN_TAG']
132 print ' TargetArchSet = ', self.ToolsDefTxtDatabase['TARGET_ARCH']
133 return True
134
135 def ModelModified(self):
136 if self.TargetTxtDictionary != self.OriginalTargetTxtDictionary:
137 return True
138 return False
139
140 def SaveModel(self, Filename='Tools/Conf/Target.txt'):
141 if self.Verbose:
142 for Item in self.TargetTxtDictionary:
143 print Item,'=',self.TargetTxtDictionary[Item]
144 self.ConvertDictionaryToTextFile(Filename, self.TargetTxtDictionary, '#', '=', True, None)
145 self.OriginalTargetTxtDictionary = copy.deepcopy(self.TargetTxtDictionary)
146
147 def CloseModel(self):
148 pass
149
150 class Frame(wx.Frame):
151 def __init__(self):
152 wx.Frame.__init__(self,None,-1,'EDK II Build System Context Tool')
153 panel = wx.Panel(self, style=wx.SUNKEN_BORDER | wx.TAB_TRAVERSAL)
154 wx.HelpProvider_Set(wx.SimpleHelpProvider())
155 self.Model = ContextToolModel()
156 if not self.Model.WorkspaceStatus:
157 self.Close()
158 return
159
160 #
161 # Help text
162 #
163 ActivePlatformHelpText = (
164 "Specifies the Platform Name and Platform Version of the platform that will be "
165 "used for build. If set to [Build Directory] and the current directory contains "
166 "an FPD file, then a plaform build on that FPD file will be performed. If set "
167 "to [Build Directory] and there is no FPD file in the current directory, then no "
168 "build will be performed."
169 )
170
171 ToolChainConfHelpText = (
172 "Specifies the name of the file that declares all the tools and flag settings "
173 "required to complete a build. This is typically set to Tools/Conf/tools_def.txt."
174 )
175
176 MultipleThreadHelpText = (
177 "Flag to enable or disable multi-thread builds. If your computer is multi-core "
178 "or contans multiple CPUs, enabling this feature will improve build performance. "
179 "For multi-thread builds, a log will be written to ${BUILD_DIR}/build.log. This "
180 "feature is only for platform builds. Clean, cleanall, and stand-alone module "
181 "builds only use one thread."
182 )
183
184 ThreadsHelpText = (
185 "The number of concurrent threads. The best performance is achieved if this "
186 "value is set to one greater than the number or cores or CPUs in the build system."
187 )
188
189 TargetHelpText = (
190 "Specifies the set of targets to build. If set to All, then all build targets "
191 "are built. Otherwise, the subset of enabled build targets are built. The "
192 "standard build targets are RELEASE and DEBUG, but additional user-defined build "
193 "targets may be declared in the TOOL_CHAIN_CONF file. The DEBUG builds with "
194 "source level debugging enabled. RELEASE builds with source level debugging "
195 "disabled and results in smaller firmware images."
196 )
197
198 ToolChainTagHelpText = (
199 "Specifies the set of tool chains to use during a build. If set to All, then "
200 "all of the supported tools chains are used. Otherwise, only the subset of "
201 "enabled tool chains are used. The TOOL_CHAIN_CONF file declares one or more "
202 "tool chains that may be used."
203 )
204
205 TargetArchHelpText = (
206 "Specifies the set of CPU architectures to build. If set to All, then all the "
207 "CPU architectures supported by the platform FPD file are built. Otherwise, "
208 "only the subset of enabled CPU architectures are built. The standard CPU "
209 "architectures are IA32, X64, IPF, and EBC, but additional CPU architectures "
210 "may be declared in the TOOL_CHAIN_CONF file."
211 )
212
213 #
214 # Status Bar
215 #
216 self.CreateStatusBar()
217
218 #
219 # Build Menus
220 #
221 MenuBar = wx.MenuBar()
222
223 FileMenu = wx.Menu()
224 NewMenuItem = FileMenu.Append(-1, "&New\tCtrl+N", "New target.txt")
225 SaveMenuItem = FileMenu.Append(-1, "&Save\tCtrl+S", "Save target.txt")
226 SaveAsMenuItem = FileMenu.Append(-1, "Save &As...", "Save target.txt as...")
227 RevertMenuItem = FileMenu.Append(-1, "&Revert", "Revert to the original target.txt")
228 ExitMenuItem = FileMenu.Append(-1, "E&xit\tAlt+F4", "Exit ContextTool")
229 MenuBar.Append(FileMenu, "&File")
230 self.Bind(wx.EVT_MENU, self.OnSaveClick, SaveMenuItem)
231 self.Bind(wx.EVT_MENU, self.OnSaveAsClick, SaveAsMenuItem)
232 self.Bind(wx.EVT_MENU, self.OnRevertClick, RevertMenuItem)
233 self.Bind(wx.EVT_MENU, self.OnExitClick, ExitMenuItem)
234
235 ViewMenu = wx.Menu()
236 RefreshMenuItem = ViewMenu.Append (-1, "&Refresh\tF5", "Rescan target.txt")
237 ShowToolBarMenuItem = ViewMenu.AppendCheckItem (-1, "Show &Toolbar", "Shows or hides the toolbar")
238 ShowToolBarMenuItem.Check(True)
239 MenuBar.Append(ViewMenu, "&View")
240 self.Bind(wx.EVT_MENU, self.OnViewRefreshClick, RefreshMenuItem)
241 self.Bind(wx.EVT_MENU, self.OnShowToolBarClick, ShowToolBarMenuItem)
242
243 HelpMenu = wx.Menu()
244 AboutMenuItem = HelpMenu.Append (-1, "&About...", "About")
245 MenuBar.Append(HelpMenu, "&Help")
246 self.Bind(wx.EVT_MENU, self.OnAboutClick, AboutMenuItem)
247
248 self.SetMenuBar (MenuBar)
249
250 #
251 # Build Toolbar
252 #
253 self.ShowToolBar = False
254 self.OnShowToolBarClick(self)
255
256 #
257 # Active Platform Combo Box
258 #
259 ActivePlatformLabel = wx.StaticText(panel, -1, 'ACTIVE_PLATFORM')
260 ActivePlatformLabel.SetHelpText(ActivePlatformHelpText)
261 self.ActivePlatformText = wx.ComboBox(panel,-1, style=wx.CB_DROPDOWN | wx.CB_SORT | wx.CB_READONLY)
262 self.ActivePlatformText.SetHelpText(ActivePlatformHelpText)
263 self.ActivePlatformText.Bind(wx.EVT_TEXT, self.OnActivePlatformClick)
264
265 #
266 # Tool Chain Configuration Text Control and Browse Button for a File Dialog Box
267 #
268 ToolChainConfFileLabel = wx.StaticText(panel, -1, 'TOOL_CHAIN_CONF')
269 ToolChainConfFileLabel.SetHelpText(ToolChainConfHelpText)
270 self.ToolChainConfFileText = wx.TextCtrl(panel, -1, style=wx.TE_PROCESS_ENTER)
271 self.ToolChainConfFileText.Bind(wx.EVT_TEXT_ENTER, self.OnToolChainConfClick)
272 self.ToolChainConfFileText.Bind(wx.EVT_KILL_FOCUS, self.OnToolChainConfClick)
273 self.ToolChainConfFileText.SetHelpText(ToolChainConfHelpText)
274 self.BrowseButton = wx.Button(panel, -1, 'Browse...')
275 self.BrowseButton.Bind(wx.EVT_BUTTON, self.OnBrowseButtonClick)
276
277 #
278 # Multiple Thread enable/disable radio button
279 #
280 MultipleThreadLabel = wx.StaticText(panel, -1, 'MULTIPLE_THREAD')
281 MultipleThreadLabel.SetHelpText(MultipleThreadHelpText)
282 self.MultipleThreadRadioBox = wx.RadioBox(panel, -1, choices=['Enable','Disable'], style=wx.RA_SPECIFY_COLS)
283 self.MultipleThreadRadioBox.Bind(wx.EVT_RADIOBOX, self.OnMultipleThreadRadioBox)
284 self.MultipleThreadRadioBox.SetHelpText(MultipleThreadHelpText)
285
286 #
287 # Thread count spin control
288 #
289 ThreadsLabel = wx.StaticText(panel, -1, 'THREADS')
290 ThreadsLabel.SetHelpText(ThreadsHelpText)
291 self.ThreadsSpinCtrl = wx.SpinCtrl(panel, -1, size=(50, -1), min=2)
292 self.ThreadsSpinCtrl.Bind(wx.EVT_TEXT, self.OnThreadsSpinCtrl)
293 self.ThreadsSpinCtrl.SetHelpText(ThreadsHelpText)
294
295 #
296 # Target, ToolChain, and Arch Check List Boxes
297 #
298 TargetLabel = wx.StaticText(panel, -1, 'TARGET')
299 TargetLabel.SetHelpText(TargetHelpText)
300
301 ToolChainTagLabel = wx.StaticText(panel, -1, 'TOOL_CHAIN_TAG')
302 ToolChainTagLabel.SetHelpText(ToolChainTagHelpText)
303
304 TargetArchLabel = wx.StaticText(panel, -1, 'TARGET_ARCH')
305 TargetArchLabel.SetHelpText(TargetArchHelpText)
306
307 self.TargetCheckListBox = wx.CheckListBox(panel, -1)
308 self.TargetCheckListBox.Bind(wx.EVT_CHECKLISTBOX, self.OnTargetCheckListClick)
309 self.TargetCheckListBox.Bind(wx.EVT_SET_FOCUS, self.OnTargetSetFocus)
310 self.TargetCheckListBox.Bind(wx.EVT_KILL_FOCUS, self.OnTargetKillFocus)
311 self.TargetCheckListBox.SetHelpText(TargetHelpText)
312
313 self.ToolChainTagCheckListBox = wx.CheckListBox(panel, -1)
314 self.ToolChainTagCheckListBox.Bind(wx.EVT_CHECKLISTBOX, self.OnToolChainTagCheckListClick)
315 self.ToolChainTagCheckListBox.Bind(wx.EVT_SET_FOCUS, self.OnToolChainTagSetFocus)
316 self.ToolChainTagCheckListBox.Bind(wx.EVT_KILL_FOCUS, self.OnToolChainTagKillFocus)
317 self.ToolChainTagCheckListBox.SetHelpText(ToolChainTagHelpText)
318
319 self.TargetArchCheckListBox = wx.CheckListBox(panel, -1)
320 self.TargetArchCheckListBox.Bind(wx.EVT_CHECKLISTBOX, self.OnTargetArchCheckListClick)
321 self.TargetArchCheckListBox.Bind(wx.EVT_SET_FOCUS, self.OnTargetArchSetFocus)
322 self.TargetArchCheckListBox.Bind(wx.EVT_KILL_FOCUS, self.OnTargetArchKillFocus)
323 self.TargetArchCheckListBox.SetHelpText(TargetArchHelpText)
324
325 #
326 # Define layout using sizers
327 #
328 self.mainSizer = wx.BoxSizer(wx.VERTICAL)
329
330 flexSizer = wx.FlexGridSizer(cols=3, hgap=5, vgap=5)
331 flexSizer.AddGrowableCol(1)
332 flexSizer.Add(ActivePlatformLabel, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
333 flexSizer.Add(self.ActivePlatformText, 0, wx.EXPAND)
334 flexSizer.Add((0,0), wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)
335
336 flexSizer.Add(ToolChainConfFileLabel, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
337 flexSizer.Add(self.ToolChainConfFileText, 0, wx.EXPAND)
338 flexSizer.Add(self.BrowseButton, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)
339
340 self.mainSizer.Add (flexSizer, 0, wx.EXPAND | wx.ALL, 10)
341
342 threadsSizer = wx.FlexGridSizer(cols = 5, hgap=5, vgap=5)
343 threadsSizer.Add(MultipleThreadLabel, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
344 threadsSizer.Add(self.MultipleThreadRadioBox, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)
345 threadsSizer.Add(ThreadsLabel, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
346 threadsSizer.Add(self.ThreadsSpinCtrl, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)
347
348 self.mainSizer.Add (threadsSizer, 0, wx.ALL, 10)
349
350 listSizer = wx.FlexGridSizer(rows = 2, cols = 3, hgap=5, vgap=5)
351 listSizer.AddGrowableRow(1)
352 listSizer.AddGrowableCol(0)
353 listSizer.AddGrowableCol(1)
354 listSizer.AddGrowableCol(2)
355 listSizer.Add(TargetLabel, 0, wx.ALIGN_CENTER)
356 listSizer.Add(ToolChainTagLabel, 0, wx.ALIGN_CENTER)
357 listSizer.Add(TargetArchLabel, 0, wx.ALIGN_CENTER)
358 listSizer.Add(self.TargetCheckListBox, 0, wx.ALL | wx.EXPAND)
359 listSizer.Add(self.ToolChainTagCheckListBox, 0, wx.ALL | wx.EXPAND)
360 listSizer.Add(self.TargetArchCheckListBox, 0, wx.ALL | wx.EXPAND)
361
362 self.mainSizer.Add (listSizer, wx.EXPAND | wx.ALL, wx.EXPAND | wx.ALL, 10)
363
364 panel.SetSizer (self.mainSizer)
365
366 self.Model.RescanModel()
367 self.OnRefreshClick(self)
368
369 def OnActivePlatformClick(self, event):
370 Platform = self.ActivePlatformText.GetValue()
371 if Platform == ' [Build Directory]':
372 self.Model.TargetTxtDictionary['ACTIVE_PLATFORM'][0] = ''
373 else:
374 self.Model.TargetTxtDictionary['ACTIVE_PLATFORM'][0] = self.Model.PlatformDatabase[Platform]['XmlFileName']
375
376 def OnToolChainConfClick(self, event):
377 if self.Model.TargetTxtDictionary['TOOL_CHAIN_CONF'][0] != self.ToolChainConfFileText.GetValue():
378 self.Model.TargetTxtDictionary['TOOL_CHAIN_CONF'][0] = self.ToolChainConfFileText.GetValue()
379 self.OnRefreshClick(self)
380
381 def OnBrowseButtonClick(self, event):
382 wildcard = "Text Documents (*.txt)|*.txt|" \
383 "All files (*.*)|*.*"
384 dialog = wx.FileDialog (None, 'Choose a Tool Chain Configuration File', self.Model.WorkspaceFile('Tools/Conf'), '', wildcard, wx.OPEN)
385 if dialog.ShowModal() == wx.ID_OK:
386 print dialog.GetPath()
387 ToolChainConfFile = self.Model.WorkspaceRelativePath(dialog.GetPath())
388 self.ToolChainConfFileText.SetValue(ToolChainConfFile)
389 self.Model.TargetTxtDictionary['TOOL_CHAIN_CONF'][0] = self.ToolChainConfFileText.GetValue()
390 self.OnRefreshClick(self)
391 dialog.Destroy()
392
393 def OnMultipleThreadRadioBox (self, event):
394 self.Model.TargetTxtDictionary['MULTIPLE_THREAD'] = [self.MultipleThreadRadioBox.GetStringSelection()]
395 if self.MultipleThreadRadioBox.GetStringSelection() == 'Disable':
396 self.ThreadsSpinCtrl.Disable()
397 else:
398 self.ThreadsSpinCtrl.Enable()
399
400 def OnThreadsSpinCtrl(self, event):
401 self.Model.TargetTxtDictionary['MAX_CONCURRENT_THREAD_NUMBER'] = [str(self.ThreadsSpinCtrl.GetValue())]
402
403 def CheckListFocus(self, CheckListBox, Set):
404 Index = 0
405 while Index < CheckListBox.GetCount():
406 CheckListBox.SetSelection(Index, False)
407 Index += 1
408 if Set:
409 CheckListBox.SetSelection(0, True)
410
411 def CheckListClick(self, CheckListBox, Name):
412 if CheckListBox.IsChecked(0):
413 Index = 1
414 while Index < CheckListBox.GetCount():
415 CheckListBox.Check(Index, False)
416 Index += 1
417 if CheckListBox.IsChecked(0):
418 self.Model.TargetTxtDictionary[Name] = ['']
419 else:
420 self.Model.TargetTxtDictionary[Name] = []
421 Index = 1
422 while Index < CheckListBox.GetCount():
423 if CheckListBox.IsChecked(Index):
424 self.Model.TargetTxtDictionary[Name] += [CheckListBox.GetString(Index)]
425 Index += 1
426 if self.Model.TargetTxtDictionary[Name] == []:
427 self.Model.TargetTxtDictionary[Name] = ['']
428
429 def OnTargetCheckListClick(self, event):
430 self.CheckListClick(self.TargetCheckListBox, 'TARGET')
431
432 def OnTargetSetFocus(self, event):
433 self.CheckListFocus(self.TargetCheckListBox, True)
434
435 def OnTargetKillFocus(self, event):
436 self.CheckListFocus(self.TargetCheckListBox, False)
437
438 def OnToolChainTagCheckListClick(self, event):
439 self.CheckListClick(self.ToolChainTagCheckListBox, 'TOOL_CHAIN_TAG')
440
441 def OnToolChainTagSetFocus(self, event):
442 self.CheckListFocus(self.ToolChainTagCheckListBox, True)
443
444 def OnToolChainTagKillFocus(self, event):
445 self.CheckListFocus(self.ToolChainTagCheckListBox, False)
446
447 def OnTargetArchCheckListClick(self, event):
448 self.CheckListClick(self.TargetArchCheckListBox, 'TARGET_ARCH')
449
450 def OnTargetArchSetFocus(self, event):
451 self.CheckListFocus(self.TargetArchCheckListBox, True)
452
453 def OnTargetArchKillFocus(self, event):
454 self.CheckListFocus(self.TargetArchCheckListBox, False)
455
456 def OnRevertClick(self, event):
457 self.Model.RevertModel()
458 self.OnRefreshClick(self)
459
460 def RefreshCheckListBox(self, CheckListBox, Name):
461 CheckListBox.Set(['All'] + self.Model.ToolsDefTxtDatabase[Name])
462 Index = 0
463 MaximumString = ''
464 while Index < CheckListBox.GetCount():
465 String = CheckListBox.GetString(Index)
466 if len(String) > len(MaximumString):
467 MaximumString = String
468 if String in self.Model.TargetTxtDictionary[Name]:
469 CheckListBox.Check(Index, True)
470 else:
471 CheckListBox.Check(Index, False)
472 Index += 1
473 if self.Model.TargetTxtDictionary[Name] == ['']:
474 CheckListBox.Check(0, True)
475 Extents = CheckListBox.GetFullTextExtent (MaximumString)
476 CheckListBox.SetMinSize((Extents[0],(CheckListBox.GetCount()+1) * (Extents[1]+Extents[2])))
477
478 def OnRefreshClick(self, event):
479 self.Model.RefreshModel()
480 Platforms = self.Model.PlatformDatabase.keys()
481 Platforms.sort()
482 self.ActivePlatformText.SetItems([' [Build Directory]'] + Platforms)
483 self.ActivePlatformText.SetValue(' [Build Directory]')
484 for Platform in self.Model.PlatformDatabase:
485 if self.Model.PlatformDatabase[Platform]['XmlFileName'] == self.Model.TargetTxtDictionary['ACTIVE_PLATFORM'][0]:
486 self.ActivePlatformText.SetValue(Platform)
487 if self.ActivePlatformText.GetValue() == ' [Build Directory]':
488 self.Model.TargetTxtDictionary['ACTIVE_PLATFORM'][0] = ''
489 MaximumString = ' [Build Directory]'
490 for String in Platforms:
491 if len(String) > len(MaximumString):
492 MaximumString = String
493 Extents = self.ActivePlatformText.GetFullTextExtent (MaximumString)
494 self.ActivePlatformText.SetMinSize((Extents[0] + 24,-1))
495
496 self.ToolChainConfFileText.SetValue(self.Model.TargetTxtDictionary['TOOL_CHAIN_CONF'][0])
497 Extents = self.ToolChainConfFileText.GetFullTextExtent (self.Model.TargetTxtDictionary['TOOL_CHAIN_CONF'][0])
498 self.ToolChainConfFileText.SetMinSize((Extents[0] + 24,-1))
499
500 self.MultipleThreadRadioBox.SetStringSelection(self.Model.TargetTxtDictionary['MULTIPLE_THREAD'][0])
501 if self.MultipleThreadRadioBox.GetStringSelection() == 'Disable':
502 self.ThreadsSpinCtrl.Disable()
503 self.ThreadsSpinCtrl.SetValue(int(self.Model.TargetTxtDictionary['MAX_CONCURRENT_THREAD_NUMBER'][0]))
504
505 self.RefreshCheckListBox (self.TargetCheckListBox, 'TARGET')
506 self.RefreshCheckListBox (self.ToolChainTagCheckListBox, 'TOOL_CHAIN_TAG')
507 self.RefreshCheckListBox (self.TargetArchCheckListBox, 'TARGET_ARCH')
508
509 self.mainSizer.SetSizeHints(self)
510 self.mainSizer.Fit(self)
511
512 def OnViewRefreshClick(self, event):
513 self.Model.RescanModel()
514 self.OnRefreshClick(self)
515
516 def AddTool (self, Handler, ArtId, Label, HelpText):
517 Tool = self.ToolBar.AddSimpleTool(
518 -1,
519 wx.ArtProvider.GetBitmap(ArtId, wx.ART_TOOLBAR, self.ToolSize),
520 Label,
521 HelpText
522 )
523 self.Bind(wx.EVT_MENU, Handler, Tool)
524
525 def OnShowToolBarClick(self, event):
526 if self.ShowToolBar:
527 self.ShowToolBar = False
528 self.ToolBar.Destroy()
529 else:
530 self.ShowToolBar = True
531 self.ToolBar = self.CreateToolBar()
532 self.ToolSize = (24,24)
533 self.ToolBar.SetToolBitmapSize(self.ToolSize)
534 self.AddTool (self.OnNewClick, wx.ART_NEW, "New", "New target.txt")
535 self.AddTool (self.OnSaveClick, wx.ART_FILE_SAVE, "Save", "Save target.txt")
536 self.AddTool (self.OnSaveAsClick, wx.ART_FILE_SAVE_AS, "Save As...", "Save target.txt as...")
537 self.AddTool (self.OnRevertClick, wx.ART_UNDO, "Revert", "Revert to original target.txt")
538 self.AddTool (self.OnHelpClick, wx.ART_HELP, "Help", "Context Sensitive Help")
539 self.AddTool (self.OnExitClick, wx.ART_QUIT, "Exit", "Exit Context Tool application")
540 self.ToolBar.Realize()
541
542 def OnNewClick(self, event):
543 self.Model.NewModel()
544 self.OnRefreshClick(self)
545
546 def OnSaveClick(self, event):
547 self.Model.SaveModel()
548
549 def OnSaveAsClick(self, event):
550 wildcard = "Text Documents (*.txt)|*.txt|" \
551 "All files (*.*)|*.*"
552 dialog = wx.FileDialog (None, 'Save As', self.Model.WorkspaceFile('Tools/Conf'), '', wildcard, wx.SAVE | wx.OVERWRITE_PROMPT)
553 if dialog.ShowModal() == wx.ID_OK:
554 TargetTxtFile = self.Model.WorkspaceRelativePath(dialog.GetPath())
555 if TargetTxtFile != '':
556 self.Model.SaveModel(TargetTxtFile)
557 dialog.Destroy()
558
559 def OnExitClick(self, event):
560 if self.Model.ModelModified():
561 dialog = wx.MessageDialog(None, 'The contents have changed.\nDo you want to save changes?', 'EDK II Build System Context Tool', style = wx.YES_NO | wx.YES_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION)
562 Status = dialog.ShowModal()
563 dialog.Destroy()
564 if Status == wx.ID_YES:
565 self.OnSaveClick (self)
566 elif Status == wx.ID_CANCEL:
567 return
568 self.Model.CloseModel()
569 self.Close()
570
571 def OnHelpClick(self, event):
572 wx.ContextHelp().BeginContextHelp()
573
574 def OnAboutClick(self, event):
575 AboutInfo = wx.AboutDialogInfo()
576 AboutInfo.Name = 'EDK II Build System Context Tool'
577 AboutInfo.Version = '0.3'
578 AboutInfo.Copyright = 'Copyright (c) 2006, Intel Corporation'
579 AboutInfo.Description = """
580 The EDK II Build System Context Tool maintains the target.txt
581 settings in an EDK II Workspace."""
582 AboutInfo.WebSite = ("http://tianocore.org", "Tiano Core home page")
583 AboutInfo.License = """
584 All rights reserved. This program and the accompanying materials are
585 licensed and made available under the terms and conditions of the BSD
586 License which accompanies this distribution. The full text of the
587 license may be found at http://opensource.org/licenses/bsd-license.php
588
589 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
590 BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
591 EITHER EXPRESS OR IMPLIED."""
592 if self.Model.Icon != None:
593 AboutInfo.Icon = self.Model.Icon
594 wx.AboutBox(AboutInfo)
595
596 if __name__ == '__main__':
597 app = wx.PySimpleApp()
598 frame = Frame()
599 frame.Show()
600 app.MainLoop()