みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

yocto SSH越しでbitbake virtual/kernel -c menuconfigが失敗する場合の対処

はじめに

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 で呼び出そうとしてエラー: タイムアウトしました

表示されるエラーメッセージはmenuconfigdevshellでどちらもだいたい同じ。

原因

この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.confOE_TERMINAL変数を設定すると、別のターミナルを使用することができる。

OE_TERMINAL = "xterm"

これでmenuconfigdevshellの時に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で他のターミナルを使用する方法をおすすめする。