1*10465441SEvalZero#! /usr/bin/env python 2*10465441SEvalZero#coding=utf-8 3*10465441SEvalZero 4*10465441SEvalZero# 5*10465441SEvalZero# File : sconsui.py 6*10465441SEvalZero# This file is part of RT-Thread RTOS 7*10465441SEvalZero# COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team 8*10465441SEvalZero# 9*10465441SEvalZero# This program is free software; you can redistribute it and/or modify 10*10465441SEvalZero# it under the terms of the GNU General Public License as published by 11*10465441SEvalZero# the Free Software Foundation; either version 2 of the License, or 12*10465441SEvalZero# (at your option) any later version. 13*10465441SEvalZero# 14*10465441SEvalZero# This program is distributed in the hope that it will be useful, 15*10465441SEvalZero# but WITHOUT ANY WARRANTY; without even the implied warranty of 16*10465441SEvalZero# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*10465441SEvalZero# GNU General Public License for more details. 18*10465441SEvalZero# 19*10465441SEvalZero# You should have received a copy of the GNU General Public License along 20*10465441SEvalZero# with this program; if not, write to the Free Software Foundation, Inc., 21*10465441SEvalZero# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 22*10465441SEvalZero# 23*10465441SEvalZero# Change Logs: 24*10465441SEvalZero# Date Author Notes 25*10465441SEvalZero# 2015-01-20 Bernard Add copyright information 26*10465441SEvalZero# 27*10465441SEvalZero 28*10465441SEvalZeroimport sys 29*10465441SEvalZero 30*10465441SEvalZeropy2 = py30 = py31 = False 31*10465441SEvalZeroversion = sys.hexversion 32*10465441SEvalZeroif version >= 0x020600F0 and version < 0x03000000 : 33*10465441SEvalZero py2 = True # Python 2.6 or 2.7 34*10465441SEvalZero from Tkinter import * 35*10465441SEvalZero import ttk 36*10465441SEvalZeroelif version >= 0x03000000 and version < 0x03010000 : 37*10465441SEvalZero py30 = True 38*10465441SEvalZero from tkinter import * 39*10465441SEvalZero import ttk 40*10465441SEvalZeroelif version >= 0x03010000: 41*10465441SEvalZero py31 = True 42*10465441SEvalZero from tkinter import * 43*10465441SEvalZero import tkinter.ttk as ttk 44*10465441SEvalZeroelse: 45*10465441SEvalZero print (""" 46*10465441SEvalZero You do not have a version of python supporting ttk widgets.. 47*10465441SEvalZero You need a version >= 2.6 to execute PAGE modules. 48*10465441SEvalZero """) 49*10465441SEvalZero sys.exit() 50*10465441SEvalZero 51*10465441SEvalZeroimport ScrolledText 52*10465441SEvalZeroimport tkFileDialog 53*10465441SEvalZeroimport tkMessageBox 54*10465441SEvalZero 55*10465441SEvalZeroimport os 56*10465441SEvalZeroimport threading 57*10465441SEvalZeroimport platform 58*10465441SEvalZero 59*10465441SEvalZerobuilder = None 60*10465441SEvalZeroexecutor = None 61*10465441SEvalZerolock = None 62*10465441SEvalZero 63*10465441SEvalZeroclass CmdExecutor(threading.Thread): 64*10465441SEvalZero def __init__(self, cmd, output): 65*10465441SEvalZero threading.Thread.__init__(self) 66*10465441SEvalZero self.cmd = cmd 67*10465441SEvalZero self.child = None 68*10465441SEvalZero 69*10465441SEvalZero def run(self): 70*10465441SEvalZero global executor, builder, lock 71*10465441SEvalZero 72*10465441SEvalZero if platform.system() == 'Windows': 73*10465441SEvalZero try: 74*10465441SEvalZero from win32spawn import Win32Spawn 75*10465441SEvalZero subprocess = Win32Spawn(self.cmd) 76*10465441SEvalZero subprocess.start_pipe() 77*10465441SEvalZero 78*10465441SEvalZero builder.progressbar.start() 79*10465441SEvalZero while not subprocess.is_terminated or subprocess.qsize() > 0: 80*10465441SEvalZero try: 81*10465441SEvalZero line = subprocess.get(timeout=1) 82*10465441SEvalZero line = line.replace('\r', '') 83*10465441SEvalZero if line: 84*10465441SEvalZero lock.acquire() 85*10465441SEvalZero builder.output.see(END) 86*10465441SEvalZero builder.output.insert(END, line) 87*10465441SEvalZero lock.release() 88*10465441SEvalZero except: 89*10465441SEvalZero pass 90*10465441SEvalZero 91*10465441SEvalZero builder.progressbar.stop() 92*10465441SEvalZero except: 93*10465441SEvalZero pass 94*10465441SEvalZero 95*10465441SEvalZero executor = None 96*10465441SEvalZero if builder.is_makeing_project: 97*10465441SEvalZero builder.output.insert(END, 'Done') 98*10465441SEvalZero builder.is_makeing_project = False 99*10465441SEvalZero 100*10465441SEvalZerodef ExecCmd(cmd): 101*10465441SEvalZero global executor 102*10465441SEvalZero if executor: 103*10465441SEvalZero print 'last task does not exit' 104*10465441SEvalZero return 105*10465441SEvalZero 106*10465441SEvalZero executor = CmdExecutor(cmd, builder) 107*10465441SEvalZero executor.start() 108*10465441SEvalZero 109*10465441SEvalZeroclass DirSelectBox(ttk.Frame): 110*10465441SEvalZero def __init__(self, master=None, **kw): 111*10465441SEvalZero ttk.Frame.__init__(self, master, **kw) 112*10465441SEvalZero self.dir_var = StringVar() 113*10465441SEvalZero self.entry = ttk.Entry(self, textvariable = self.dir_var) 114*10465441SEvalZero self.entry.pack(fill=BOTH, expand=1,side=LEFT) 115*10465441SEvalZero self.entry.configure(width = 50) 116*10465441SEvalZero 117*10465441SEvalZero self.browser_button = ttk.Button(self, text="Browser", command=self.browser) 118*10465441SEvalZero self.browser_button.pack(side=RIGHT) 119*10465441SEvalZero 120*10465441SEvalZero def browser(self): 121*10465441SEvalZero dir = tkFileDialog.askdirectory(parent=self, title='Open directory', initialdir=self.dir_var.get()) 122*10465441SEvalZero if dir != '': 123*10465441SEvalZero self.dir_var.set(dir) 124*10465441SEvalZero 125*10465441SEvalZero def set_path(self, path): 126*10465441SEvalZero path = path.replace('\\', '/') 127*10465441SEvalZero self.dir_var.set(path) 128*10465441SEvalZero 129*10465441SEvalZero def get_path(self): 130*10465441SEvalZero return self.dir_var.get() 131*10465441SEvalZero 132*10465441SEvalZeroCOMPILER = [ 133*10465441SEvalZero ("GNU GCC", "GCC"), 134*10465441SEvalZero ("Keil ARMCC", "ARMCC"), 135*10465441SEvalZero ("IAR Compiler", "IAR"), 136*10465441SEvalZero ] 137*10465441SEvalZero 138*10465441SEvalZeroIDE = [ 139*10465441SEvalZero ('Keil MDK4', 'mdk4'), 140*10465441SEvalZero ('Keil MDK', 'mdk'), 141*10465441SEvalZero ('IAR Compiler', 'iar') 142*10465441SEvalZero] 143*10465441SEvalZero 144*10465441SEvalZeroclass SconsUI(): 145*10465441SEvalZero def __init__(self, master=None): 146*10465441SEvalZero style = ttk.Style() 147*10465441SEvalZero theme = style.theme_use() 148*10465441SEvalZero default = style.lookup(theme, 'background') 149*10465441SEvalZero master.configure(background=default) 150*10465441SEvalZero 151*10465441SEvalZero notebook = ttk.Notebook(master) 152*10465441SEvalZero notebook.pack(fill=BOTH, padx=5, pady=5) 153*10465441SEvalZero 154*10465441SEvalZero # building page 155*10465441SEvalZero page_building = ttk.Frame(notebook) 156*10465441SEvalZero notebook.add(page_building, padding=3) 157*10465441SEvalZero notebook.tab(0, text='Build', underline="-1") 158*10465441SEvalZero self.setup_building_ui(page_building) 159*10465441SEvalZero self.building_page = page_building 160*10465441SEvalZero 161*10465441SEvalZero # make project page 162*10465441SEvalZero page_project = ttk.Frame(notebook) 163*10465441SEvalZero notebook.add(page_project, padding = 3) 164*10465441SEvalZero notebook.tab(1, text = 'Project', underline = '-1') 165*10465441SEvalZero self.setup_project_ui(page_project) 166*10465441SEvalZero self.project_page = page_project 167*10465441SEvalZero 168*10465441SEvalZero # setting page 169*10465441SEvalZero page_setting = ttk.Frame(notebook) 170*10465441SEvalZero notebook.add(page_setting, padding = 3) 171*10465441SEvalZero notebook.tab(2, text = 'Setting', underline = '-1') 172*10465441SEvalZero self.setup_setting_ui(page_setting) 173*10465441SEvalZero self.setting_page = page_setting 174*10465441SEvalZero 175*10465441SEvalZero padding = ttk.Frame(master) 176*10465441SEvalZero padding.pack(fill=X) 177*10465441SEvalZero quit = ttk.Button(padding, text='Quit', command = self.quit) 178*10465441SEvalZero quit.pack(side=RIGHT) 179*10465441SEvalZero 180*10465441SEvalZero # set notebook to self 181*10465441SEvalZero self.notebook = notebook 182*10465441SEvalZero 183*10465441SEvalZero # read setting 184*10465441SEvalZero self.read_setting() 185*10465441SEvalZero self.is_makeing_project = False 186*10465441SEvalZero 187*10465441SEvalZero def read_setting(self): 188*10465441SEvalZero import platform 189*10465441SEvalZero import os 190*10465441SEvalZero 191*10465441SEvalZero home = '' 192*10465441SEvalZero if platform.system() == 'Windows': 193*10465441SEvalZero driver = os.environ['HOMEDRIVE'] 194*10465441SEvalZero home = os.environ['HOMEPATH'] 195*10465441SEvalZero home = os.path.join(driver, home) 196*10465441SEvalZero else: 197*10465441SEvalZero home = os.environ['HOME'] 198*10465441SEvalZero 199*10465441SEvalZero setting_path = os.path.join(home, '.rtt_scons') 200*10465441SEvalZero if os.path.exists(setting_path): 201*10465441SEvalZero setting = open(os.path.join(home, '.rtt_scons')) 202*10465441SEvalZero for line in setting: 203*10465441SEvalZero line = line.replace('\n', '') 204*10465441SEvalZero line = line.replace('\r', '') 205*10465441SEvalZero if line.find('=') != -1: 206*10465441SEvalZero items = line.split('=') 207*10465441SEvalZero if items[0] == 'RTTRoot': 208*10465441SEvalZero self.RTTRoot.set_path(items[1]) 209*10465441SEvalZero elif items[0] == 'BSPRoot': 210*10465441SEvalZero self.BSPRoot.set_path(items[1]) 211*10465441SEvalZero elif items[0] == 'compiler': 212*10465441SEvalZero compiler = items[1] 213*10465441SEvalZero else: 214*10465441SEvalZero self.CompilersPath[items[0]].set_path(items[1]) 215*10465441SEvalZero setting.close() 216*10465441SEvalZero 217*10465441SEvalZero # set RT-Thread Root Directory according environ 218*10465441SEvalZero if 'RTT_ROOT' in os.environ: 219*10465441SEvalZero self.RTTRoot.set_path(os.environ['RTT_ROOT']) 220*10465441SEvalZero 221*10465441SEvalZero if self.RTTRoot.get_path() == '': 222*10465441SEvalZero rtt_root = '' 223*10465441SEvalZero # detect RT-Thread directory 224*10465441SEvalZero if os.path.exists(os.path.join('..', 'include', 'rtthread.h')): 225*10465441SEvalZero rtt_root = os.path.join('..') 226*10465441SEvalZero elif os.path.exists(os.path.join('..', '..', 'include', 'rtthread.h')): 227*10465441SEvalZero rtt_root = os.path.join('..', '..') 228*10465441SEvalZero if rtt_root: 229*10465441SEvalZero self.RTTRoot.set_path(os.path.abspath(rtt_root)) 230*10465441SEvalZero 231*10465441SEvalZero # detect compiler path 232*10465441SEvalZero if platform.system() == 'Windows': 233*10465441SEvalZero # Keil MDK 234*10465441SEvalZero if not self.CompilersPath['ARMCC'].get_path(): 235*10465441SEvalZero if os.path.exists('C:\\Keil'): 236*10465441SEvalZero self.CompilersPath['ARMCC'].set_path('C:\\Keil') 237*10465441SEvalZero elif os.path.exists('D:\\Keil'): 238*10465441SEvalZero self.CompilersPath['ARMCC'].set_path('D:\\Keil') 239*10465441SEvalZero elif os.path.exists('E:\\Keil'): 240*10465441SEvalZero self.CompilersPath['ARMCC'].set_path('E:\\Keil') 241*10465441SEvalZero elif os.path.exists('F:\\Keil'): 242*10465441SEvalZero self.CompilersPath['ARMCC'].set_path('F:\\Keil') 243*10465441SEvalZero elif os.path.exists('G:\\Keil'): 244*10465441SEvalZero self.CompilersPath['ARMCC'].set_path('G:\\Keil') 245*10465441SEvalZero 246*10465441SEvalZero # GNU GCC 247*10465441SEvalZero if not self.CompilersPath['GCC'].get_path(): 248*10465441SEvalZero paths = os.environ['PATH'] 249*10465441SEvalZero paths = paths.split(';') 250*10465441SEvalZero 251*10465441SEvalZero for path in paths: 252*10465441SEvalZero if path.find('CodeSourcery') != -1: 253*10465441SEvalZero self.CompilersPath['GCC'].set_path(path) 254*10465441SEvalZero break 255*10465441SEvalZero elif path.find('GNU Tools ARM Embedded') != -1: 256*10465441SEvalZero self.CompilersPath['GCC'].set_path(path) 257*10465441SEvalZero break 258*10465441SEvalZero 259*10465441SEvalZero def save_setting(self): 260*10465441SEvalZero import platform 261*10465441SEvalZero import os 262*10465441SEvalZero 263*10465441SEvalZero home = '' 264*10465441SEvalZero if platform.system() == 'Windows': 265*10465441SEvalZero driver = os.environ['HOMEDRIVE'] 266*10465441SEvalZero home = os.environ['HOMEPATH'] 267*10465441SEvalZero home = os.path.join(driver, home) 268*10465441SEvalZero else: 269*10465441SEvalZero home = os.environ['HOME'] 270*10465441SEvalZero 271*10465441SEvalZero setting = open(os.path.join(home, '.rtt_scons'), 'w+') 272*10465441SEvalZero # current comiler 273*10465441SEvalZero # line = '%s=%s\n' % ('compiler', self.compilers.get())) 274*10465441SEvalZero line = '%s=%s\n' % ('compiler', 'iar') 275*10465441SEvalZero setting.write(line) 276*10465441SEvalZero 277*10465441SEvalZero # RTT Root Folder 278*10465441SEvalZero if self.RTTRoot.get_path(): 279*10465441SEvalZero line = '%s=%s\n' % ('RTTRoot', self.RTTRoot.get_path()) 280*10465441SEvalZero setting.write(line) 281*10465441SEvalZero 282*10465441SEvalZero # BSP Root Folder 283*10465441SEvalZero if self.BSPRoot.get_path(): 284*10465441SEvalZero line = '%s=%s\n' % ('BSPRoot', self.BSPRoot.get_path()) 285*10465441SEvalZero setting.write(line) 286*10465441SEvalZero 287*10465441SEvalZero for (compiler, path) in self.CompilersPath.iteritems(): 288*10465441SEvalZero if path.get_path(): 289*10465441SEvalZero line = '%s=%s\n' % (compiler, path.get_path()) 290*10465441SEvalZero setting.write(line) 291*10465441SEvalZero 292*10465441SEvalZero setting.close() 293*10465441SEvalZero tkMessageBox.showinfo("RT-Thread SCons UI", 294*10465441SEvalZero "Save setting sucessfully") 295*10465441SEvalZero 296*10465441SEvalZero def setup_building_ui(self, frame): 297*10465441SEvalZero padding = ttk.Frame(frame) 298*10465441SEvalZero padding.pack(fill=X) 299*10465441SEvalZero 300*10465441SEvalZero button = ttk.Button(padding, text='Clean', command=self.do_clean) 301*10465441SEvalZero button.pack(side=RIGHT) 302*10465441SEvalZero button = ttk.Button(padding, text='Build', command=self.do_build) 303*10465441SEvalZero button.pack(side=RIGHT) 304*10465441SEvalZero label = ttk.Label(padding, relief = 'flat', text = 'Click Build or Clean to build or clean system -->') 305*10465441SEvalZero label.pack(side=RIGHT, ipady = 5) 306*10465441SEvalZero 307*10465441SEvalZero self.progressbar = ttk.Progressbar(frame) 308*10465441SEvalZero self.progressbar.pack(fill=X) 309*10465441SEvalZero 310*10465441SEvalZero separator = ttk.Separator(frame) 311*10465441SEvalZero separator.pack(fill=X) 312*10465441SEvalZero 313*10465441SEvalZero self.output = ScrolledText.ScrolledText(frame) 314*10465441SEvalZero self.output.pack(fill=X) 315*10465441SEvalZero 316*10465441SEvalZero def setup_project_ui(self, frame): 317*10465441SEvalZero label = ttk.Label(frame, relief = 'flat', text = 'Choose Integrated Development Environment:') 318*10465441SEvalZero label.pack(fill=X, pady = 5) 319*10465441SEvalZero 320*10465441SEvalZero separator = ttk.Separator(frame) 321*10465441SEvalZero separator.pack(fill=X) 322*10465441SEvalZero 323*10465441SEvalZero self.ide = StringVar() 324*10465441SEvalZero self.ide.set("mdk4") # initialize 325*10465441SEvalZero 326*10465441SEvalZero for text,mode in IDE: 327*10465441SEvalZero radiobutton = ttk.Radiobutton(frame, text=text, variable = self.ide, value = mode) 328*10465441SEvalZero radiobutton.pack(fill=X, padx=10) 329*10465441SEvalZero 330*10465441SEvalZero bottom = ttk.Frame(frame) 331*10465441SEvalZero bottom.pack(side=BOTTOM, fill=X) 332*10465441SEvalZero button = ttk.Button(bottom, text="Make Project", command = self.do_make_project) 333*10465441SEvalZero button.pack(side=RIGHT, padx = 10, pady = 10) 334*10465441SEvalZero 335*10465441SEvalZero def setup_setting_ui(self, frame): 336*10465441SEvalZero row = 0 337*10465441SEvalZero label = ttk.Label (frame, relief = 'flat', text='RT-Thread Root Folder:') 338*10465441SEvalZero label.grid(row=row, column=0,ipadx=5, ipady=5, padx = 5) 339*10465441SEvalZero 340*10465441SEvalZero self.RTTRoot = DirSelectBox(frame) 341*10465441SEvalZero self.RTTRoot.grid(row=row, column=1, sticky=E+W) 342*10465441SEvalZero row = row + 1 343*10465441SEvalZero 344*10465441SEvalZero label = ttk.Label (frame, relief = 'flat', text='Board Support Folder:') 345*10465441SEvalZero label.grid(row=row, column=0,ipadx=5, ipady=5, padx = 5) 346*10465441SEvalZero 347*10465441SEvalZero self.BSPRoot = DirSelectBox(frame) 348*10465441SEvalZero self.BSPRoot.grid(row=row, column=1, sticky=E+W) 349*10465441SEvalZero row = row + 1 350*10465441SEvalZero 351*10465441SEvalZero label = ttk.Label (frame, relief='flat', text='Toolchain:') 352*10465441SEvalZero label.grid(row=row, column=0,ipadx=5, ipady=5, sticky=E+W) 353*10465441SEvalZero row = row + 1 354*10465441SEvalZero 355*10465441SEvalZero separator = ttk.Separator(frame) 356*10465441SEvalZero separator.grid(row = row, column = 0, columnspan = 2, sticky = E+W) 357*10465441SEvalZero row = row + 1 358*10465441SEvalZero 359*10465441SEvalZero self.compilers = StringVar() 360*10465441SEvalZero self.compilers.set("GCC") # initialize 361*10465441SEvalZero 362*10465441SEvalZero self.CompilersPath = {} 363*10465441SEvalZero 364*10465441SEvalZero for text,compiler in COMPILER: 365*10465441SEvalZero radiobutton = ttk.Radiobutton(frame, text=text, variable = self.compilers, value = compiler) 366*10465441SEvalZero radiobutton.grid(row=row, column = 0, sticky = W, ipadx = 5, ipady = 5, padx = 20) 367*10465441SEvalZero 368*10465441SEvalZero self.CompilersPath[compiler] = DirSelectBox(frame) 369*10465441SEvalZero self.CompilersPath[compiler].grid(row=row, column=1, sticky=E+W) 370*10465441SEvalZero row = row + 1 371*10465441SEvalZero 372*10465441SEvalZero button = ttk.Button(frame, text='Save Setting', command = self.save_setting) 373*10465441SEvalZero button.grid(row = row, column = 1, sticky = E) 374*10465441SEvalZero row = row + 1 375*10465441SEvalZero 376*10465441SEvalZero def prepare_build(self): 377*10465441SEvalZero # get compiler 378*10465441SEvalZero compiler = self.compilers.get() 379*10465441SEvalZero if compiler == 'GCC': 380*10465441SEvalZero compiler = 'gcc' 381*10465441SEvalZero elif compiler == 'ARMCC': 382*10465441SEvalZero compiler = 'keil' 383*10465441SEvalZero elif compiler == 'IAR': 384*10465441SEvalZero compiler = 'iar' 385*10465441SEvalZero 386*10465441SEvalZero # get RTT Root 387*10465441SEvalZero rtt_root = self.RTTRoot.get_path() 388*10465441SEvalZero # get Compiler path 389*10465441SEvalZero exec_path = self.CompilersPath[self.compilers.get()].get_path() 390*10465441SEvalZero 391*10465441SEvalZero command = '' 392*10465441SEvalZero 393*10465441SEvalZero os.environ['RTT_ROOT'] = rtt_root 394*10465441SEvalZero os.environ['RTT_CC'] = compiler 395*10465441SEvalZero os.environ['RTT_EXEC_PATH'] = exec_path 396*10465441SEvalZero 397*10465441SEvalZero return command 398*10465441SEvalZero 399*10465441SEvalZero def check_path(self): 400*10465441SEvalZero result = True 401*10465441SEvalZero 402*10465441SEvalZero if self.BSPRoot.get_path() == '': 403*10465441SEvalZero result = False 404*10465441SEvalZero 405*10465441SEvalZero if self.RTTRoot.get_path() == '': 406*10465441SEvalZero result = False 407*10465441SEvalZero 408*10465441SEvalZero if not result: 409*10465441SEvalZero tkMessageBox.showinfo("RT-Thread SCons UI", 410*10465441SEvalZero "Folder is empty, please choose correct directory.") 411*10465441SEvalZero 412*10465441SEvalZero return result 413*10465441SEvalZero 414*10465441SEvalZero def do_build(self): 415*10465441SEvalZero self.prepare_build() 416*10465441SEvalZero command = 'scons' 417*10465441SEvalZero 418*10465441SEvalZero if not self.check_path(): 419*10465441SEvalZero return 420*10465441SEvalZero 421*10465441SEvalZero bsp = self.BSPRoot.get_path() 422*10465441SEvalZero os.chdir(bsp) 423*10465441SEvalZero 424*10465441SEvalZero self.output.delete(1.0, END) 425*10465441SEvalZero self.output.insert(END, 'building project...\n') 426*10465441SEvalZero ExecCmd(command) 427*10465441SEvalZero 428*10465441SEvalZero def do_clean(self): 429*10465441SEvalZero self.prepare_build() 430*10465441SEvalZero command = 'scons -c' 431*10465441SEvalZero 432*10465441SEvalZero if not self.check_path(): 433*10465441SEvalZero return 434*10465441SEvalZero 435*10465441SEvalZero bsp = self.BSPRoot.get_path() 436*10465441SEvalZero os.chdir(bsp) 437*10465441SEvalZero 438*10465441SEvalZero self.output.delete(1.0, END) 439*10465441SEvalZero self.output.insert(END, 'clean project...\n') 440*10465441SEvalZero ExecCmd(command) 441*10465441SEvalZero 442*10465441SEvalZero def do_make_project(self): 443*10465441SEvalZero ide = self.ide.get() 444*10465441SEvalZero self.prepare_build() 445*10465441SEvalZero command = 'scons --target=%s -s' % ide 446*10465441SEvalZero 447*10465441SEvalZero if not self.check_path(): 448*10465441SEvalZero return 449*10465441SEvalZero 450*10465441SEvalZero # select build page 451*10465441SEvalZero self.notebook.select(self.building_page) 452*10465441SEvalZero 453*10465441SEvalZero bsp = self.BSPRoot.get_path() 454*10465441SEvalZero os.chdir(bsp) 455*10465441SEvalZero 456*10465441SEvalZero self.output.delete(1.0, END) 457*10465441SEvalZero self.output.insert(END, 'Generate project ...\n') 458*10465441SEvalZero self.is_makeing_project = True 459*10465441SEvalZero ExecCmd(command) 460*10465441SEvalZero 461*10465441SEvalZero def quit(self): 462*10465441SEvalZero exit(0) 463*10465441SEvalZero 464*10465441SEvalZerodef StartSConsUI(path=None): 465*10465441SEvalZero global val, root, builder, lock 466*10465441SEvalZero root = Tk() 467*10465441SEvalZero root.title('RT-Thread SCons UI') 468*10465441SEvalZero #root.geometrygeometry('590x510+50+50') 469*10465441SEvalZero lock = threading.RLock() 470*10465441SEvalZero builder = SconsUI(root) 471*10465441SEvalZero if path: 472*10465441SEvalZero builder.BSPRoot.set_path(path) 473*10465441SEvalZero root.mainloop() 474*10465441SEvalZero 475*10465441SEvalZeroif __name__ == '__main__': 476*10465441SEvalZero StartSConsUI() 477