みつきんのメモ

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

Yocto Project 3.3(Hardknott)で日本語入力

はじめに

Yocto Project 3.3(Hardknott)でラズベリーパイ4を動かすの環境をベースに、Hardknottで日本語入力環境を作成してみる。

かなり古いがyoctoで日本語入力も参考にする。

作業環境の準備

meta-oeをビルド環境に設定する。

$ cd rpi-hardknott
$ source poky/oe-init-build-env build
$ bitbake-layers layerindex-fetch meta-oe

local.confの修正

Yocto Project 3.3(Hardknott)でラズベリーパイ4を動かすで変更したconf/local.confの内容に下記を追加する。

IMAGE_INSTALL_append = " uim-xim uim-utils uim-common uim-gtk2.0 uim-gtk3 uim-anthy"
IMAGE_INSTALL_append = " ttf-vlgothic ttf-sazanami-gothic"
IMAGE_INSTALL_append = " setxkbmap"

IMAGE_LINGUAS = "ja-jp ja-jp.euc-jp"
GLIBC_GENERATE_LOCALES = "ja_JP.UTF-8 ja_JP.EUC-JP"

ビルド

下記のようにcore-image-satoをビルドする。

$ bitbake core-image-sato

ビルドには数時間かかる。

rootfs作成でエラー

最後の最後、core-image-satoのdo_rootfsの処理で下記のエラーが発生する。

Last metadata expiration check: 0:00:01 ago on Mon 05 Jul 2021 03:35:45 PM UTC.
No match for argument: uim-gtk2.0
No match for argument: uim-gtk3
No match for argument: uim-xim
Error: Unable to find a match: uim-gtk2.0 uim-gtk3 uim-xim

uimのレシピで作成されるはずの下記のパッケージが存在しないと言っている。

uimレシピのパッケージ生成状況の確認

まずは下記のコマンドを実行し、uimレシピのdevshellを起動する。

$ bitbake uim -c devshell

自動的にuimのソースディレクトリに移動されるので、次のようにしてパッケージがどのように生成されたかを確認する。

まずはuim-gtk2.0

# tree ../packages-split/uim-gtk2.0/
../packages-split/uim-gtk2.0/

0 directories, 0 files

続いてuim-gtk3

# tree ../packages-split/uim-gtk3/
../packages-split/uim-gtk3/

0 directories, 0 files

最後にgtk-xim

# tree ../packages-split/uim-xim/
../packages-split/uim-xim/

0 directories, 0 files

確かに全てのパッケージが空で生成されている。

config.logの確認

lessでconfig.logを開く。

# less ../build/config.log

gtkで検索してみる。

... (snip) ...
configure:30647: checking for gtk+-2.0 >= 2.2.0 gdk-x11-2.0
configure:30706: result: no
configure:30718: checking for gtk+-2.0 >= 2.4.0 gdk-x11-2.0
configure:30777: result: no
... (snip) ...
configure:30998: checking for gtk+-3.0
configure:31057: result: no

pkg-configでライブラリが見つかっていないように見える。

pkg-configの確認

devshell上でpkg-configを実行してみる。

gtk+-2.0

# pkg-config --libs gtk+-2.0
-lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lfontconfig -lfreetype

gtk+-3.0

# pkg-config --libs gtk+-3.0
-lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0

どちらも見つかる。

本格的に何かがおかしい。

ログを強化する

devshellを抜けて、uimのレシピのdo_configureタスクを実行し直す。

$ bitbake uim -c configure -vvv -f

強化されたログを確認する

devshellに入り直し、log.do_configureを確認する。

# less ../temp/log.do_configure

../uim-1.8.8/configureで検索すると下記のようなログが見つかる。

+ CONFIG_SHELL=/bin/bash ../uim-1.8.8/configure --build=x86_64-linux --host=aarch64-poky-linux --target=aarch64-poky-linux --prefix=/usr --exec_prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/libexec --datadir=/usr/share --sysconfdir=/etc --sharedstatedir=/com --localstatedir=/var --libdir=/usr/lib --includedir=/usr/include --oldincludedir=/usr/include --infodir=/usr/share/info --mandir=/usr/share/man --disable-dependency-tracking --with-libtool-sysroot=/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot --disable-emacs --with-libedit=/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr --without-scim --without-m17nlib --without-prime --without-canna --without-mana --without-eb --disable-static --enable-nls

これが実際に実行されているconfigureのコマンドラインだと推測される。

情報を増やすためにdevshell上で下記のように実行してみる。ポイントはCONFIG_SHELLに設定するbashの引数に-xを設定することと、標準出力と標準エラー出力の内容をファイルに保存すること。

