はじめに
ubuntuを使っていて、SSH越しにbitbake virtual/kernel -c menuconfig
や-c devshell
をすると、次のエラーが出て失敗する事がある。
ERROR: linux-raspberrypi-1_5.0.0+gitAUTOINC+00794df915-r0 do_menuconfig: Unable to spawn terminal auto: Execution of '/home/mickey/work/yocto/rpi-thud/layers/poky/scripts/oe-gnome-terminal-phonehome /tmp/tmpja7518rr /home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/temp/run.do_terminal.4874' failed with exit code 1: # オプション“-x”は非推奨であり、将来のgnome-terminal バージョンでは削除される可能性があります。 # “-- ”を使用するとオプション指定を終了します。この後ろに実行するコマンドラインを指定します。 # Error constructing proxy for org.gnome.Terminal:/org/gnome/Terminal/Factory0: org.gnome.Terminal を StartServiceByName で呼び出そうとしてエラー: タイムアウトしました
表示されるエラーメッセージはmenuconfig
とdevshell
でどちらもだいたい同じ。
原因
この2つのタスクでは、自動的にターミナルが起動されるようになっているが、その際にgnome-terminal
が選択される場合に発生する。
# オプション“-x”は非推奨であり、将来のgnome-terminal バージョンでは削除される可能性があります。
こちらの行は直接の原因ではない。
試しにpoky/meta/lib/oe/terminal.py
の次の部分を修正してみたが、結果は変わらなかった。
diff --git a/meta/lib/oe/terminal.py b/meta/lib/oe/terminal.py index caeb5e31ec..17038a0727 100644 --- a/meta/lib/oe/terminal.py +++ b/meta/lib/oe/terminal.py @@ -52,7 +52,7 @@ class XTerminal(Terminal): raise UnsupportedTerminal(self.name) class Gnome(XTerminal): - command = 'gnome-terminal -t "{title}" -x {command}' + command = 'gnome-terminal -t "{title}" -- {command}' priority = 2 def __init__(self, sh_cmd, title=None, env=None, d=None):
どうやら、こちらが起動しない原因となっているようだ。
# Error constructing proxy for org.gnome.Terminal:/org/gnome/Terminal/Factory0: org.gnome.Terminal を StartServiceByName で呼び出そうとしてエラー: タイムアウトしました
解決法その1 - terminal.pyを修正する
ここによれば、dbus-launch
経由でgnome-terminalを起動すると問題が回避できるそうだ。
次のように修正して試したところ、gnome-terminalが起動した。
diff --git a/meta/lib/oe/terminal.py b/meta/lib/oe/terminal.py index caeb5e31ec..92ebf01f50 100644 --- a/meta/lib/oe/terminal.py +++ b/meta/lib/oe/terminal.py @@ -52,7 +52,7 @@ class XTerminal(Terminal): raise UnsupportedTerminal(self.name) class Gnome(XTerminal): - command = 'gnome-terminal -t "{title}" -x {command}' + command = 'dbus-launch gnome-terminal -t "{title}" -x {command}' priority = 2 def __init__(self, sh_cmd, title=None, env=None, d=None):
解決法その2 - 別のターミナルを使用する
local.conf
にOE_TERMINAL
変数を設定すると、別のターミナルを使用することができる。
OE_TERMINAL = "xterm"
これでmenuconfig
やdevshell
の時にxterm
が起動されることになる。
ターミナルは若干プアになるがこれでも作業に支障はない。
マニュアルによれば、次の値が使用できる。
OE_TERMINAL¶ Controls how the OpenEmbedded build system spawns interactive terminals on the host development system (e.g. using the BitBake command with the -c devshell command-line option). For more information, see the "Using a Development Shell" section in the Yocto Project Development Tasks Manual. You can use the following values for the OE_TERMINAL variable: auto gnome xfce rxvt screen konsole none
予めホストPCには使用したいターミナルのパッケージをインストールしておく必要がある。
なぜかこの一覧にはxterm
がないが、手元の環境では問題なく使用できる。
まとめ
SSH経由でターミナルを起動するコマンドを使用する時にgnome-terminal
が選択されると失敗する。
どうしてもgnome-terminalを使用したい場合は、terminal.py
を修正する方法でも構わないが、
pokyの持ち物をローカルで修正すると、git pull
などでツリーを更新したい時に管理が複雑になる。
gnome-terminalにこだわりがないのであれば、OE_TERMINAL
で他のターミナルを使用する方法をおすすめする。