⌨️

UbuntuでMozcの新しいバージョンをビルドするには

2023/11/01に公開

UbuntuでMozcをビルド

Mozcは言わずとしれた、日本語入力のためのソフトウェアです。
Ubuntu:23.10(mantic),Debian:12(bookworm)で、Mozcをgitリポジトリのソースからビルドしてみます。(Ubuntu:23.04(lunar)は下記のDebianと同じ手順でビルドできると思います。)

公式のgit版ソース[1]では、ibus-mozcのgypでのビルドが取り除かれたため、bazelでのビルドになります。Ubuntuのbazel-bootstrapパッケージでは、バージョンが古いのでビルドできません。新しいbazelをビルドしようとしてもbazelのバージョンが古いため、bazelを用いたビルドは無理でした。
新しいバージョンのbazelを別途、用意します。

bazelのインストール

  1. bazelのバージョン7.1.1をバイナリインストール[2]します。
    Linux版の7.1.1が出ています。(6.4.0でもビルド可能です。)

    aria2c -c https://github.com/bazelbuild/bazel/releases/download/7.1.1/bazel-7.1.1-installer-linux-x86_64.sh
    bash bazel-7.1.1-installer-linux-x86_64.sh --user
    source ~/.bazel/bin/bazel-complete.bash
    export PATH="$PATH:$HOME/bin"
    bazel --version
    
    bazel 7.1.1
    
  2. bazelを使わないで、ソースからbazelをビルドする場合。[3]
    bazel-${version}-dist.zipをダウンロードして、ビルドします。
    7.1.1がビルド可能でした。
    TMPDIRを設定しているのは、/tmpが小さい場合の対策です。

    sudo apt-get install build-essential openjdk-22-jdk python3 zip unzip
    wget https://github.com/bazelbuild/bazel/releases/download/7.1.1/bazel-7.1.1-dist.zip
    unzip -d bazel-src bazel-7.1.1-dist.zip
    cd bazel-src
    mkdir -p ~/.tmp
    env EXTRA_BAZEL_ARGS="--tool_java_runtime_version=local_jdk" TMPDIR=~/.tmp bash ./compile.sh 
    sudo cp output/bazel /usr/local/bin
    bazel --version
    
    bazel 7.1.1- (@non-git)
    

    Debian(bookworm)の場合

    sudo apt-get install build-essential openjdk-17-jdk python3 zip unzip
    

ビルドに必要なパッケージの取得

ソースパッケージのダウンロードを有効にしておきます。
Debianの場合は、/etc/apt/sources.list.d/debian.sourcesのTypesにdeb-srcを加えて、apt-get updateしておきます。
Ubuntuの場合は、/etc/apt/sources.listのdeb-srcのコメントアウトを取り除いて、apt-get updateしておけばOKです。

sudo apt-get build-dep mozc
sudo apt-get install qt6ct qt6-base-dev libfcitx5-qt6-dev

Ubuntu:manticコンテナなどで一から導入する場合。

apt-get update
apt-get install -y sudo apt-utils wget
sudo sed 's/^.*deb-src /deb-src /' -i /etc/apt/sources.list
sudo apt-get update
sudo apt-get build-dep -y mozc
sudo apt-get install -y build-essential dpkg-dev make git qt6ct qt6-base-dev libfcitx5-qt6-dev curl unzip

Mozcの最新版ソースを取得

Mozc公式からforkさせたレポジトリ[4]を使います。
branch名はubuntuとしておきました。

mkdir -p build
cd build
git clone --recursive --depth 1 https://github.com/phoepsilonix/mozc -b ubuntu

ビルド

