| #!/usr/bin/env python |
| |
| # Copyright (c) 2007, Intel Corporation |
| # All rights reserved. This program and the accompanying materials |
| # are licensed and made available under the terms and conditions of the BSD License |
| # which accompanies this distribution. The full text of the license may be found at |
| # http://opensource.org/licenses/bsd-license.php |
| # |
| # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. |
| |
| """The EDK II Build System Context Tool Utility maintains Target.txt settings |
| in an EDK II Workspace.""" |
| |
| import wx, os, sys, copy |
| from EdkIIWorkspace import * |
| |
| class ContextToolModel(EdkIIWorkspace): |
| def __init__(self): |
| self.WorkspaceStatus = EdkIIWorkspace.__init__(self) |
| self.Database = {} |
| self.OriginalDatabase = {} |
| |
| def LoadTargetTxtFile(self): |
| self.ConvertTextFileToDictionary('Tools/Conf/Target.txt', self.TargetTxtDictionary, '#', '=', True, None) |
| if self.TargetTxtDictionary['ACTIVE_PLATFORM'] == []: |
| self.TargetTxtDictionary['ACTIVE_PLATFORM'] = [''] |
| else: |
| self.TargetTxtDictionary['ACTIVE_PLATFORM'] = [self.TargetTxtDictionary['ACTIVE_PLATFORM'][0]] |
| self.TargetTxtDictionary['TOOL_CHAIN_CONF'] = [self.TargetTxtDictionary['TOOL_CHAIN_CONF'][0]] |
| self.TargetTxtDictionary['MULTIPLE_THREAD'] = [self.TargetTxtDictionary['MULTIPLE_THREAD'][0]] |
| self.TargetTxtDictionary['MAX_CONCURRENT_THREAD_NUMBER'] = [self.TargetTxtDictionary['MAX_CONCURRENT_THREAD_NUMBER'][0]] |
| self.TargetTxtDictionary['TARGET'] = list(set(self.TargetTxtDictionary['TARGET'])) |
| self.TargetTxtDictionary['TOOL_CHAIN_TAG'] = list(set(self.TargetTxtDictionary['TOOL_CHAIN_TAG'])) |
| self.TargetTxtDictionary['TARGET_ARCH'] = list(set(self.TargetTxtDictionary['TARGET_ARCH'])) |
| if self.TargetTxtDictionary['TARGET'] == []: |
| self.TargetTxtDictionary['TARGET'] = [''] |
| if self.TargetTxtDictionary['TOOL_CHAIN_TAG'] == []: |
| self.TargetTxtDictionary['TOOL_CHAIN_TAG'] = [''] |
| if self.TargetTxtDictionary['TARGET_ARCH'] == []: |
| self.TargetTxtDictionary['TARGET_ARCH'] = [''] |
| self.TargetTxtDictionary['TARGET'].sort() |
| self.TargetTxtDictionary['TOOL_CHAIN_TAG'].sort() |
| self.TargetTxtDictionary['TARGET_ARCH'].sort() |
| self.OriginalTargetTxtDictionary = copy.deepcopy(self.TargetTxtDictionary) |
| |
| def LoadToolsDefTxtFile(self): |
| self.ToolsDefTxtDictionary = {} |
| if self.TargetTxtDictionary['TOOL_CHAIN_CONF'] != ['']: |
| self.ConvertTextFileToDictionary(self.TargetTxtDictionary['TOOL_CHAIN_CONF'][0], self.ToolsDefTxtDictionary, '#', '=', False, None) |
| |
| def LoadFrameworkDatabase(self): |
| self.PlatformDatabase = {} |
| Fd = self.XmlParseFile ('Tools/Conf/FrameworkDatabase.db') |
| PlatformList = XmlList (Fd, '/FrameworkDatabase/PlatformList/Filename') |
| for File in PlatformList: |
| FpdFileName = XmlElementData(File) |
| FpdPlatformHeader = self.XmlParseFileSection (FpdFileName, 'PlatformHeader') |
| FpdPlatformDefinitions = self.XmlParseFileSection (FpdFileName,'PlatformDefinitions') |
| PlatformName = XmlElement (FpdPlatformHeader, '/PlatformHeader/PlatformName') |
| PlatformVersion = XmlElement (FpdPlatformHeader, '/PlatformHeader/Version') |
| PlatformUiName = PlatformName + '[' + PlatformVersion + ']' |
| if PlatformUiName not in self.PlatformDatabase: |
| self.PlatformDatabase[PlatformUiName] = {} |
| self.PlatformDatabase[PlatformUiName]['XmlFileName'] = FpdFileName |
| self.PlatformDatabase[PlatformUiName]['SupportedArchitectures'] = set(XmlElement (FpdPlatformDefinitions, '/PlatformSurfaceArea/PlatformDefinitions/SupportedArchitectures').split(' ')) |
| self.PlatformDatabase[PlatformUiName]['BuildTargets'] = set(XmlElement (FpdPlatformDefinitions, '/PlatformSurfaceArea/PlatformDefinitions/BuildTargets').split(' ')) |
| |
| def ComputeToolsDefTxtDatabase(self): |
| self.ToolsDefTxtDatabase = { |
| 'TARGET' : [], |
| 'TOOL_CHAIN_TAG' : [], |
| 'TARGET_ARCH' : [] |
| } |
| for Key in dict(self.ToolsDefTxtDictionary): |
| List = Key.split('_') |
| if len(List) != 5: |
| del self.ToolsDefTxtDictionary[Key] |
| elif List[4] == '*': |
| del self.ToolsDefTxtDictionary[Key] |
| else: |
| if List[0] != '*': |
| self.ToolsDefTxtDatabase['TARGET'] += [List[0]] |
| if List[1] != '*': |
| self.ToolsDefTxtDatabase['TOOL_CHAIN_TAG'] += [List[1]] |
| if List[2] != '*': |
| self.ToolsDefTxtDatabase['TARGET_ARCH'] += [List[2]] |
| self.ToolsDefTxtDatabase['TARGET'] = list(set(self.ToolsDefTxtDatabase['TARGET'])) |
| self.ToolsDefTxtDatabase['TOOL_CHAIN_TAG'] = list(set(self.ToolsDefTxtDatabase['TOOL_CHAIN_TAG'])) |
| self.ToolsDefTxtDatabase['TARGET_ARCH'] = list(set(self.ToolsDefTxtDatabase['TARGET_ARCH'])) |
| self.ToolsDefTxtDatabase['TARGET'].sort() |
| self.ToolsDefTxtDatabase['TOOL_CHAIN_TAG'].sort() |
| self.ToolsDefTxtDatabase['TARGET_ARCH'].sort() |
| |
| def NewModel(self): |
| self.TargetTxtDictionary = { |
| 'ACTIVE_PLATFORM' : [''], |
| 'TOOL_CHAIN_CONF' : [''], |
| 'MULTIPLE_THREAD' : ['Disable'], |
| 'MAX_CONCURRENT_THREAD_NUMBER' : ['2'], |
| 'TARGET' : [''], |
| 'TOOL_CHAIN_TAG' : [''], |
| 'TARGET_ARCH' : [''] |
| } |
| |
| def RevertModel(self): |
| self.TargetTxtDictionary = copy.deepcopy(self.OriginalTargetTxtDictionary) |
| |
| def RescanModel(self): |
| self.NewModel() |
| self.LoadTargetTxtFile() |
| |
| def RefreshModel(self): |
| self.LoadFrameworkDatabase() |
| self.LoadToolsDefTxtFile() |
| self.ComputeToolsDefTxtDatabase() |
| |
| if self.Verbose: |
| print self.TargetTxtDictionary |
| print 'ActivePlatform = ', self.TargetTxtDictionary['ACTIVE_PLATFORM'][0] |
| print 'ToolChainConf = ', self.TargetTxtDictionary['TOOL_CHAIN_CONF'][0] |
| print 'MultipleThread = ', self.TargetTxtDictionary['MULTIPLE_THREAD'][0] |
| print 'MaxThreads = ', self.TargetTxtDictionary['MAX_CONCURRENT_THREAD_NUMBER'][0] |
| print 'TargetSet = ', self.TargetTxtDictionary['TARGET'] |
| print 'ToolChainSet = ', self.TargetTxtDictionary['TOOL_CHAIN_TAG'] |
| print 'TargetArchSet = ', self.TargetTxtDictionary['TARGET_ARCH'] |
| Platforms = self.PlatformDatabase.keys() |
| print 'Possible Settings:' |
| print ' Platforms = ', Platforms |
| print ' TargetSet = ', self.ToolsDefTxtDatabase['TARGET'] |
| print ' ToolChainSet = ', self.ToolsDefTxtDatabase['TOOL_CHAIN_TAG'] |
| print ' TargetArchSet = ', self.ToolsDefTxtDatabase['TARGET_ARCH'] |
| return True |
| |
| def ModelModified(self): |
| if self.TargetTxtDictionary != self.OriginalTargetTxtDictionary: |
| return True |
| return False |
| |
| def SaveModel(self, Filename='Tools/Conf/Target.txt'): |
| if self.Verbose: |
| for Item in self.TargetTxtDictionary: |
| print Item,'=',self.TargetTxtDictionary[Item] |
| self.ConvertDictionaryToTextFile(Filename, self.TargetTxtDictionary, '#', '=', True, None) |
| self.OriginalTargetTxtDictionary = copy.deepcopy(self.TargetTxtDictionary) |
| |
| def CloseModel(self): |
| pass |
| |
| class Frame(wx.Frame): |
| def __init__(self): |
| wx.Frame.__init__(self,None,-1,'EDK II Build System Context Tool') |
| panel = wx.Panel(self, style=wx.SUNKEN_BORDER | wx.TAB_TRAVERSAL) |
| wx.HelpProvider_Set(wx.SimpleHelpProvider()) |
| self.Model = ContextToolModel() |
| if not self.Model.WorkspaceStatus: |
| self.Close() |
| return |
| |
| # |
| # Help text |
| # |
| ActivePlatformHelpText = ( |
| "Specifies the Platform Name and Platform Version of the platform that will be " |
| "used for build. If set to [Build Directory] and the current directory contains " |
| "an FPD file, then a plaform build on that FPD file will be performed. If set " |
| "to [Build Directory] and there is no FPD file in the current directory, then no " |
| "build will be performed." |
| ) |
| |
| ToolChainConfHelpText = ( |
| "Specifies the name of the file that declares all the tools and flag settings " |
| "required to complete a build. This is typically set to Tools/Conf/tools_def.txt." |
| ) |
| |
| MultipleThreadHelpText = ( |
| "Flag to enable or disable multi-thread builds. If your computer is multi-core " |
| "or contans multiple CPUs, enabling this feature will improve build performance. " |
| "For multi-thread builds, a log will be written to ${BUILD_DIR}/build.log. This " |
| "feature is only for platform builds. Clean, cleanall, and stand-alone module " |
| "builds only use one thread." |
| ) |
| |
| ThreadsHelpText = ( |
| "The number of concurrent threads. The best performance is achieved if this " |
| "value is set to one greater than the number or cores or CPUs in the build system." |
| ) |
| |
| TargetHelpText = ( |
| "Specifies the set of targets to build. If set to All, then all build targets " |
| "are built. Otherwise, the subset of enabled build targets are built. The " |
| "standard build targets are RELEASE and DEBUG, but additional user-defined build " |
| "targets may be declared in the TOOL_CHAIN_CONF file. The DEBUG builds with " |
| "source level debugging enabled. RELEASE builds with source level debugging " |
| "disabled and results in smaller firmware images." |
| ) |
| |
| ToolChainTagHelpText = ( |
| "Specifies the set of tool chains to use during a build. If set to All, then " |
| "all of the supported tools chains are used. Otherwise, only the subset of " |
| "enabled tool chains are used. The TOOL_CHAIN_CONF file declares one or more " |
| "tool chains that may be used." |
| ) |
| |
| TargetArchHelpText = ( |
| "Specifies the set of CPU architectures to build. If set to All, then all the " |
| "CPU architectures supported by the platform FPD file are built. Otherwise, " |
| "only the subset of enabled CPU architectures are built. The standard CPU " |
| "architectures are IA32, X64, IPF, and EBC, but additional CPU architectures " |
| "may be declared in the TOOL_CHAIN_CONF file." |
| ) |
| |
| # |
| # Status Bar |
| # |
| self.CreateStatusBar() |
| |
| # |
| # Build Menus |
| # |
| MenuBar = wx.MenuBar() |
| |
| FileMenu = wx.Menu() |
| NewMenuItem = FileMenu.Append(-1, "&New\tCtrl+N", "New target.txt") |
| SaveMenuItem = FileMenu.Append(-1, "&Save\tCtrl+S", "Save target.txt") |
| SaveAsMenuItem = FileMenu.Append(-1, "Save &As...", "Save target.txt as...") |
| RevertMenuItem = FileMenu.Append(-1, "&Revert", "Revert to the original target.txt") |
| ExitMenuItem = FileMenu.Append(-1, "E&xit\tAlt+F4", "Exit ContextTool") |
| MenuBar.Append(FileMenu, "&File") |
| self.Bind(wx.EVT_MENU, self.OnSaveClick, SaveMenuItem) |
| self.Bind(wx.EVT_MENU, self.OnSaveAsClick, SaveAsMenuItem) |
| self.Bind(wx.EVT_MENU, self.OnRevertClick, RevertMenuItem) |
| self.Bind(wx.EVT_MENU, self.OnExitClick, ExitMenuItem) |
| |
| ViewMenu = wx.Menu() |
| RefreshMenuItem = ViewMenu.Append (-1, "&Refresh\tF5", "Rescan target.txt") |
| ShowToolBarMenuItem = ViewMenu.AppendCheckItem (-1, "Show &Toolbar", "Shows or hides the toolbar") |
| ShowToolBarMenuItem.Check(True) |
| MenuBar.Append(ViewMenu, "&View") |
| self.Bind(wx.EVT_MENU, self.OnViewRefreshClick, RefreshMenuItem) |
| self.Bind(wx.EVT_MENU, self.OnShowToolBarClick, ShowToolBarMenuItem) |
| |
| HelpMenu = wx.Menu() |
| AboutMenuItem = HelpMenu.Append (-1, "&About...", "About") |
| MenuBar.Append(HelpMenu, "&Help") |
| self.Bind(wx.EVT_MENU, self.OnAboutClick, AboutMenuItem) |
| |
| self.SetMenuBar (MenuBar) |
| |
| # |
| # Build Toolbar |
| # |
| self.ShowToolBar = False |
| self.OnShowToolBarClick(self) |
| |
| # |
| # Active Platform Combo Box |
| # |
| ActivePlatformLabel = wx.StaticText(panel, -1, 'ACTIVE_PLATFORM') |
| ActivePlatformLabel.SetHelpText(ActivePlatformHelpText) |
| self.ActivePlatformText = wx.ComboBox(panel,-1, style=wx.CB_DROPDOWN | wx.CB_SORT | wx.CB_READONLY) |
| self.ActivePlatformText.SetHelpText(ActivePlatformHelpText) |
| self.ActivePlatformText.Bind(wx.EVT_TEXT, self.OnActivePlatformClick) |
| |
| # |
| # Tool Chain Configuration Text Control and Browse Button for a File Dialog Box |
| # |
| ToolChainConfFileLabel = wx.StaticText(panel, -1, 'TOOL_CHAIN_CONF') |
| ToolChainConfFileLabel.SetHelpText(ToolChainConfHelpText) |
| self.ToolChainConfFileText = wx.TextCtrl(panel, -1, style=wx.TE_PROCESS_ENTER) |
| self.ToolChainConfFileText.Bind(wx.EVT_TEXT_ENTER, self.OnToolChainConfClick) |
| self.ToolChainConfFileText.Bind(wx.EVT_KILL_FOCUS, self.OnToolChainConfClick) |
| self.ToolChainConfFileText.SetHelpText(ToolChainConfHelpText) |
| self.BrowseButton = wx.Button(panel, -1, 'Browse...') |
| self.BrowseButton.Bind(wx.EVT_BUTTON, self.OnBrowseButtonClick) |
| |
| # |
| # Multiple Thread enable/disable radio button |
| # |
| MultipleThreadLabel = wx.StaticText(panel, -1, 'MULTIPLE_THREAD') |
| MultipleThreadLabel.SetHelpText(MultipleThreadHelpText) |
| self.MultipleThreadRadioBox = wx.RadioBox(panel, -1, choices=['Enable','Disable'], style=wx.RA_SPECIFY_COLS) |
| self.MultipleThreadRadioBox.Bind(wx.EVT_RADIOBOX, self.OnMultipleThreadRadioBox) |
| self.MultipleThreadRadioBox.SetHelpText(MultipleThreadHelpText) |
| |
| # |
| # Thread count spin control |
| # |
| ThreadsLabel = wx.StaticText(panel, -1, 'THREADS') |
| ThreadsLabel.SetHelpText(ThreadsHelpText) |
| self.ThreadsSpinCtrl = wx.SpinCtrl(panel, -1, size=(50, -1), min=2) |
| self.ThreadsSpinCtrl.Bind(wx.EVT_TEXT, self.OnThreadsSpinCtrl) |
| self.ThreadsSpinCtrl.SetHelpText(ThreadsHelpText) |
| |
| # |
| # Target, ToolChain, and Arch Check List Boxes |
| # |
| TargetLabel = wx.StaticText(panel, -1, 'TARGET') |
| TargetLabel.SetHelpText(TargetHelpText) |
| |
| ToolChainTagLabel = wx.StaticText(panel, -1, 'TOOL_CHAIN_TAG') |
| ToolChainTagLabel.SetHelpText(ToolChainTagHelpText) |
| |
| TargetArchLabel = wx.StaticText(panel, -1, 'TARGET_ARCH') |
| TargetArchLabel.SetHelpText(TargetArchHelpText) |
| |
| self.TargetCheckListBox = wx.CheckListBox(panel, -1) |
| self.TargetCheckListBox.Bind(wx.EVT_CHECKLISTBOX, self.OnTargetCheckListClick) |
| self.TargetCheckListBox.Bind(wx.EVT_SET_FOCUS, self.OnTargetSetFocus) |
| self.TargetCheckListBox.Bind(wx.EVT_KILL_FOCUS, self.OnTargetKillFocus) |
| self.TargetCheckListBox.SetHelpText(TargetHelpText) |
| |
| self.ToolChainTagCheckListBox = wx.CheckListBox(panel, -1) |
| self.ToolChainTagCheckListBox.Bind(wx.EVT_CHECKLISTBOX, self.OnToolChainTagCheckListClick) |
| self.ToolChainTagCheckListBox.Bind(wx.EVT_SET_FOCUS, self.OnToolChainTagSetFocus) |
| self.ToolChainTagCheckListBox.Bind(wx.EVT_KILL_FOCUS, self.OnToolChainTagKillFocus) |
| self.ToolChainTagCheckListBox.SetHelpText(ToolChainTagHelpText) |
| |
| self.TargetArchCheckListBox = wx.CheckListBox(panel, -1) |
| self.TargetArchCheckListBox.Bind(wx.EVT_CHECKLISTBOX, self.OnTargetArchCheckListClick) |
| self.TargetArchCheckListBox.Bind(wx.EVT_SET_FOCUS, self.OnTargetArchSetFocus) |
| self.TargetArchCheckListBox.Bind(wx.EVT_KILL_FOCUS, self.OnTargetArchKillFocus) |
| self.TargetArchCheckListBox.SetHelpText(TargetArchHelpText) |
| |
| # |
| # Define layout using sizers |
| # |
| self.mainSizer = wx.BoxSizer(wx.VERTICAL) |
| |
| flexSizer = wx.FlexGridSizer(cols=3, hgap=5, vgap=5) |
| flexSizer.AddGrowableCol(1) |
| flexSizer.Add(ActivePlatformLabel, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL) |
| flexSizer.Add(self.ActivePlatformText, 0, wx.EXPAND) |
| flexSizer.Add((0,0), wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL) |
| |
| flexSizer.Add(ToolChainConfFileLabel, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL) |
| flexSizer.Add(self.ToolChainConfFileText, 0, wx.EXPAND) |
| flexSizer.Add(self.BrowseButton, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL) |
| |
| self.mainSizer.Add (flexSizer, 0, wx.EXPAND | wx.ALL, 10) |
| |
| threadsSizer = wx.FlexGridSizer(cols = 5, hgap=5, vgap=5) |
| threadsSizer.Add(MultipleThreadLabel, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL) |
| threadsSizer.Add(self.MultipleThreadRadioBox, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL) |
| threadsSizer.Add(ThreadsLabel, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL) |
| threadsSizer.Add(self.ThreadsSpinCtrl, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL) |
| |
| self.mainSizer.Add (threadsSizer, 0, wx.ALL, 10) |
| |
| listSizer = wx.FlexGridSizer(rows = 2, cols = 3, hgap=5, vgap=5) |
| listSizer.AddGrowableRow(1) |
| listSizer.AddGrowableCol(0) |
| listSizer.AddGrowableCol(1) |
| listSizer.AddGrowableCol(2) |
| listSizer.Add(TargetLabel, 0, wx.ALIGN_CENTER) |
| listSizer.Add(ToolChainTagLabel, 0, wx.ALIGN_CENTER) |
| listSizer.Add(TargetArchLabel, 0, wx.ALIGN_CENTER) |
| listSizer.Add(self.TargetCheckListBox, 0, wx.ALL | wx.EXPAND) |
| listSizer.Add(self.ToolChainTagCheckListBox, 0, wx.ALL | wx.EXPAND) |
| listSizer.Add(self.TargetArchCheckListBox, 0, wx.ALL | wx.EXPAND) |
| |
| self.mainSizer.Add (listSizer, wx.EXPAND | wx.ALL, wx.EXPAND | wx.ALL, 10) |
| |
| panel.SetSizer (self.mainSizer) |
| |
| self.Model.RescanModel() |
| self.OnRefreshClick(self) |
| |
| def OnActivePlatformClick(self, event): |
| Platform = self.ActivePlatformText.GetValue() |
| if Platform == ' [Build Directory]': |
| self.Model.TargetTxtDictionary['ACTIVE_PLATFORM'][0] = '' |
| else: |
| self.Model.TargetTxtDictionary['ACTIVE_PLATFORM'][0] = self.Model.PlatformDatabase[Platform]['XmlFileName'] |
| |
| def OnToolChainConfClick(self, event): |
| if self.Model.TargetTxtDictionary['TOOL_CHAIN_CONF'][0] != self.ToolChainConfFileText.GetValue(): |
| self.Model.TargetTxtDictionary['TOOL_CHAIN_CONF'][0] = self.ToolChainConfFileText.GetValue() |
| self.OnRefreshClick(self) |
| |
| def OnBrowseButtonClick(self, event): |
| wildcard = "Text Documents (*.txt)|*.txt|" \ |
| "All files (*.*)|*.*" |
| dialog = wx.FileDialog (None, 'Choose a Tool Chain Configuration File', self.Model.WorkspaceFile('Tools/Conf'), '', wildcard, wx.OPEN) |
| if dialog.ShowModal() == wx.ID_OK: |
| print dialog.GetPath() |
| ToolChainConfFile = self.Model.WorkspaceRelativePath(dialog.GetPath()) |
| self.ToolChainConfFileText.SetValue(ToolChainConfFile) |
| self.Model.TargetTxtDictionary['TOOL_CHAIN_CONF'][0] = self.ToolChainConfFileText.GetValue() |
| self.OnRefreshClick(self) |
| dialog.Destroy() |
| |
| def OnMultipleThreadRadioBox (self, event): |
| self.Model.TargetTxtDictionary['MULTIPLE_THREAD'] = [self.MultipleThreadRadioBox.GetStringSelection()] |
| if self.MultipleThreadRadioBox.GetStringSelection() == 'Disable': |
| self.ThreadsSpinCtrl.Disable() |
| else: |
| self.ThreadsSpinCtrl.Enable() |
| |
| def OnThreadsSpinCtrl(self, event): |
| self.Model.TargetTxtDictionary['MAX_CONCURRENT_THREAD_NUMBER'] = [str(self.ThreadsSpinCtrl.GetValue())] |
| |
| def CheckListFocus(self, CheckListBox, Set): |
| Index = 0 |
| while Index < CheckListBox.GetCount(): |
| CheckListBox.SetSelection(Index, False) |
| Index += 1 |
| if Set: |
| CheckListBox.SetSelection(0, True) |
| |
| def CheckListClick(self, CheckListBox, Name): |
| if CheckListBox.IsChecked(0): |
| Index = 1 |
| while Index < CheckListBox.GetCount(): |
| CheckListBox.Check(Index, False) |
| Index += 1 |
| if CheckListBox.IsChecked(0): |
| self.Model.TargetTxtDictionary[Name] = [''] |
| else: |
| self.Model.TargetTxtDictionary[Name] = [] |
| Index = 1 |
| while Index < CheckListBox.GetCount(): |
| if CheckListBox.IsChecked(Index): |
| self.Model.TargetTxtDictionary[Name] += [CheckListBox.GetString(Index)] |
| Index += 1 |
| if self.Model.TargetTxtDictionary[Name] == []: |
| self.Model.TargetTxtDictionary[Name] = [''] |
| |
| def OnTargetCheckListClick(self, event): |
| self.CheckListClick(self.TargetCheckListBox, 'TARGET') |
| |
| def OnTargetSetFocus(self, event): |
| self.CheckListFocus(self.TargetCheckListBox, True) |
| |
| def OnTargetKillFocus(self, event): |
| self.CheckListFocus(self.TargetCheckListBox, False) |
| |
| def OnToolChainTagCheckListClick(self, event): |
| self.CheckListClick(self.ToolChainTagCheckListBox, 'TOOL_CHAIN_TAG') |
| |
| def OnToolChainTagSetFocus(self, event): |
| self.CheckListFocus(self.ToolChainTagCheckListBox, True) |
| |
| def OnToolChainTagKillFocus(self, event): |
| self.CheckListFocus(self.ToolChainTagCheckListBox, False) |
| |
| def OnTargetArchCheckListClick(self, event): |
| self.CheckListClick(self.TargetArchCheckListBox, 'TARGET_ARCH') |
| |
| def OnTargetArchSetFocus(self, event): |
| self.CheckListFocus(self.TargetArchCheckListBox, True) |
| |
| def OnTargetArchKillFocus(self, event): |
| self.CheckListFocus(self.TargetArchCheckListBox, False) |
| |
| def OnRevertClick(self, event): |
| self.Model.RevertModel() |
| self.OnRefreshClick(self) |
| |
| def RefreshCheckListBox(self, CheckListBox, Name): |
| CheckListBox.Set(['All'] + self.Model.ToolsDefTxtDatabase[Name]) |
| Index = 0 |
| MaximumString = '' |
| while Index < CheckListBox.GetCount(): |
| String = CheckListBox.GetString(Index) |
| if len(String) > len(MaximumString): |
| MaximumString = String |
| if String in self.Model.TargetTxtDictionary[Name]: |
| CheckListBox.Check(Index, True) |
| else: |
| CheckListBox.Check(Index, False) |
| Index += 1 |
| if self.Model.TargetTxtDictionary[Name] == ['']: |
| CheckListBox.Check(0, True) |
| Extents = CheckListBox.GetFullTextExtent (MaximumString) |
| CheckListBox.SetMinSize((Extents[0],(CheckListBox.GetCount()+1) * (Extents[1]+Extents[2]))) |
| |
| def OnRefreshClick(self, event): |
| self.Model.RefreshModel() |
| Platforms = self.Model.PlatformDatabase.keys() |
| Platforms.sort() |
| self.ActivePlatformText.SetItems([' [Build Directory]'] + Platforms) |
| self.ActivePlatformText.SetValue(' [Build Directory]') |
| for Platform in self.Model.PlatformDatabase: |
| if self.Model.PlatformDatabase[Platform]['XmlFileName'] == self.Model.TargetTxtDictionary['ACTIVE_PLATFORM'][0]: |
| self.ActivePlatformText.SetValue(Platform) |
| if self.ActivePlatformText.GetValue() == ' [Build Directory]': |
| self.Model.TargetTxtDictionary['ACTIVE_PLATFORM'][0] = '' |
| MaximumString = ' [Build Directory]' |
| for String in Platforms: |
| if len(String) > len(MaximumString): |
| MaximumString = String |
| Extents = self.ActivePlatformText.GetFullTextExtent (MaximumString) |
| self.ActivePlatformText.SetMinSize((Extents[0] + 24,-1)) |
| |
| self.ToolChainConfFileText.SetValue(self.Model.TargetTxtDictionary['TOOL_CHAIN_CONF'][0]) |
| Extents = self.ToolChainConfFileText.GetFullTextExtent (self.Model.TargetTxtDictionary['TOOL_CHAIN_CONF'][0]) |
| self.ToolChainConfFileText.SetMinSize((Extents[0] + 24,-1)) |
| |
| self.MultipleThreadRadioBox.SetStringSelection(self.Model.TargetTxtDictionary['MULTIPLE_THREAD'][0]) |
| if self.MultipleThreadRadioBox.GetStringSelection() == 'Disable': |
| self.ThreadsSpinCtrl.Disable() |
| self.ThreadsSpinCtrl.SetValue(int(self.Model.TargetTxtDictionary['MAX_CONCURRENT_THREAD_NUMBER'][0])) |
| |
| self.RefreshCheckListBox (self.TargetCheckListBox, 'TARGET') |
| self.RefreshCheckListBox (self.ToolChainTagCheckListBox, 'TOOL_CHAIN_TAG') |
| self.RefreshCheckListBox (self.TargetArchCheckListBox, 'TARGET_ARCH') |
| |
| self.mainSizer.SetSizeHints(self) |
| self.mainSizer.Fit(self) |
| |
| def OnViewRefreshClick(self, event): |
| self.Model.RescanModel() |
| self.OnRefreshClick(self) |
| |
| def AddTool (self, Handler, ArtId, Label, HelpText): |
| Tool = self.ToolBar.AddSimpleTool( |
| -1, |
| wx.ArtProvider.GetBitmap(ArtId, wx.ART_TOOLBAR, self.ToolSize), |
| Label, |
| HelpText |
| ) |
| self.Bind(wx.EVT_MENU, Handler, Tool) |
| |
| def OnShowToolBarClick(self, event): |
| if self.ShowToolBar: |
| self.ShowToolBar = False |
| self.ToolBar.Destroy() |
| else: |
| self.ShowToolBar = True |
| self.ToolBar = self.CreateToolBar() |
| self.ToolSize = (24,24) |
| self.ToolBar.SetToolBitmapSize(self.ToolSize) |
| self.AddTool (self.OnNewClick, wx.ART_NEW, "New", "New target.txt") |
| self.AddTool (self.OnSaveClick, wx.ART_FILE_SAVE, "Save", "Save target.txt") |
| self.AddTool (self.OnSaveAsClick, wx.ART_FILE_SAVE_AS, "Save As...", "Save target.txt as...") |
| self.AddTool (self.OnRevertClick, wx.ART_UNDO, "Revert", "Revert to original target.txt") |
| self.AddTool (self.OnHelpClick, wx.ART_HELP, "Help", "Context Sensitive Help") |
| self.AddTool (self.OnExitClick, wx.ART_QUIT, "Exit", "Exit Context Tool application") |
| self.ToolBar.Realize() |
| |
| def OnNewClick(self, event): |
| self.Model.NewModel() |
| self.OnRefreshClick(self) |
| |
| def OnSaveClick(self, event): |
| self.Model.SaveModel() |
| |
| def OnSaveAsClick(self, event): |
| wildcard = "Text Documents (*.txt)|*.txt|" \ |
| "All files (*.*)|*.*" |
| dialog = wx.FileDialog (None, 'Save As', self.Model.WorkspaceFile('Tools/Conf'), '', wildcard, wx.SAVE | wx.OVERWRITE_PROMPT) |
| if dialog.ShowModal() == wx.ID_OK: |
| TargetTxtFile = self.Model.WorkspaceRelativePath(dialog.GetPath()) |
| if TargetTxtFile != '': |
| self.Model.SaveModel(TargetTxtFile) |
| dialog.Destroy() |
| |
| def OnExitClick(self, event): |
| if self.Model.ModelModified(): |
| 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) |
| Status = dialog.ShowModal() |
| dialog.Destroy() |
| if Status == wx.ID_YES: |
| self.OnSaveClick (self) |
| elif Status == wx.ID_CANCEL: |
| return |
| self.Model.CloseModel() |
| self.Close() |
| |
| def OnHelpClick(self, event): |
| wx.ContextHelp().BeginContextHelp() |
| |
| def OnAboutClick(self, event): |
| AboutInfo = wx.AboutDialogInfo() |
| AboutInfo.Name = 'EDK II Build System Context Tool' |
| AboutInfo.Version = '0.3' |
| AboutInfo.Copyright = 'Copyright (c) 2006, Intel Corporation' |
| AboutInfo.Description = """ |
| The EDK II Build System Context Tool maintains the target.txt |
| settings in an EDK II Workspace.""" |
| AboutInfo.WebSite = ("http://tianocore.org", "Tiano Core home page") |
| AboutInfo.License = """ |
| All rights reserved. This program and the accompanying materials are |
| licensed and made available under the terms and conditions of the BSD |
| License which accompanies this distribution. The full text of the |
| license may be found at http://opensource.org/licenses/bsd-license.php |
| |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" |
| BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, |
| EITHER EXPRESS OR IMPLIED.""" |
| if self.Model.Icon != None: |
| AboutInfo.Icon = self.Model.Icon |
| wx.AboutBox(AboutInfo) |
| |
| if __name__ == '__main__': |
| app = wx.PySimpleApp() |
| frame = Frame() |
| frame.Show() |
| app.MainLoop() |