Closed5

Windows で Mozc をビルド(mozc_emacs_helper できるかな?)

ignorantignorant

備忘録ついでに作業を記録していきます.

まずは,作業する環境は,Windows 10 Pro (21H2) の Sandbox で行います.

mozc/windows.yaml at master · google/mozc を参考に必要なアプリケーションをインストールします.

Sandbox で winget を使うのでググって設定します.タイミングが悪かったのか,追加で Microsoft.UI.Xaml.2.7 が必要になっていました.

  • Winget でインストール
    • winget install -h --id Microsoft.VisualStudioCode --accept-source-agreements
    • winget install -h --id Git.Git
    • winget install --id Microsoft.VisualStudio.2019.BuildTools
  • Python 3.9(3.9.12) はインストーラーをダウンロードして,PATH を通します
  • Google IME
  • Visual Studio Installer から追加のパッケージをインストール.
    • C++ によるデスクトップ開発
    • ALT サポート (どのタイミングか忘れましたが,必要でした)
ignorantignorant

下準備

リポジトリからソースなどを取得します.Git Bash を立ち上げて作業します.

(プロキシが必要なので設定しています)

$ mkdir /c/work && cd $_
$ export {http_proxy,https_proxy,ALL_PROXY}='http://xx.xx.xx.xx:xxxx'

$ git config --global core.autocrlf false
$ git config --global core.eol lf
$ git clone https://github.com/google/mozc.git -b master --single-branch --recursive
$ cd mozc/src/third_party
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$ cd  abseil-cpp
$ git apply ../../base/absl.patch

取り敢えずビルド

x64_x86 Cross Tools Command Prompt for VS 2019 を立ち上げて作業します.

途中で外部と通信するようなので,プロキシの設定をしています.

> set HTTP_PROXY=http://xx.xx.xx.xx:xxxx
> set HTTPS_PROXY=http://xx.xx.xx.xx:xxxx

> python3 -m pip install six
> cd c:\work\mozc\src
> python build_mozc.py gyp --noqt --msvs_version=2019 
> python build_mozc.py build -c Release package

ビルドに失敗したので,きれいきれいします.

> python build_mozc.py clean

python の CP932 関連のエラーに遭遇したので,場当たり的な対処をします.

UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence

diff --git a/src/third_party/gyp/pylib/gyp/win_tool.py b/src/third_party/gyp/pylib/gyp/win_tool.py
index e7c0dd81..f55885fc 100755
--- a/src/third_party/gyp/pylib/gyp/win_tool.py
+++ b/src/third_party/gyp/pylib/gyp/win_tool.py
@@ -196,8 +196,8 @@ class WinTool(object):
       our_manifest = '%(out)s.manifest' % variables
       # Load and normalize the manifests. mt.exe sometimes removes whitespace,
       # and sometimes doesn't unfortunately.
