Build and Install fcitx-mozc for CentOS7.6.1810

はじめに

PCを組んでCentOSを入れた.

heavymoon.hateblo.jp heavymoon.hateblo.jp

CentOSのIMはデフォルトだとあの悪名高いiBusが入ってる. 慣れの問題もあるけれど,例によって私もiBusはあまり好かない. 旧PCでは fcitx-mozc を使っていたので,新PCでもインストールする.

FedoraSUSEUbuntu は新しい技術を積極的に取り込んでいるのであまり日本語入力には困らないけれど, CentOS ではそうは行かない.

CentOSリポジトリにはMOZCは無いので自前でビルドする必要があるのだけれど, よく見かけるのは Fedora のパッケージを rpmbuild で流用する方法. 旧PCではこの方法でビルドしたものを使っていたけれど, CentOS のCのライブラリが Fedora よりも古かったり, 結構面倒だった記憶が有る. また CentOS 用にビルドした記事が見つかっても,情報が古すぎて最早使えない手順と化しているものも有る. 入門者が自分でビルドするのは難しいでしょう.

CentOSユーザの端くれとして,また,私の備忘として,この残念な日本語入力環境を改善するべくちょっと長めにビルドの流れを書いておく.

MOZCについて

Mozc は Google の作った IME で,GitHub にソースがあるので自分でビルドできる.

github.com

Mozc is a Japanese Input Method Editor (IME) designed for multi-platform such as Android OS, Apple OS X, Chromium OS, GNU/Linux and Microsoft Windows. This OpenSource project originates from Google Japanese Input.

ビルドの手順も丁寧に記載してあるけれど,CentOSの記載は無い上,Fedora の手順もちょっと手を加えないとビルドできなかった. そのまま手順をトレースすると Dockerfile の NaCL の SDK インストール部分でコケる. Fedora 用にビルドするのに NaCL は無関係なので,NaCL のSDK 導入周りをまるっとコメントアウトしてあげれば,あとは手順どおりにビルドできる.

ビルドに成功すれば,コンテナ内の /home/mozc_builder/work/mozc/src/out_linux/Release/ にバイナリができる.

まずは Fedora の手順で大体の流れをつかむと良い.

Docker の使い方

その昔 Firefox をコンテナに閉じ込めて以来 Docker を久々に触った.

さっぱり使い方忘れてたので,これだけ知っていればビルドに差し支えないものだけをざっくりとピックアップ.

他のコマンドも知りたければ man を読むなり,ドキュメントを読むと良い. docs.docker.com

イメージ作成

$ sudo docker build --rm -t $(作成するイメージ名前) .

カレントディレクトリにある Dockerfile を元に Docker イメージを作成する.

  • --rm
    • Remove intermediate containers after a successful build
  • -t $(作成するイメージ名前)
    • Name and optionally a tag in the ‘name:tag’ format

イメージ確認

$ sudo docker images
$ sudo docker image list

DockerHub から拾ってきたイメージや 自分で作成したイメージ の一覧を表示する

コンテナ作成/起動

$ sudo docker run --interactive --tty $(イメージ名前)

指定したイメージからコンテナを起動する

  • --interactive
    • Keep STDIN open even if not attached
  • --tty
    • Allocate a pseudo-TTY

コンテナ一覧

$ sudo dcoker ps -a

コンテナの一覧を表示する

  • -a
    • Show all containers (default shows just running)

コンテナ起動

$ sudo docker start -i $(コンテナ名)

停止してたコンテナを起動する

  • -i
    • Attach container’s STDIN

コンテナ内のファイル/ディレクトリコピー

$ sudo docker cp $(コンテナ名):/path/to/src /path/to/dst

指定したコンテナ内のファイルやディレクトリをローカルのOSにコピーする

コンテナ削除

$ sudo docker rm $(コンテナ名)

指定したコンテナを削除する

イメージ削除

$ sudo docker rmi $(イメージ名)

指定したイメージを削除する

MOZCビルド

ここからが本題.

Dockerfile 作成

$ mkdir fcitx-mozc && cd fcitx-mozc
$ vi Dockerfile
#######################################
#   Build fcitx-mozc for CentOS7.6.1810 - 2019-02-16
#######################################
# Base Image
FROM centos:latest

# Update Packages
RUN yum -y update

