Hi all,

Just wanted to share a little build script I wrote for gem5. It presents a
table with all the architectures and optimization levels. You can navigate
and select which versions you want to build and then it will build all of
those binaries for you. Your previous selections are saved in a little db
file, so you can just call the script and hit "enter" on subsequent runs.
It pulls the architecture list from the build_opts/ directory, so it will
stay up to date.

Run inside the gem5 base dir. Arrow keys to navigate, space_bar to toggle a
selection, enter_key to proceed, "q" to exit and discard changes.

Cheers!
Ryan Gambord
<gambo...@oregonstate.edu>
#!/usr/bin/env python3
import shelve
import sys
import signal
import curses
import multiprocessing
import subprocess
import os

arch_list = os.listdir('./build_opts')

var_list=['debug', 'opt', 'fast', 'prof', 'perf']

build_lines=[]

def print_table(scr, arch_list, var_list):
    v_len = max([len(s) for s in var_list])
    var_list = [" "*(v_len-len(s)) + s for s in var_list]

    h_len = max([len(s) for s in arch_list])
    arch_list = [" "*(h_len-len(s)) + s for s in arch_list]
    
    for y in range(v_len):
        scr.addstr(y,h_len, '│' + '│'.join([s[y] for s in var_list]) + '│')
    
    for i,s in enumerate(arch_list):
        scr.addstr(v_len + i*2, 0, '─'*h_len + '┼─'*len(var_list) + '┤')
        scr.addstr(v_len + 1 + i*2, 0, s + '│ '*len(var_list) + '│')
    
    scr.addstr(v_len+len(arch_list)*2,0, '─'*h_len + '┴─'*len(var_list) + '┘')
    return v_len, h_len

def main(stdscr):
    curses.use_default_colors()
    attributes = {}
    curses.init_pair(1, -1, -1)
    attributes['normal'] = curses.color_pair(1)

    stdscr.bkgd(' ', attributes['normal'])

    attributes['highlighted'] = curses.color_pair(1) | curses.A_REVERSE
    v_off, h_off = print_table(stdscr, arch_list, var_list)
    
    with shelve.open('build_state.db') as db:
        selection=db.get('selection', set())
        for (y,x) in selection:
            stdscr.addch(v_off + 1 + y*2, h_off + 1 + x*2, 'X')
        
        s_x=db.get('s_x', 0)
        s_y=db.get('s_y', 0)

        while True:
            stdscr.move(v_off + 1 + s_y*2, h_off + 1 + s_x*2)
            c = stdscr.getch()
            if c == curses.KEY_LEFT and s_x > 0:
                s_x -= 1
            elif c == curses.KEY_RIGHT and s_x < len(var_list)-1:
                s_x += 1
            elif c == curses.KEY_UP and s_y > 0:
                s_y -= 1
            elif c == curses.KEY_DOWN and s_y < len(arch_list)-1:
                s_y+=1
            elif c == ord(' '):
                if (s_y,s_x) in selection:
                    stdscr.addch(" ")
                    selection.remove((s_y,s_x))
                else:
                    stdscr.addch("X")
                    selection.add((s_y,s_x))
            elif c == ord('\n'):
                break
            elif c == ord('q'):
                exit(1)
        db['selection'] = selection
        db['s_x'] = s_x
        db['s_y'] = s_y
        for (y,x) in selection:
            build_lines.append("build/" + arch_list[y] + "/gem5." + var_list[x])
    
curses.wrapper(main)
if build_lines:
    build_str = "python3 `which scons` \'" + '\' \''.join(build_lines) + '\' -j' + str(multiprocessing.cpu_count()-1)
    print(build_str)
    try:
        p = subprocess.Popen(build_str, shell=True, executable="/bin/bash")
        p.wait()
    except KeyboardInterrupt:
        p.terminate()

_______________________________________________
gem5-users mailing list -- gem5-users@gem5.org
To unsubscribe send an email to gem5-users-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to