# cd ../build
# CONFIG_SHELL='/bin/bash -x' ../uim-1.8.8/configure --build=x86_64-linux --host=aarch64-poky-linux --target=aarch64-poky-linux --prefix=/usr --exec_prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/libexec --datadir=/usr/share --sysconfdir=/etc --sharedstatedir=/com --localstatedir=/var --libdir=/usr/lib --includedir=/usr/include --oldincludedir=/usr/include --infodir=/usr/share/info --mandir=/usr/share/man --disable-dependency-tracking --with-libtool-sysroot=/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot --disable-emacs --with-libedit=/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr --without-scim --without-m17nlib --without-prime --without-canna --without-mana --without-eb --disable-static --enable-nls > configure.txt 2>&1

いろいろ調べた結果下記のコマンドで得られた情報が有効だった。ログの感じからpkg-configコマンドでライブラリを調べているっぽい部分のtestによる比較が、空との比較になっているようだ。

# grep -i 'checking.*gtk' -A10 configure.txt
+ printf '%s\n' 'configure:30623: checking for gtk+-2.0 >= 2.2.0 gdk-x11-2.0'
+ printf %s 'checking for gtk+-2.0 >= 2.2.0 gdk-x11-2.0... '
checking for gtk+-2.0 >= 2.2.0 gdk-x11-2.0... + test -n ''
+ test -n ''
+ pkg_failed=untried
+ test -n ''
+ test -n ''
+ pkg_failed=untried
+ test untried = yes
+ test untried = untried
+ printf '%s\n' 'configure:30682: result: no'
+ printf '%s\n' no
no
... (snip) ...

configureスクリプトの30623行以降の判定分を確認してみる。

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gtk+-2.0 >= 2.2.0 gdk-x11-2.0" >&5
printf %s "checking for gtk+-2.0 >= 2.2.0 gdk-x11-2.0... " >&6; }

if test -n "$GTK2_CFLAGS"; then
    pkg_cv_GTK2_CFLAGS="$GTK2_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.2.0 gdk-x11-2.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.2.0 gdk-x11-2.0") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK2_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.2.0 gdk-x11-2.0" 2>/dev/null`
                      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi

下記の変数の内容が空になっていると思われる。

  • GTK2_CFLAGS
  • PKG_CONFIG

PKG_CONFIGはpkg-configコマンドのパスが格納されている必要があるので、これはおかしい。

念の為、devshellでpkg-configのパスを確認する。

# which pkg-config
/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot-native/usr/bin/pkg-config

ちゃんとrecipes-sysroot-native以下のコマンドを呼び出している。

どうやら、configureスクリプトのpkg-config検出に問題があるっぽい。

PKG_CONFIGを設定してみる

PKG_CONFIGは環境変数によっても制御できるようなので、手動で設定してみる。

# export PKG_CONFIG=`which pkg-config`
# CONFIG_SHELL='/bin/bash -x' ../uim-1.8.8/configure --build=x86_64-linux --host=aarch64-poky-linux --target=aarch64-poky-linux --prefix=/usr --exec_prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/libexec --datadir=/usr/share --sysconfdir=/etc --sharedstatedir=/com --localstatedir=/var --libdir=/usr/lib --includedir=/usr/include --oldincludedir=/usr/include --infodir=/usr/share/info --mandir=/usr/share/man --disable-dependency-tracking --with-libtool-sysroot=/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot --disable-emacs --with-libedit=/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr --without-scim --without-m17nlib --without-prime --without-canna --without-mana --without-eb --disable-static --enable-nls > configure.txt 2>&1

実行結果を確認する。

+ printf '%s\n' 'configure:30623: checking for gtk+-2.0 >= 2.2.0 gdk-x11-2.0'
+ printf %s 'checking for gtk+-2.0 >= 2.2.0 gdk-x11-2.0... '
checking for gtk+-2.0 >= 2.2.0 gdk-x11-2.0... + test -n ''
+ test -n /home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot-native/usr/bin/pkg-config
+ test -n /home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot-native/usr/bin/pkg-config
+ printf '%s\n' 'configure:30630: $PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.2.0 gdk-x11-2.0"'
+ ac_status=0
+ printf '%s\n' 'configure:30633: $? = 0'
+ test 0 = 0
++ /home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot-native/usr/bin/pkg-config --cflags 
'gtk+-2.0 >= 2.2.0 gdk-x11-2.0'
+ pkg_cv_GTK2_CFLAGS='-pthread -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/i
nclude/gtk-2.0 -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/include/atk-1.0 -
I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/include/gtk-2.0 -I/home/mickey/wo
rk/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/lib/gtk-2.0/include -I/home/mickey/work/yocto/rpi
-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/include/pango-1.0 -I/home/mickey/work/yocto/rpi-hardknott/bui
ld/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/include/harfbuzz -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cor
texa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/include/pango-1.0 -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-li
nux/uim/1.8.8-r0/recipe-sysroot/usr/include/fribidi -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0
/recipe-sysroot/usr/include/harfbuzz -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot
/usr/include/cairo -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/include/pixma
n-1 -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/include/uuid -I/home/mickey/
work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/include/freetype2 -I/home/mickey/work/yocto/rpi
-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/include/libdrm -I/home/mickey/work/yocto/rpi-hardknott/build/
tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/include/libpng16 -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortex
a72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/include/gdk-pixbuf-2.0 -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-
linux/uim/1.8.8-r0/recipe-sysroot/usr/include/libmount -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8
-r0/recipe-sysroot/usr/include/blkid -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot
/usr/include/glib-2.0 -I/home/mickey/work/yocto/rpi-hardknott/build/tmp/work/cortexa72-poky-linux/uim/1.8.8-r0/recipe-sysroot/usr/lib/glib-2
.0/include'
+ test x0 '!=' x0
+ test -n ''