cd mozc
ls debian/patches/*.patch|xargs -n1 patch -p1 -i 
fakeroot debian/rules binary

パッチをあてたうえで、fakeroot debian/rules binaryを使って、ビルドしています。
無事終わったら、ひとつ上のディレクトリにパッケージが作成されます。

パッチの微修正が終わったので、次のコマンドでもバイナリパッケージは作成できるかと思います。

cd mozc
dpkg-buildpackage -b --no-sign
ls ../*.deb

インストール

ibus-mozcの設定ファイルを削除しておきます。
削除しておけば、mozc_rendererの設定値が新しく書き出されるようです。
個人的にカスタマイズを行っている人はバックアップしておいてください。

rm ~/.config/mozc/ibus_config.textproto

作成したパッケージを手動インストールします。

cd ..
sudo dpkg -i mozc-data*.deb mozc-server*.deb mozc-utils-gui-*.deb ibus-mozc_*.deb
sudo apt-get --fix-broken install
ibus write-cache
ibus restart

fcitx5-mozcの場合には、ibus-mozc_*.debの部分を、fcitx5-mozc*.debに置き換えてください。

sudo dpkg -i mozc-data*.deb mozc-server*.deb mozc-utils-gui-*.deb fcitx5-mozc_*.deb

入力例

waylandでも用例表示が行われました。

不要パッケージのアンインストール

次のコマンドで、ビルドのためにインストールしたパッケージをアンインストールできると思います。

sudo apt-get autoremove

説明

上記のレポジトリでは、apt-get source mozcで入手できるパッケージソースをベースに以下の修正を行っています。

1. debian/rules

fcitxはgypを用いて、それ以外はbazelでビルドをするように修正しています。uimはターゲットから削除しています。
デバッグ情報やbuild-idの形式でパッケージング時にエラーがでるため、CFLAGS、CXXFLAGS、LDFLAGSを調整しています。これに関連してbazelコマンドにlinkoptをつけないとLDFLAGSが反映されませんでしたので、その点も調整しました。

  • CFLAGS,CXXFLAGSに-gdwarf-4を追加。
  • LDFLAGSに-Wl,--build-id=sha1を追加。
  • bazelに--linkopt "$(LDFLAGS)"オプションを指定。
  • bazelに--copt,--cxxoptも追加。CPPFLAGSを加えるとredifinitionエラーになります。
  • Ubuntuでは標準でltoが有効になっていますが、無効にしました。gcc,clangどちらでもビルドできるかと思います。
ifeq ($(shell dpkg-vendor --derives-from Ubuntu && echo yes), yes)
    export DEB_BUILD_MAINT_OPTIONS += optimize=-lto
endif

CPPFLAGS:=$(shell dpkg-buildflags --get CPPFLAGS)
CFLAGS:=$(shell dpkg-buildflags --get CFLAGS) $(CPPFLAGS) -fPIE -gdwarf-4 -fPIC
CXXFLAGS:=$(shell dpkg-buildflags --get CXXFLAGS) $(CPPFLAGS) -fPIE -gdwarf-4 -fPIC
LDFLAGS:=$(shell dpkg-buildflags --get LDFLAGS) -Wl,--as-needed -Wl,--build-id=sha1
BAZEL_CFLAGS:=$(shell echo $(shell dpkg-buildflags --get CFLAGS) -fPIE -gdwarf-4 -fPIC|xargs -n1 echo "--copt")
BAZEL_CXXFLAGS:=$(shell echo $(shell dpkg-buildflags --get CXXFLAGS) -fPIE -gdwarf-4 -fPIC|xargs -n1 echo "--cxxopt")
bazel build $(TARGET_STATIC) --config oss_linux --compilation_mode opt --linkopt "$(LDFLAGS)" $(BAZEL_CFLAGS) $(BAZEL_CXXFLAGS)
bazel build $(TARGETS) $(TARGET_FCITX5) --config oss_linux --compilation_mode opt --linkopt "$(LDFLAGS)" $(BAZEL_CFLAGS) $(BAZEL_CXXFLAGS)

2. installファイル

gypはout_linux、bazelはbazel-binに、コンパイルされたファイルができるので、その違いを反映しました。

3. patchファイル

fcitx,fcitx5のパッチは、元々配布されているパッケージとほぼ同じ中身のパッチだと思います。
fcitx-mozcレポジトリ[5]で、gitコマンドで生成したものに、置き換えています。
アイコンとアイコン以外の2つのパッチファイルに分けている理由は、パッチに修正を加えた場合、エディタによってアイコンのバイナリ部分も変更されてしまう場合があり、その場合、アイコン画像として壊れてしまうからです。

パッチ生成手順
git clone --depth 1 --no-single-branch https://github.com/fcitx/mozc.git fcitx-mozc
cd fcitx-mozc
git diff origin/master..origin/fcitx --text --binary -- ':!scripts/icons/*' ':!.github/*'> 0001-Support-fcitx.patch
git diff origin/master..origin/fcitx --text --binary -- 'scripts/icons/*'> 0002-fcitx5-icon.patch

それに加えてビルド時にエラーを出さないため、いくつかパッチを追加しています。(gcc,clangのどちらでもビルドできるように、一応配慮してみました。)

これらが、Ubuntu/manticのパッケージソースとの相違点です。

Debianでもビルド

debian/bookworm向けにも用意してみました。
bazelは上記の手順で別途同様にインストールしておきましょう。

sudo apt-get build-dep mozc
sudo apt-get install qt6ct qt6-base-dev libfcitx5-qt6-dev

もしもパッケージが不足していたら、下記パッケージもチェックしてみてください。

sudo apt-get install libfcitx5core-dev libfcitx5utils-dev fcitx5-modules-dev libfcitx5core-dev libfcitx5config-dev

Debian:bookwormコンテナなどで一からインストールする場合、下記コマンドで必要なパッケージが揃うと思います。(githubのDebian:bookwormのコンテナで、動作確認済み。)

apt-get update
apt-get install sudo apt-utils wget
sudo sed 's/Types: deb *$/Types: deb deb-src/' -i /etc/apt/sources.list.d/debian.sources
sudo apt-get update
sudo apt-get build-dep mozc
sudo apt-get install build-essential dpkg-dev make git qt6ct qt6-base-dev libfcitx5-qt6-dev curl unzip

パッチについては、fcitxのバージョンがUbuntuとは異なるので、パッチが若干異なっています。

0001-Support-fcitx.patch
diff --git a/debian/patches/0001-Support-fcitx.patch b/debian/patches/0001-Support-fcitx.patch
index 15e0110e0..3ee64052f 100644
--- a/debian/patches/0001-Support-fcitx.patch
+++ b/debian/patches/0001-Support-fcitx.patch
@@ -6279,14 +6279,14 @@ index 000000000..7e3e78d61
 +  toolMenu_.addAction(&aboutAction_);
 +
 +  toolAction_.setMenu(&toolMenu_);
-+
++/*
 +  globalConfigReloadHandle_ =
 +      instance_->watchEvent(EventType::GlobalConfigReloaded,
 +                            EventWatcherPhase::Default, [this](Event &) {
 +                              ResetClientPool();
 +                              return true;
 +                            });
-+
++*/
 +  reloadConfig();
 +}
 +

