はじめに
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+スペース」で日本語入力ができるようになる。
まとめ
しばらく放置していたらuimのレシピがまた使えなくなっていた。
おそらくuimのバージョンが上がったことに原因がある。
本来はconfigureスクリプトがなぜpkg-configコマンドを検出しないかを調査し、修正する必要があるが、今回は環境変数PKG_CONFIGを設定することで対処した。
若干修正が必要だが、hardknottでも日本語入力環境を作成することができることがわかった。