# Install Packages
RUN yum -y install  epel-release.noarch
RUN yum -y install  clang libstdc++-static python git curl bzip2 unzip which \
                    ibus-devel fcitx-devel glib2-devel qt5-qtbase-devel gtk2-devel libxcb-devel emacs

# Add build user
ENV HOME /home/heavymoon
RUN useradd --create-home --shell /bin/bash --base-dir /home heavymoon
USER heavymoon

# SDK setup
RUN mkdir -p /home/heavymoon/work
WORKDIR /home/heavymoon/work

## depot_tools for Ninja prebuilt
RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
ENV PATH $PATH:/home/heavymoon/work/depot_tools

# check out fictx mozc source with submodules
RUN git clone https://github.com/fcitx/mozc.git -b fcitx --single-branch --recursive
WORKDIR /home/heavymoon/work/mozc/src

# remove fcitx5
RUN rm -r unix/fcitx5/

# build mozc
RUN python build_mozc.py gyp --target_platform=Linux
RUN python build_mozc.py build -c Release   unix/ibus/ibus.gyp:ibus_mozc \
                                            unix/fcitx/fcitx.gyp:fcitx-mozc \
                                            unix/emacs/emacs.gyp:mozc_emacs_helper \
                                            server/server.gyp:mozc_server \
                                            gui/gui.gyp:mozc_tool \
                                            renderer/renderer.gyp:mozc_renderer

WORKDIR /home/heavymoon/work/mozc/src
ENTRYPOINT bash

私が使いたいのは fcitx-mozc なので,google/mozc のソースだけではビルドできない. これマージしてくれ... fcitx/mozc からソースを拾ってくる必要がある.

横着してイメージ作成時にビルドまで実行しているけど,本来の手順どおりにコンテナ作成してからビルドしたほうが無難.

イメージ作成

$ sudo docker build --rm -t centos/fcitx-mozc .
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
centos/fcitx-mozc   latest              e6d04cc338c2        About a minute ago   2.46GB

centos/fcitx-mozcのイメージが作成される.

コンテナ起動

$ sudo docker run --interactive --tty centos/fcitx-mozc
Container>>$ ls /home/heavymoon/work/mozc/src/out_linux/Release/
build.ninja          fcitx-mozc.so.TOC          gen_collocation_suppression_data_main  gen_single_kanji_noun_prefix_data_main  gen_system_dictionary_data_main     mozc_emacs_helper  mozc_tool  protoc
dataset_writer_main  gen                        gen_emoticon_rewriter_data_main        gen_suggestion_filter_main              gen_usage_rewriter_dictionary_main  mozc_renderer      obj
fcitx-mozc.so        gen_collocation_data_main  gen_oss_sbm                            gen_symbol_rewriter_dictionary_main     ibus_mozc                           mozc_server        obj.host
Container>>$ ls /home/heavymoon/work/mozc/scripts/
build  build_fcitx5  clang-format.sh  configure  install  install_fcitx  install_fcitx5  install_server
Container>>$ exit
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
cbe0ea2ecbe5        centos/fcitx-mozc   "/bin/sh -c bash"   10 seconds ago      Exited (0) 2 seconds ago                       unruffled_bassi

コンテナ起動ついでにビルドしたバイナリを確認.
fcitxのソースだとデバッグ版のインストールスクリプトも用意してあるが,パット見あまり作り込んでない様子. とはいえこれを参考にインストールすれば良い.

バイナリ等回収

$ sudo docker cp unruffled_bassi:/home/heavymoon/work/mozc/src/out_linux/ .
$ sudo docker cp unruffled_bassi:/home/heavymoon/work/mozc/src/data/ .
$ sudo docker cp unruffled_bassi:/home/heavymoon/work/mozc/src/unix/ .

諸々ファイルを回収する.

コンテナ削除

$ sudo docker rm unruffled_bassi 
unruffled_bassi

バイナリは回収したのでコンテナを削除する.

再度コンテナ内をあさりたい場合は再度イメージからコンテナを作成してもいいし, コンテナ削除前に停止しているコンテナを起動してもいい.

$ sudo docker start -i unruffled_bassi

イメージも不要なら削除しても良い.

$ sudo docker rmi centos/fcitx-mozc:latest

インストール

$ yum -y install epel-release.noarch
$ yum -y install fcitx fcitx-configtool

fcixt は事前にインストールしておく.

