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

This changes the runfile that is generated to have the same behaviour as bitbake with regards to emitting the shebang and trap code. The existing implementation used 'env' with the current var-SHELL. This means that if the user has configured there system/environment with a alternate shell (e.g. csh, zsh, fish, etc.) the do_terminal function would attempt to execute with the wrong/incompatible shell and fail silently. With this change devshell and other classes that rely on terminal can now run when the var-SHELL is not set to a sh compatible shell. For devshell, it will launch the devshell with the users configured shell. (From OE-Core rev: 53724281eb486847bc3be824aa4513a8688ec296) Signed-off-by: Nathan Rossi <nathan@nathanrossi.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
107 lines
3.7 KiB
Plaintext
107 lines
3.7 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):
|
|
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:
|
|
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"
|