OE_TERMINAL ?= 'auto' 
 | 
OE_TERMINAL[type] = 'choice' 
 | 
OE_TERMINAL[choices] = 'auto none \ 
 | 
                        ${@oe_terminal_prioritized()}' 
 | 
  
 | 
OE_TERMINAL_EXPORTS += 'EXTRA_OEMAKE CACHED_CONFIGUREVARS CONFIGUREOPTS EXTRA_OECONF' 
 | 
OE_TERMINAL_EXPORTS[type] = 'list' 
 | 
  
 | 
XAUTHORITY ?= "${HOME}/.Xauthority" 
 | 
SHELL ?= "bash" 
 | 
  
 | 
def oe_terminal_prioritized(): 
 | 
    import oe.terminal 
 | 
    return " ".join(o.name for o in oe.terminal.prioritized()) 
 | 
  
 | 
def emit_terminal_func(command, envdata, d): 
 | 
    import bb.build 
 | 
    cmd_func = 'do_terminal' 
 | 
  
 | 
    envdata.setVar(cmd_func, 'exec ' + command) 
 | 
    envdata.setVarFlag(cmd_func, 'func', '1') 
 | 
  
 | 
    runfmt = d.getVar('BB_RUNFMT') or "run.{func}.{pid}" 
 | 
    runfile = runfmt.format(func=cmd_func, task=cmd_func, taskfunc=cmd_func, pid=os.getpid()) 
 | 
    runfile = os.path.join(d.getVar('T'), runfile) 
 | 
    bb.utils.mkdirhier(os.path.dirname(runfile)) 
 | 
  
 | 
    with open(runfile, 'w') as script: 
 | 
        # Override the shell shell_trap_code specifies. 
 | 
        # If our shell is bash, we might well face silent death. 
 | 
        script.write("#!/bin/bash\n") 
 | 
        script.write(bb.build.shell_trap_code()) 
 | 
        bb.data.emit_func(cmd_func, script, envdata) 
 | 
        script.write(cmd_func) 
 | 
        script.write("\n") 
 | 
    os.chmod(runfile, 0o755) 
 | 
  
 | 
    return runfile 
 | 
  
 | 
def oe_terminal(command, title, d): 
 | 
    import oe.data 
 | 
    import oe.terminal 
 | 
     
 | 
    envdata = bb.data.init() 
 | 
  
 | 
    for v in os.environ: 
 | 
        envdata.setVar(v, os.environ[v]) 
 | 
        envdata.setVarFlag(v, 'export', '1') 
 | 
  
 | 
    for export in oe.data.typed_value('OE_TERMINAL_EXPORTS', d): 
 | 
        value = d.getVar(export) 
 | 
        if value is not None: 
 | 
            os.environ[export] = str(value) 
 | 
            envdata.setVar(export, str(value)) 
 | 
            envdata.setVarFlag(export, 'export', '1') 
 | 
        if export == "PSEUDO_DISABLED": 
 | 
            if "PSEUDO_UNLOAD" in os.environ: 
 | 
                del os.environ["PSEUDO_UNLOAD"] 
 | 
            envdata.delVar("PSEUDO_UNLOAD") 
 | 
  
 | 
    # Add in all variables from the user's original environment which 
 | 
    # haven't subsequntly been set/changed 
 | 
    origbbenv = d.getVar("BB_ORIGENV", False) or {} 
 | 
    for key in origbbenv: 
 | 
        if key in envdata: 
 | 
            continue 
 | 
        value = origbbenv.getVar(key) 
 | 
        if value is not None: 
 | 
            os.environ[key] = str(value) 
 | 
            envdata.setVar(key, str(value)) 
 | 
            envdata.setVarFlag(key, 'export', '1') 
 | 
  
 | 
    # Use original PATH as a fallback 
 | 
    path = d.getVar('PATH') + ":" + origbbenv.getVar('PATH') 
 | 
    os.environ['PATH'] = path 
 | 
    envdata.setVar('PATH', path) 
 | 
  
 | 
    # A complex PS1 might need more escaping of chars. 
 | 
    # Lets not export PS1 instead. 
 | 
    envdata.delVar("PS1") 
 | 
  
 | 
    # Replace command with an executable wrapper script 
 | 
    command = emit_terminal_func(command, envdata, d) 
 | 
  
 | 
    terminal = oe.data.typed_value('OE_TERMINAL', d).lower() 
 | 
    if terminal == 'none': 
 | 
        bb.fatal('Devshell usage disabled with OE_TERMINAL') 
 | 
    elif terminal != 'auto': 
 | 
        try: 
 | 
            oe.terminal.spawn(terminal, command, title, None, d) 
 | 
            return 
 | 
        except oe.terminal.UnsupportedTerminal: 
 | 
            bb.warn('Unsupported terminal "%s", defaulting to "auto"' % 
 | 
                    terminal) 
 | 
        except oe.terminal.ExecutionError as exc: 
 | 
            bb.fatal('Unable to spawn terminal %s: %s' % (terminal, exc)) 
 | 
  
 | 
    try: 
 | 
        oe.terminal.spawn_preferred(command, title, None, d) 
 | 
    except oe.terminal.NoSupportedTerminals as nosup: 
 | 
        nosup.terms.remove("false") 
 | 
        cmds = '\n\t'.join(nosup.terms).replace("{command}", 
 | 
                    "do_terminal").replace("{title}", title) 
 | 
        bb.fatal('No valid terminal found, unable to open devshell.\n' + 
 | 
                'Tried the following commands:\n\t%s' % cmds) 
 | 
    except oe.terminal.ExecutionError as exc: 
 | 
        bb.fatal('Unable to spawn terminal %s: %s' % (terminal, exc)) 
 | 
  
 | 
oe_terminal[vardepsexclude] = "BB_ORIGENV" 
 |