Windows で Mozc をビルド(mozc_emacs_helper できるかな?)
備忘録ついでに作業を記録していきます.
まずは,作業する環境は,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 サポート (どのタイミングか忘れましたが,必要でした)
下準備
リポジトリからソースなどを取得します.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
しばらくすれば,,ビルドが正常(?)に終了しました.
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
今日はここまでかな.
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 の説明があります.
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
を載せておきます.