mirror of https://github.com/acidanthera/audk.git
591 lines
26 KiB
Python
Executable File
591 lines
26 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
# 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()
|