]>
Commit | Line | Data |
---|---|---|
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() |