xref: /nrf52832-nimble/rt-thread/tools/sconsui.py (revision 104654410c56c573564690304ae786df310c91fc)
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