ビルド手順は、Ubuntuの手順と基本的に同じになるはずです。

distrobox + podman のDeiban:12環境でもビルドを行いました。
Debian/bookwormでも、ビルドできるようになっていると思います。
Ubuntu:23.04(lunar)も、こちらのブランチを使えばビルド可能だと思います。

mkdir -p build
cd build
git clone --recursive --depth 1 https://github.com/phoepsilonix/mozc -b debian
cd mozc
ls debian/patches/*.patch|xargs -n1 patch -p1 -i 
fakeroot debian/rules binary

または

mkdir -p build
cd build
git clone --recursive --depth 1 https://github.com/phoepsilonix/mozc -b debian
cd mozc
dpkg-buildpackage -b --no-sign

あらかじめibus-mozcの設定ファイルを削除しておきます。削除しておけば、mozc_rendererの設定値が新しく書き出されるようです。
キーの入れ替えなど、独自設定を行っている場合には、バックアップしておいて、後で修正してください。

rm ~/.config/mozc/ibus_config.textproto

ビルドした新しいバージョンのパッケージを手動インストール。

cd ..
sudo dpkg -i mozc-data*.deb mozc-server*.deb mozc-utils-gui_*.deb ibus-mozc_*.deb
sudo apt-get --fix-broken install
ibus write-cache
ibus restart

fcitx5-mozcの場合には、ibus-mozc_*.debの部分を、fcitx5-mozc*.debに置き換えてください。

sudo dpkg -i mozc-data*.deb mozc-server*.deb mozc-utils-gui-*.deb fcitx5-mozc_*.deb

ibusで用いるキーボードの配列とmozcを追加しておきます、

ibus-setup

環境変数の設定について

GNOME(Wayland)では、設定しないほうが良いので、im-configをアンインストールします。
(purgeを指定しないと、設定ファイルが残されるため、環境変数が設定されてしまいます。)

sudo apt-get purge im-config

X11などデスクトップ環境によっては、環境変数を設定しておくほうが良い場合があるかもしれません。
その場合には、im-configを用いて、InputMethodとしてibusを用いることを指定しておきます。

sudo apt-get install im-config
im-config -n ibus

im-configで環境変数も設定されるようです。(GNOME,KDEなど、デスクトップ環境によって、別の手順が必要になる場合もあるかもしれません。)

ログアウトまたは再起動で、設定が反映されます。
ライトモード推奨です。
ダークスタイルのテーマを利用すると、変換候補の文字が配色的に見えにくくなる場合があります。(見えにくくなった場合には、テーマをライトテーマに戻したうえで、ibus restartコマンドを実行してみてください。)

flatpakアプリケーションと環境変数

flatpakアプリケーションにも環境変数を渡すこと可能です。[6][7][8]
アプリケーションによって、うまく動かない場合があれば、試してみるのも手でしょう。

ibus

sudo flatpak --system override --env="GTK_IM_MODULE=ibus QT_IM_MODULE=ibus XMODIFIERS='@im=ibus'"

fcitx

sudo flatpak --system override --env="GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS='@im=fcitx'"

Wayland対応

flatpak --user override --socket=wayland

GTK Themeの変更

sudo flatpak override --filesystem=$HOME/.themes
sudo flatpak override --env=GTK_THEME=chosen-theme

overrideの取り消し

sudo flatpak override --reset

感想

上記の手順で作成したパッケージを試してみました。
入力自体は、Flatpak版のブラウザでも問題ありませんでした。

mozc_rendererのenbaledをTrueにしておくと用例表示が行われます。
Waylandでも問題なく、用例表示が行われました。
もしもダークスタイルで変換候補の文字の色が見にくい場合は、一旦ダークスタイルをオフにして、ibus restartしてみてください。
またFalseにすると、用例表示はされないですが、テーマによる配色の問題などは起きないと思います。
ライトテーマ推奨です。

~/.config/mozc/ibus_config.textproto
# This settings are available in 2.29.5205 and later versions
mozc_renderer {
  enabled : True
  compatible_wayland_desktop_names : ["GNOME"]
}

fcitx5-mozcも、比較的見やすかったです。
用例表示は、候補のフォーカスがあたっている単語のみですが、一応、表示されますので、便利です。またGNOME拡張機能をインストールすれば、見やすさが変わるかもしれません。お好みで導入してみましょう。

付記

最新のMozcソースはqt6を利用しています。
Ubuntu/jammyなどでは、おそらくfcitx5のqt6のヘッダがないため、ビルド時にエラーがでます。
fcitx5のパッケージが古い場合には、ビルドがそのままではできないと思います。
Ubuntu/mantic、Debian/bookwormでは、上記のレポジトリを使えば、ビルドできるかと思います。

Ubuntu,Debianのbazelのパッケージが更新され、ビルドがしやすくなるといいですね。
もちろん古いバージョンのままのパッケージであっても、日本語入力環境としては、十分、機能しているわけですし、必ずしも新しいバージョンにする必要はないとは思います。

ただibus-mozcの用例表示が充実してきたなら、waylandでも用例表示が行えるようになっているようですから、新しいバージョンにしたいなと思うかもしれませんね。

メンテナの方々、これからも頑張ってください。

付記2

flatpak-fcitx5

flatpak版のfcitx5-mozcが動作する環境は多いと思われます。
マイナーなディストリビューションでも、flatpakに対応していたら、日本語入力は可能になることでしょう。
安定版も比較的バージョンが新しいです。
unstable版のインストールは下記を参照してください。
https://fcitx-im.org/wiki/Install_Fcitx_5#Install_Fcitx_5_from_Flatpak

安定版

安定版を利用する場合は、flatpakコマンドでインストールして、

flatpak install org.fcitx.Fcitx5
flatpak install org.fcitx.Fcitx5.Addon.Mozc

ログイン時に、

flatpak run org.fcitx.Fcitx5

を自動起動するように、設定しておけばOKです。

自動起動の設定例

ls /var/lib/flatpak/app/org.fcitx.Fcitx5/x86_64/stable/active/files/share/applications/org.fcitx.Fcitx5.desktop
mkdir -p ~/.config/autostart
cp /var/lib/flatpak/app/org.fcitx.Fcitx5/x86_64/stable/active/files/share/applications/org.fcitx.Fcitx5.desktop ~/.config/autostart/
sed "s|Exec=.*|Exec=/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=/app/bin/fcitx5 org.fcitx.Fcitx5|" ~/.config/autostart/org.fcitx.Fcitx5.desktop

GNOMEの場合

GNOME(Wayland)では、gnome-extension-kimpanelを導入することで、変換窓がポップアップするようになります。
GNOMEの拡張機能を管理するソフトが導入されていない場合、flatpak版もあるようです。

flatpak install com.mattjakeman.ExtensionManager

その他

flatpak自体の導入は、Ubuntu Quick Setup,Debian Quick Setupを参考にしてください。

もしもMozcに郵便番号辞書が組み込まれていない場合には、郵便番号辞書Mozcユーザー辞書形式も活用できます。
ダウンロードしたファイルの圧縮を解除して出てくるuser_dic-japanese-zip-code-ken-01.txt,user_dic-japanese-zip-code-jigyosyo-01.txtをユーザー辞書に取り込んでください。

wget https://github.com/phoepsilonix/japanese-zip-code-dictionary/releases/download/20231216/user_dic-japanese-zip-code.tar.xz
tar xf user_dic-japanese-zip-code.tar.xz

SudachiDictをベースにMozc辞書形式に変換したものは、下記にあります。
mozcdic-ut-sudachidict

wget https://github.com/phoepsilonix/mozcdic-ut-sudachidict/releases/download/20230927/user_dic-ut-sudachidict.tar.xz
tar xf user_dic-ut-sudachidict.tar.xz

カラー絵文字

変換候補の絵文字表示が、一部の環境下で白黒絵文字(Dejavu Sans)が優先される場合があるようです。
Noto Color Emojiなどを優先したい場合には、いくつかの対処法があります。

  1. font manager[9]で無効にする
    font managerでDejavu Sansのチェックを外し、無効化します。
    sudo apt install font-manager
    
  2. fonts-dejavu-coreメタパッケージを削除する。
    sudo apt-get purge fonts-dejavu-core
    
  3. fontconfigの設定ファイルを用意して、絵文字を優先させる。
    mkdir -p ~/.config/fontconfig/conf.d
    
    ~/.config/fontconfig/conf.d/50-color-emoji.conf
    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
    
      <alias>
        <family>serif</family>
        <prefer>
          <family>system-ui</family>
          <family>emoji</family>
        </prefer>
      </alias>
    
      <alias>
        <family>sans-serif</family>
        <prefer>
          <family>system-ui</family>
          <family>emoji</family>
        </prefer> 
      </alias>
    
      <alias>
        <family>monospace</family>
        <prefer>
          <family>system-ui</family>
          <family>emoji</family>
        </prefer>
      </alias>
    </fontconfig>
    
    上記の~/.config/fontconfig/conf.d/50-color-emoji.confファイルを作成して、次のコマンドを実行してみてください。
    fc-cache -vf
    ibus restart
    
  4. ibus-mozcのmozc_rendererをオフにする。

以下、駄文。

なんとなくですがibus-mozc、fcitx5-mozcが、現状、広く使われている日本語入力環境ではないでしょうか?
Ubuntu,DebianのMozcは比較的バージョンが古めではあります。ただ十分、機能はあるといえます。
もしもの潜在的な問題があった場合の修正や、新機能が追加されたときに追従されるかは、正直わかりません。
flatpakを導入すれば、flatpak版のfcitx5のアドオンでMozcが動作します。そちらならば特定のディストリビューションに縛られないので、比較的、新しいバージョンの提供が期待できるでしょう。
flatpak版fcitx5は自動化も進めて、メンテナンスコストを下げているみたいなので、しばらくは新しいバージョンのMozcを提供してくれる存在として、活躍するのではと思います。(特にマイナーディストリビューションにおいて)(flatpak版のIbusは敷居が高そうです。)
とはいえ、言語入力は基本的な機能ですから、標準的なパッケージに含まれていることが望ましいことには変わりありません。
私自身はDebian、Ubuntuのメンテナーの流儀や文化がわからないし、時間がたくさんかかりそうなので、パッケージ化を働きかけるのは、難しいです。

必要そうなことは、おおまかに3点あるのだろうと思います。
ビルドに必要なbazelパッケージをbazel-bootstrapとは別に作成してもらうこと。
そして思い切って過去のパッチの積み重ねからジャンプして、新しく新規に仕切り直すことを提案して、受け入れてもらうこと、ではないかと愚考しています。依存関係のあるサブモジュールのパッケージも含めてです。(Qt6関係のパッケージはすでにあるみたいなので、難しくはないでしょう。)
そして仕切り直したあとにメンテナーが存在することが3点目。(今もいらっしゃるでしょうが、具体的な動きを未確認なので、状況を存じ上げません。)
一年に数回でも、継続的に、更新を確認することができたなら、新しいバージョンの導入体制を維持できるのではないかと思います。

個人的には現状、Manjaroを使っていますので、そちらで困ることはありません。また他のマイナーな環境下でも、どうにかなりそうなので、動機づけが低いのです。
ただUbuntuはカスタマイズやチューニングなど、いろんな面で秀でているとは思うし、Debianは古き良き環境を守ってくれていて、それをベースに様々な派生もあります。それらも素晴らしいことではあります。だから、標準で新しいバージョンも使えるなら、なお嬉しく思います。
ディストリビューターやメンテナーとしては、ライセンス的にも機能的にも安心できるソースを自分たちの管理下のレポジトリに、置いておきたいのでしょう。またパッケージを分割することも、メンテナンスコストはかかりますが、メリットがあることも理解はできます。セキュリティーへの対応も、あることでしょう。
ただ肥大化してきたレポジトリのメンテナンスは、どう考えても大仕事です。だからこそ、いろんなアプローチが生まれてきたのでしょう。
NixOSやAlpineのような路線でも、OSTree路線でも、多くの環境下で資産として使えること自体が、オープンソースの素晴らしいところだと思いますから。これからも、大勢のLinuxユーザーが、いろんな形で協力して、使える環境を維持継続していくだろうとは思います。特段大きなセキュリティ上の問題でもない限り、実用面では、現状、心配することもないので、焦ることもありませんが、Canocicalが雇ってくれて、パッケージングの権限をもしもくれるとするなら、いきなりソースの中身をジャンプアップさせるように動きますが、そんなご縁も機会もなさそうなので、すでにご縁のある方々、時間はかかるかとは思いますが、これからのご活躍に期待しております。🙏

仮置き場

Ubuntu:23.10(mantic) and Debian:12(bookworm)向けMozcパッケージ[10]
タグにwith-jp-dictがついているものは、SudachiDictのデータをシステム辞書に組み込んだパッケージです。


脚注
  1. Mozc公式 ↩︎

  2. Ubuntu への Bazel のインストール ↩︎

  3. https://bazel.build/install/compile-source?hl=ja#bootstrap-bazel ↩︎

  4. Mozc fork ↩︎

  5. Fcitx-Mozc ↩︎

  6. https://www.nofuture.tv/20200229 ↩︎

  7. https://blog.lufia.org/entry/2022/01/18/203946 ↩︎

  8. https://ja.linux-console.net/?p=18264 ↩︎

  9. https://blog.tmtms.net/entry/2016/11/23/firefox-emoji ↩︎

  10. Ubuntu:23.10(mantic) and Debian:12(bookworm)向けMozcパッケージ ↩︎

Discussion