mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 03:03:46 +01:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2177 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			601 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			601 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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()
 |