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