旧PCにインストールしてあるMOZCの状態と fcitx のインストールスクリプトを参考にインストールスクリプトを書いた.

#!/bin/sh
#######################################
#   install fcitx-mozc for CentOS7.6.1810
#######################################
## init
_bldtype=Release

## Install MOZC
install -D -m 755 out_linux/${_bldtype}/mozc_server         /usr/lib/mozc/mozc_server
install    -m 755 out_linux/${_bldtype}/mozc_tool           /usr/lib/mozc/mozc_tool
install -D -m 644 data/installer/credits_en.html            /usr/share/doc/mozc-2.23.2815.102/credits_en.html

## Install fcitx-mozc
for mofile in out_linux/${_bldtype}/gen/unix/fcitx/po/*.mo
do
    filename=`basename $mofile`
    lang=${filename/.mo/}
    install -D -m 644 $mofile /usr/share/locale/$lang/LC_MESSAGES/fcitx-mozc.mo
done

install    -m 755 out_linux/${_bldtype}/fcitx-mozc.so       /usr/lib64/fcitx/
install    -m 644 unix/fcitx/fcitx-mozc.conf                /usr/share/fcitx/addon/
install    -m 644 unix/fcitx/mozc.conf                      /usr/share/fcitx/inputmethod/

install -D -m 644 data/images/product_icon_32bpp-128.png    /usr/share/fcitx/mozc/icon/mozc.png
install    -m 644 data/images/unix/ui-alpha_full.png        /usr/share/fcitx/mozc/icon/mozc-alpha_full.png
install    -m 644 data/images/unix/ui-alpha_half.png        /usr/share/fcitx/mozc/icon/mozc-alpha_half.png
install    -m 644 data/images/unix/ui-direct.png            /usr/share/fcitx/mozc/icon/mozc-direct.png
install    -m 644 data/images/unix/ui-hiragana.png          /usr/share/fcitx/mozc/icon/mozc-hiragana.png
install    -m 644 data/images/unix/ui-katakana_full.png     /usr/share/fcitx/mozc/icon/mozc-katakana_full.png
install    -m 644 data/images/unix/ui-katakana_half.png     /usr/share/fcitx/mozc/icon/mozc-katakana_half.png
install    -m 644 data/images/unix/ui-dictionary.png        /usr/share/fcitx/mozc/icon/mozc-dictionary.png
install    -m 644 data/images/unix/ui-properties.png        /usr/share/fcitx/mozc/icon/mozc-properties.png
install    -m 644 data/images/unix/ui-tool.png              /usr/share/fcitx/mozc/icon/mozc-tool.png

## Install mozc emacs helper
install    -m 644 out_linux/${_bldtype}/mozc_emacs_helper   /usr/bin/
install -D -m 644 unix/emacs/mozc.el                        /usr/share/emacs/site-lisp/mozc.el
$ sudo /bin/sh ./install

これを root で実行すれば良い.

ちなみにハードコードしているバージョンはここで確認できる.

$ cat data/version/mozc_version_template.bzl
<略>
MAJOR=2
MINOR=23
BUILD=2815
REVISION=102
<略>

IM 設定

$ imsettings-switch fcitx

あとは IM に fcitx を指定して,適当に設定すればOK.

設定メモ

とりあえず設定メモは書いてみたものの,Cinnamonだとインラインできない様子.GNOMEだとインラインできる.まぁ支障ないからいいや.

インライン変換できない場合

日本語入力変換確定前,カーソル位置に入力した文字が表示されないけど,変換候補だけ表示される. そんな場合は,以下設定すると良いらしい.

  1. 入力メソッドの設定(Fcitxの設定) > アドオン > Advanced のチェックON
  2. Fcitx XIM Frontend の設定 > XIM で On The Spot スタイルを使う のチェックをON
  3. Fcitx を再起動

変換候補がウィンドウ左下に表示される場合

変換候補がカーソル付近でなく,ウィンドウ左下くらいに表示される場合は GTK や Qt のモジュールを入れると改善できるらしい.

  1. モジュールを追加する
  2. $ sudo yum -y install fcitx-gtk2 fcitx-gtk3 fcitx-qt4 fcitx-qt5
  3. Fcitx を再起動する(だめならOS再起動)

旧PCでインライン変換できないのは rpmbuild で fedora から流用した関係でライブラリの整合取れてないのかな.