1OE_TERMINAL ?= 'auto' 2OE_TERMINAL[type] = 'choice' 3OE_TERMINAL[choices] = 'auto none \ 4 ${@oe_terminal_prioritized()}' 5 6OE_TERMINAL_EXPORTS += 'EXTRA_OEMAKE CACHED_CONFIGUREVARS CONFIGUREOPTS EXTRA_OECONF' 7OE_TERMINAL_EXPORTS[type] = 'list' 8 9XAUTHORITY ?= "${HOME}/.Xauthority" 10SHELL ?= "bash" 11 12def oe_terminal_prioritized(): 13 import oe.terminal 14 return " ".join(o.name for o in oe.terminal.prioritized()) 15 16def emit_terminal_func(command, envdata, d): 17 import bb.build 18 cmd_func = 'do_terminal' 19 20 envdata.setVar(cmd_func, 'exec ' + command) 21 envdata.setVarFlag(cmd_func, 'func', '1') 22 23 runfmt = d.getVar('BB_RUNFMT') or "run.{func}.{pid}" 24 runfile = runfmt.format(func=cmd_func, task=cmd_func, taskfunc=cmd_func, pid=os.getpid()) 25 runfile = os.path.join(d.getVar('T'), runfile) 26 bb.utils.mkdirhier(os.path.dirname(runfile)) 27 28 with open(runfile, 'w') as script: 29 script.write(bb.build.shell_trap_code()) 30 bb.data.emit_func(cmd_func, script, envdata) 31 script.write(cmd_func) 32 script.write("\n") 33 os.chmod(runfile, 0o755) 34 35 return runfile 36 37def oe_terminal(command, title, d): 38 import oe.data 39 import oe.terminal 40 41 envdata = bb.data.init() 42 43 for v in os.environ: 44 envdata.setVar(v, os.environ[v]) 45 envdata.setVarFlag(v, 'export', '1') 46 47 for export in oe.data.typed_value('OE_TERMINAL_EXPORTS', d): 48 value = d.getVar(export) 49 if value is not None: 50 os.environ[export] = str(value) 51 envdata.setVar(export, str(value)) 52 envdata.setVarFlag(export, 'export', '1') 53 if export == "PSEUDO_DISABLED": 54 if "PSEUDO_UNLOAD" in os.environ: 55 del os.environ["PSEUDO_UNLOAD"] 56 envdata.delVar("PSEUDO_UNLOAD") 57 58 # Add in all variables from the user's original environment which 59 # haven't subsequntly been set/changed 60 origbbenv = d.getVar("BB_ORIGENV", False) or {} 61 for key in origbbenv: 62 if key in envdata: 63 continue 64 value = origbbenv.getVar(key) 65 if value is not None: 66 os.environ[key] = str(value) 67 envdata.setVar(key, str(value)) 68 envdata.setVarFlag(key, 'export', '1') 69 70 # Use original PATH as a fallback 71 path = d.getVar('PATH') + ":" + origbbenv.getVar('PATH') 72 os.environ['PATH'] = path 73 envdata.setVar('PATH', path) 74 75 # A complex PS1 might need more escaping of chars. 76 # Lets not export PS1 instead. 77 envdata.delVar("PS1") 78 79 # Replace command with an executable wrapper script 80 command = emit_terminal_func(command, envdata, d) 81 82 terminal = oe.data.typed_value('OE_TERMINAL', d).lower() 83 if terminal == 'none': 84 bb.fatal('Devshell usage disabled with OE_TERMINAL') 85 elif terminal != 'auto': 86 try: 87 oe.terminal.spawn(terminal, command, title, None, d) 88 return 89 except oe.terminal.UnsupportedTerminal: 90 bb.warn('Unsupported terminal "%s", defaulting to "auto"' % 91 terminal) 92 except oe.terminal.ExecutionError as exc: 93 bb.fatal('Unable to spawn terminal %s: %s' % (terminal, exc)) 94 95 try: 96 oe.terminal.spawn_preferred(command, title, None, d) 97 except oe.terminal.NoSupportedTerminals as nosup: 98 nosup.terms.remove("false") 99 cmds = '\n\t'.join(nosup.terms).replace("{command}", 100 "do_terminal").replace("{title}", title) 101 bb.fatal('No valid terminal found, unable to open devshell.\n' + 102 'Tried the following commands:\n\t%s' % cmds) 103 except oe.terminal.ExecutionError as exc: 104 bb.fatal('Unable to spawn terminal %s: %s' % (terminal, exc)) 105 106oe_terminal[vardepsexclude] = "BB_ORIGENV" 107