mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00

Now that we filter out PATH to only the utilities we rely upon, the devshel terminal was broken since it can no longer find the terminals. Even if we fix that, the user couldn't access any of their commands within devshell which somewhat defeats its purpose. Add the original PATH back to the environment to restore that behaviour since this is more in line with user expectations and it wouldn't be possible (or desireable) to whitelist all the commands a user might want to use from the shell. (From OE-Core rev: 67d7ea2db8bce766daf3419feae3cd8045af5114) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
106 lines
3.6 KiB
Plaintext
106 lines
3.6 KiB
Plaintext
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):
|
|
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:
|
|
script.write('#!/bin/sh -e\n')
|
|
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"
|