これまで空だった変数に値が設定され、pkg-configコマンドが実行されているように見える。

# tail config.log
#define GNOME3LOCALEDIR "/usr/share/locale"
#define XLIB_DIR "/usr/share"
#define UIM_PIXMAPSDIR "/usr/share/uim/pixmaps"
#define USE_GTK2 1
#define USE_GTK3 1
#define HAVE_FORKPTY 1
#define UIM_USE_NOTIFY_PLUGINS 1
#define UIM_USE_ERROR_GUARD 1

configure: exit 0

gtk2とgtk3は認識されたっぽい。

修正方法

bbappendを作成する

uimのdo_configureの時点でPKG_CONFIG環境変数が設定されるようにするためにbbappendを作成する。

$ bitbake-layers create-layer meta-local
$ mv ./meta-local ../poky/
$ bitbake-layers add-layer ../poky/meta-local/
$ recipetool newappend -e ../poky/meta-local uim

-eをつけてrecipetool newappendを実行すると、作成されたbbappendファイルがエディタで開かれた状態になるので、下記の内容を追加する。

do_configure_prepend() {
    export PKG_CONFIG="${RECIPE_SYSROOT_NATIVE}/usr/bin/pkg-config"
}

ビルド

$ bitbake uim -f 

パッケージ生成結果の確認

$ bitbake uim -c devshell

devshell上で下記のコマンドを実行する。

# tree uim-gtk* uim-xim
uim-gtk2.0
└── usr
    ├── bin
    │   ├── uim-im-switcher-gtk
    │   ├── uim-input-pad-ja
    │   ├── uim-pref-gtk
    │   ├── uim-toolbar-gtk
    │   └── uim-toolbar-gtk-systray
    └── lib
        └── gtk-2.0
            └── 2.10.0
                └── immodules
                    └── im-uim.so
uim-gtk2.0.shlibdeps [error opening dir]
uim-gtk3
└── usr
    ├── bin
    │   ├── uim-im-switcher-gtk3
    │   ├── uim-input-pad-ja-gtk3
    │   ├── uim-pref-gtk3
    │   ├── uim-toolbar-gtk3
    │   └── uim-toolbar-gtk3-systray
    └── lib
        └── gtk-3.0
            └── 3.0.0
                └── immodules
                    └── im-uim.so
uim-gtk3.shlibdeps [error opening dir]
uim-xim
└── usr
    ├── bin
    │   └── uim-xim
    ├── libexec
    │   ├── uim-candwin-gtk
    │   ├── uim-candwin-gtk3
    │   ├── uim-candwin-horizontal-gtk
    │   ├── uim-candwin-horizontal-gtk3
    │   ├── uim-candwin-tbl-gtk
    │   └── uim-candwin-tbl-gtk3
    └── share
        └── man
            └── man1
                └── uim-xim.1

18 directories, 20 files

必要なファイルが作成されていることがわかる。

日本語入力環境をビルド

core-image-satoをビルドしてみる。

$ bitbake core-image-sato

動作確認

ラズパイを起動し、rootでログインしたあと~/.profileを下記の内容で作成しrebootする。

export LC_ALL=ja_JP.UTF-8
export GTK_IM_MODULE="uim"
export XMODIFIERS="@im=uim-anthy"
uim-xim &
uim-toolbar-gtk-systray &
setxkbmap -layout jp

再起動後、キーボードも日本語配列になり、 「shift+スペース」で日本語入力ができるようになる。

f:id:mickey_happygolucky:20210706090553p:plain
日本語入力の例

まとめ

しばらく放置していたらuimのレシピがまた使えなくなっていた。

おそらくuimのバージョンが上がったことに原因がある。

本来はconfigureスクリプトがなぜpkg-configコマンドを検出しないかを調査し、修正する必要があるが、今回は環境変数PKG_CONFIGを設定することで対処した。

若干修正が必要だが、hardknottでも日本語入力環境を作成することができることがわかった。