diff options
Diffstat (limited to 'meta')
-rw-r--r-- | meta/classes/terminal.bbclass | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/meta/classes/terminal.bbclass b/meta/classes/terminal.bbclass index 8cebad4162..ae338e9f57 100644 --- a/meta/classes/terminal.bbclass +++ b/meta/classes/terminal.bbclass @@ -11,43 +11,66 @@ XAUTHORITY ?= "${HOME}/.Xauthority" SHELL ?= "bash" +def emit_terminal_func(command, envdata, d): + cmd_func = 'do_terminal' + + envdata.setVar(cmd_func, 'exec ' + command) + envdata.setVarFlag(cmd_func, 'func', 1) + + runfmt = d.getVar('BB_RUNFMT', True) or "run.{func}.{pid}" + runfile = runfmt.format(func=cmd_func, pid=os.getpid()) + runfile = os.path.join(d.getVar('T', True), runfile) + with open(runfile, 'w') as script: + script.write('#!/bin/sh -e\n') + bb.data.emit_func(cmd_func, script, envdata) + script.write(cmd_func) + script.write("\n") + os.chmod(runfile, 0755) + + return runfile + def oe_terminal(command, title, d): import oe.data import oe.terminal - env = dict() + envdata = bb.data.init() for v in os.environ: - env[v] = os.environ[v] + 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, True) if value is not None: os.environ[export] = str(value) - env[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"] - if "PSEUDO_UNLOAD" in env: - del env["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 env: + if key in envdata: continue value = origbbenv.getVar(key, True) if value is not None: os.environ[key] = str(value) - env[key] = str(value) + envdata.setVar(key, str(value)) + envdata.setVarFlag(key, 'export', 1) + + # 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, env, d) + oe.terminal.spawn(terminal, command, title, None, d) return except oe.terminal.UnsupportedTerminal: bb.warn('Unsupported terminal "%s", defaulting to "auto"' % @@ -56,7 +79,7 @@ def oe_terminal(command, title, d): bb.fatal('Unable to spawn terminal %s: %s' % (terminal, exc)) try: - oe.terminal.spawn_preferred(command, title, env, d) + oe.terminal.spawn_preferred(command, title, None, d) except oe.terminal.NoSupportedTerminals: bb.fatal('No valid terminal found, unable to open devshell') except oe.terminal.ExecutionError as exc: |