-      with open(our_manifest, 'r') as our_f:
-        with open(assert_manifest, 'r') as assert_f:
+      with open(our_manifest, 'r', encoding="utf-8_sig") as our_f:
+        with open(assert_manifest, 'r', encoding="utf-8_sig") as assert_f:
           our_data = re.sub(r'\s+', '', our_f.read())
           assert_data = re.sub(r'\s+
> python build_mozc.py gyp --noqt --msvs_version=2019 
> python build_mozc.py build -c Release package

しばらくすれば,,ビルドが正常(?)に終了しました.

ignorantignorant

Google IME との連携

--branding=GoogleJapaneseInput オプションを付けてビルドしてみます.

> python build_mozc.py clean
> python build_mozc.py gyp --noqt --msvs_version=2019 --branding=GoogleJapaneseInput
> python build_mozc.py build -c Release package

ビルドに失敗したのログを辿ってみます.

absl/base/integral_types.h がないと言っているので,ググって持ってきます.

(Git Bash 上で作業しています)

$ cd src/third_party/abseil-cpp/absl/base
$ curl -O https://raw.githubusercontent.com/google/ion/d110e25c16a257cbc32ae8d3b7465ef7ce6ab7c0/base/integral_types.h

再度,ビルドに失敗したのログを辿ってみます.

FAILED: obj/data_manager/data_manager.data_manager.obj
C:\work\mozc\src\data_manager\data_manager.cc(57): error C2144: 構文エラー: 'absl::lts_20211102::string_view'';' に よって先行されなければなりません。

data_manager.cc を見てみました.

diff --git a/src/data_manager/data_manager.cc b/src/data_manager/data_manager.cc
index 4e8204ee..f1f05bed 100644
--- a/src/data_manager/data_manager.cc
+++ b/src/data_manager/data_manager.cc
@@ -49,7 +49,7 @@ namespace mozc {
 namespace {

 #ifdef GOOGLE_JAPANESE_INPUT_BUILD
-constexpr absl::string_view kDataSetMagicNumber = "\xEFMOZC\r\n"
+constexpr absl::string_view kDataSetMagicNumber = "\xEFMOZC\r\n";
 #else   // GOOGLE_JAPANESE_INPUT_BUILD
 constexpr absl::string_view kDataSetMagicNumber = "\xEFMOZC\r\n";
 #endif  // GOOGLE_JAPANESE_INPUT_BUILD

あかんて工藤.; 抜けてるやん.修正して再度ビルドします.

前回はメモし忘れたので,今回はwarning を控え置きます.

[830/835] LINK_EMBED(DLL) GoogleIMEJaTIP64.dll 
ライブラリ GoogleIMEJaTIP64.dll.lib とオブジェクト GoogleIMEJaTIP64.dll.exp を作成中
コード生成しています。
コード生成が終了しました。
LINK : warning LNK4281: x64 イメージに望ましくないベース アドレス 0x6000000。ASLR の最適化を最良にするには、ベース アド レスを 4 GB より上に設定してください
[831/835] LINK_EMBED(DLL) GIMEJa.ime
   ライブラリ GIMEJa.ime.lib とオブジェクト GIMEJa.ime.exp を作成中
コード生成しています。
コード生成が終了しました。
LINK : warning LNK4281: x64 イメージに望ましくないベース アドレス 0x6000000。ASLR の最適化を最良にするには、ベース アド レスを 4 GB より上に設定してください
[832/835] LINK_EMBED GoogleIMEJaBroker64.exe
コード生成しています。
コード生成が終了しました。
[833/835] LINK_EMBED GoogleIMEJaConverter.exe
コード生成しています。
コード生成が終了しました。
[834/835] LINK_EMBED GoogleIMEJaRenderer.exe
コード生成しています。
C:\work\mozc\src\renderer\win32\win32_image_util.cc(803) : warning C4723: 除算の 2 番目のオペランドは、コンパイル時に 0 と評価され、不定の結果を返します。
コード生成が終了しました。
[835/835] STAMP obj\win32\build64\mozc_win32_build64.actions_depends.stamp

今日はここまでかな.

ignorantignorant

mozc_emacs_helper のビルド

ビルドも通ったので,以前に書いた WSL の Emacs で日本語入力 - Qiita と同じ変更で行けそうなので,その変更を取り込みます.rzl24ozi さん
mozc_emacs_helper.cc.diff も適用しています.ありがとうございます.

diff --git a/src/unix/emacs/mozc_emacs_helper.cc b/src/unix/emacs/mozc_emacs_helper.cc
index 76755c4b..1cd602fe 100644
--- a/src/unix/emacs/mozc_emacs_helper.cc
+++ b/src/unix/emacs/mozc_emacs_helper.cc
@@ -93,6 +93,18 @@ void ProcessLoop() {
     switch (command.input().type()) {
       case mozc::commands::Input::CREATE_SESSION:
         session_id = client_pool.CreateClient();
+#ifdef OS_WIN
+        {
+          std::shared_ptr<mozc::client::Client> client =
+            client_pool.GetClient(session_id);
+          CHECK(client.get());
+          mozc::commands::KeyEvent key;
+          key.set_special_key(mozc::commands::KeyEvent::ON);
+          if (!client->SendKey(key, command.mutable_output())) {
+            ErrorExit(mozc::emacs::kErrSessionError, "Send IME-On key failed");
+          }
+        }
+#endif // OS_WIN
         break;
       case mozc::commands::Input::DELETE_SESSION:
         client_pool.DeleteClient(session_id);
diff --git a/src/win32/build32/build32.gyp b/src/win32/build32/build32.gyp
index 938c0b1c..3e7de68a 100644
--- a/src/win32/build32/build32.gyp
+++ b/src/win32/build32/build32.gyp
@@ -49,6 +49,7 @@
             '../broker/broker.gyp:mozc_broker32',
             '../ime/ime.gyp:mozc_ime',
             '../tip/tip.gyp:mozc_tip32',
+            '../../unix/emacs/emacs.gyp:mozc_emacs_helper',
           ],
           'conditions': [
             ['branding=="GoogleJapaneseInput"', {
diff --git a/src/win32/build64/build64.gyp b/src/win32/build64/build64.gyp
index 4cc183fb..f12cfdd9 100644
--- a/src/win32/build64/build64.gyp
+++ b/src/win32/build64/build64.gyp
@@ -49,6 +49,7 @@
             '../broker/broker.gyp:mozc_broker64',
             '../ime/ime.gyp:mozc_ime',
             '../tip/tip.gyp:mozc_tip64',
+            '../../unix/emacs/emacs.gyp:mozc_emacs_helper',
           ],
           'conditions': [
             ['branding=="GoogleJapaneseInput"', {

32bit 用はいらないのですが,build32.gyp にも追加しています.

もう一度,ビルドし直します.

> python build_mozc.py clean
> python build_mozc.py gyp --noqt --msvs_version=2019 --branding=GoogleJapaneseInput
> python build_mozc.py build -c Release package

out_win/Release_x64 ディレクトリに mozc_emacs_helper.exe がありました.

動作確認をしてみます(Git Bash).

$ echo -e '(0 CreateSession)\n(1 SendKey 1 97)' | ./mozc_emacs_helper.exe
((mozc-emacs-helper . t)(version . "2.28.4715.100")(config . ((preedit-method . roman))))
((error . session-error)(message . "Send IME-On key failed"))

え,なんかでてきてうまく動いてくれません.以前ビルドした正常に動作する mozc_emacs_helper.exe で確認します.

$ echo -e '(0 CreateSession)\n(1 SendKey 1 97)' | ./mozc_emacs_helper.exe
((mozc-emacs-helper . t)(version . "2.23.2815.100")(config . ((preedit-method . roman))))
((emacs-event-id . 0)(emacs-session-id . 1)(output . ((id . "15314279851158261904")(mode . hiragana)(consumed . t)(status . ((activated . t)(mode . hiragana)(comeback-mode . hiragana))))))
((emacs-event-id . 1)(emacs-session-id . 1)(output . ((id . "15314279851158261904")(mode . hiragana)(consumed . t)(preedit . ((cursor . 1)(segment ((annotation . underline)(value . "あ")(value-length . 1)(key . "あ")))))(candidates . ((size . 1)(candidate ((index . 0)(value . "あ")(annotation . ((description . "ひらがな")))(id . 0)))(position . 0)(category . suggestion)(display-type . main)(footer . ((label . "Tabキーで選択")))(page-size . 9)))(status . ((activated . t)(mode . hiragana)(comeback-mode . hiragana)))(all-candidate-words . ((candidates ((id . 0)(index . 0)(value . "あ")(annotation . ((description . "ひらがな")))))(category . suggestion))))))

version が怪しいそうなので,IME オプションから Google 日本語入力について からバージョンを確認してみます.

(2.28.4650.0)

になっています.mozc/about_branding.md at master · google/mozc に Version Number の説明があります.

ignorantignorant

mozc_emacs_helper を再ビルド

うーん,あやしいのは,version なので,産地偽装します.これでダメなら諦めます(内緒ですが,2.28.4650.100 にしたらうまくいきませんでした).

適当に変えてもうまく行きそうにないので,過去のバージョンに偽装します.
(バイナリ配布をしないので問題ないですよね?)

mozc_version_template.bzl のファイルにバージョンが設定してあるので変更します.

diff --git a/src/data/version/mozc_version_template.bzl b/src/data/version/mozc_version_template.bzl
index 19f3aee8..d1d75ded 100644
--- a/src/data/version/mozc_version_template.bzl
+++ b/src/data/version/mozc_version_template.bzl
@@ -29,10 +29,10 @@

 MAJOR = 2

-MINOR = 28
+MINOR = 26

 # BUILD number used for the OSS version.
-BUILD_OSS = 4715
+BUILD_OSS = 4646

 # Number to be increased. This value may be replaced by other tools.
 BUILD = BUILD_OSS

もう一度,ビルドし直します.

> python build_mozc.py clean
> python build_mozc.py gyp --noqt --msvs_version=2019 --branding=GoogleJapaneseInput
> python build_mozc.py build -c Release package

動作確認をしてみます(Git Bash).

$ echo -e '(0 CreateSession)\n(1 SendKey 1 97)' | ./mozc_emacs_helper.exe
((mozc-emacs-helper . t)(version . "2.26.4646.100")(config . ((preedit-method . roman))))
((emacs-event-id . 0)(emacs-session-id . 1)(output . ((id . "14387658575021492883")(mode . hiragana)(consumed . t)(status . ((activated . t)(mode . hiragana)(comeback-mode . hiragana))))))
((emacs-event-id . 1)(emacs-session-id . 1)(output . ((id . "14387658575021492883")(mode . hiragana)(consumed . t)(preedit . ((cursor . 1)(segment ((annotation . underline)(value . "あ")(value-length . 1)(key . "あ")))(is-toggleable . nil)))(candidates . ((size . 1)(candidate ((index . 0)(value . "あ")(annotation . ((description . "ひらがな")))(id . 0)))(position . 0)(category . suggestion)(display-type . main)(footer . ((label . "Tabキーで選択")))(page-size . 9)))(status . ((activated . t)(mode . hiragana)(comeback-mode . hiragana)))(all-candidate-words . ((candidates ((id . 0)(index . 0)(value . "あ")(annotation . ((description . "ひらがな")))(num-segments-in-candidate . 1)))(category . suggestion)))(removed-candidate-words-for-debug . ()))))

無事,動いてくれました.mozc_emacs_helper は仕方なくても,公式の手順でビルドがコケるのは悩ましいですね.

現在使っているのと置き換えて動作しので,私の環境では問題ありませんでした.

最終的な diff

git diff --submodule=diff を載せておきます.

このスクラップは2022/04/27にクローズされました