FC2ブログ

2019年初頭、mozcをVS2019(VC2019)Previewでビルドしてみた

みなさまあけましておめでとうございます。
こちらのブログではお久しぶりにございます。

もうすっかり姫踊子草の開発からは遠ざかっていますが、今でも自分では使っておりますし、今回年末年始の気の迷いでちょっとだけ関係のありそうなことをやったのでその記録がてらに戻ってまいりました。

お題は昨年12月4日に出た「Visual Studio 2019 Preview」を使ってGoogle日本語入力の辞書縮小+オープンソース版の「mozc」をビルドしてみよう、いうことでございまして。

Mozc - a Japanese Input Method Editor designed for multi-platform

現状の結論だけ先に書いておきますと次のとおり。

  • キーボードからの日本語入力は無事できるところまで来た。
  • 手書き入力は常にエラー表示になって使えない。
  • Debugビルドができない。Releaseビルドだけ。
  • unittestで2件ほど失敗する。

unittestではどちらも構造化例外が出ておりますので、動いているつもりのReleaseビルドでもなにかの拍子に動かなかったりすることもあるかもしれません。

ビルド環境は次のとおり。
  • Windows 10 Pro 64bit
    • 別にHome Editionでも問題ないと思います。
    • 32bit版Windowsではビルド不可とmozcの説明にあり。最近はさすがに減ってきたと思いますけど。
  • CPU: AMD A8-3820。
    • 6年位前に買ったパソコンゆえそろそろ新調したいところ。
    • 自分でもやってみたいという方は CPU BOSS あたりでご自身のパソコンのCPUと性能比較を確認しておきましょう。
  • SSD: 512GB。SUNEAST SSD SE800 512GB。
    • 最近気の迷いで買っちまったやつ。この頃SSDが値下げ傾向らしいですよ。
  • Visual Studio 2019 Preview
    • 設置時、Visual C++っぽいところ一箇所にチェックを入れてください。初期設定のままでは入りません。C++指定時に自動でつく対象だけ設置すればOKです。
  • Qt 5.12.0
    • この版から「MSVC 2015 32bit」がなくなっていますが、「MSVC 2017 32bit」で代用できるようです。本件では64bitのQtは使えません。
  • Gitやコマンドプロンプトなど
    • それらが使える知識がある前提の文章なので念の為。基本的な知識だけでいいです。

概説


MozcのビルドはGYPでビルド手順を確定し、NINJAでコンパイラやリンカその他諸々を動作させて生成という流れになっております。基本的には次のURLの説明に従うことになりますが、そうではないところを要点として綴っていきます。

How to build Mozc in Windows

要点1: depot_tools.zip版の GYP は Preview版VS2019 に未対応


ということで、mozcとは別に最新版GYPをダウンロードします。なお depot_tools.zip も mozc の上記リンクに書いてあるとおりにダウンロード・展開・gclient二回実行、までやっておきます。

要点2: mozcから外部のGYPを指定できそうだが実はできない


これは修正が簡単で、(mozc)\src\build_mozc.py の一部を下のように書き換えます。

修正前(526行目あたり):
    gyp_dir = os.path.abspath(options.gypdir)
    gyp_command = [os.path.join(gyp_dir, 'gyp')]
  else:
    # Use third_party/gyp/gyp unless 'gypdir' option is specified. This is
修正後:
    gyp_dir = os.path.abspath(options.gypdir)
    if IsWindows():
      gyp_command = [os.path.join(gyp_dir, 'gyp.bat')]
    else:
      gyp_command = [os.path.join(gyp_dir, 'gyp')]
  else:
    # Use third_party/gyp/gyp unless 'gypdir' option is specified. This is


要点3: Preview版VS2019は最新版GYPでも補足はしない


Preview版なんだから当然なのかもしれません。
これはGYP側の説明にあるとおり、環境変数を何らかの形で指定します。
たとえば本件関連のバッチファイルにはすべて次の記述を入れておくとか。
まだ2019には対応していないので、2017で偽装。

set GYP_MSVS_OVERRIDE_PATH=C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Preview
set GYP_MSVS_VERSION=2017


要点4: mozcにVisual C++ 2015決め打ちのところがある


さっきのとも関係ありますが、こちらも (mozc)\src\build_mozc.py を修正します。

修正前(703行あたり):
  if IsWindows():
    gyp_options.extend(['-G', 'msvs_version=2015'])
  if (target_platform == 'Linux' and

修正後:
  if IsWindows():
    gyp_options.extend(['-G', 'msvs_version=2017'])
    os.environ['GYP_MSVS_OVERRIDE_PATH'] = 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Preview'
    os.environ['GYP_MSVS_VERSION'] = '2017'
  if (target_platform == 'Linux' and
決め打ちのままなんでそれはそれでどうかと思いますが。

要点5: mozc の C++ コードに問題を抱えているところがある


そのままでビルドを始めたりすると、C2678という一見複雑そうなコンパイルエラーが出ます。

エラー内容:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.20.27027\include\xutility(3248): error C2678: 二項演算子 '*': 型 'const _InIt' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
        with
        [
            _InIt=mozc::IteratorAdapter<const int *,mozc::storage::louds::`anonymous-namespace'::ZeroBitAdapter>
        ]
(以下略、全30行くらい)

これはconst vector<const int *>から要素の参照を得るときに非constの関数を経由しようとしているのが原因らしく、(mozc)\src\base\iterator_adapter.h の次の関数をコピーしてconst付きの同名同内容のものを作ってください。

119行あたり(下の関数を書き加える):
  value_type operator*() {
    return adapter_(iter_);
  }
  value_type operator*() const {
    return adapter_(iter_);
  }

要点6: GYPがコマンドライン引数にほぼ問答無用で os.path.normpath をかけている


これが目下のところ大問題です。いずれ不合理仕様ということで除かれるんじゃないかと思いますが。

当たり前ですが引数に渡されるものは単体の、またローカルマシンのパスであるとは限りません。
mozcの例では次のような引数があります。

--input=../../data/dictionary_oss/dictionary00.txt
pos_matcher:32:..\..\out_win\Debug\gen\data_manager\chromeos\pos_matcher.data

これらを os.path.normpath で変換すると

data\dictionary_oss\dictionary00.txt
out_win\Debug\gen\data_manager\chromeos\pos_matcher.data

になってしまってパスの前の部分がいずれも消えてしまい、使い物になりません。
mozcサイドでもメーリングリストでの報告は行っているようですが、すでに3ヶ月前の話。
動いた様子がないので困ったものです。

msvs_emulation.py destroy relative pathsvs_emulation.py destroy relative path

どうするかというと、話題の (gyp)/pylib/gyp/msvs_emulation.py を書き換えます。
残念ながら見ての通りどう考えても無理があります。ああ、今回私が書いた部分はこの記事ごとBSD三項ライセンスでいいから。
 pylib/gyp/msvs_emulation.py | 40 ++++++++++++++++++++++++++++++++++++++--
 1 file changed, 38 insertions(+), 2 deletions(-)

diff --git a/pylib/gyp/msvs_emulation.py b/pylib/gyp/msvs_emulation.py
index 63d40e63..4ff51a5e 100644
--- a/pylib/gyp/msvs_emulation.py
+++ b/pylib/gyp/msvs_emulation.py
@@ -23,10 +23,45 @@ try:
 except NameError:
   basestring = str
 
+enable_normpath = 1  # 0 to False, 1 to True, but cannot build with 1? 0? or both?
 
 windows_quoter_regex = re.compile(r'(\\*)"')
 
 
+def OptionRemainedNormpathForRspFile(arg):
+  """Apply os.path.normpath except the option declaration part.
+  Problematic case is '--optionname=../relpath/arg' or
+  '-o../relpath/arg'. When the name of option and argument for the
+  option is separated with spaces, the caller of this function split them
+  and no problems occur. Also, if arg doesn't have relative path,
+  os.path.normpath works without problems.
+  
+  We should consider arg is 'some_option:param_for_option:path' style.
+  os.path.normpath('a:b:..\\just_child_relative_path') returns same but
+  os.path.normpath('a:b:..\\..\\more_deep_relative_path') returns
+  'more_deep_relative_path'. We should avoid it too.
+  """
+  if not enable_normpath:
+      return arg
+  if arg.find('\\') == -1:
+      # Because that can be a full of, or a part of URL.
+      return arg
+  if arg[-1:] == '/':
+      # Because that can be required last slash to join another string.
+      # os.path.normpath('somepath/') -> 'somepath'
+      return arg      
+  mo = re.search(r'--[^=]*=|-[^.-]?', arg)
+  if mo and mo.start() == 0:
+    return mo.group(0) + OptionRemainedNormpathForRspFile(arg[mo.end(0):])
+  rpos = arg.rfind(':')
+  if rpos == len(arg) - 1:
+      # Because os.path.normpath('') returns '.'
+      return arg
+  if rpos >= 0:
+      return arg[:rpos + 1] + os.path.normpath(arg[rpos + 1:])
+  return os.path.normpath(arg)
+
+
 def QuoteForRspFile(arg):
   """Quote a command line argument so that it appears as one argument when
   processed via cmd.exe and parsed by CommandLineToArgvW (as is typical for
@@ -38,8 +73,9 @@ def QuoteForRspFile(arg):
   # use that function to handle command line arguments.
 
   # Use a heuristic to try to find args that are paths, and normalize them
+  # NOTE: if arg doesn't contain backslashs, no changes will be made.
   if arg.find('/') > 0 or arg.count('/') > 1:
-    arg = os.path.normpath(arg)
+    arg = OptionRemainedNormpathForRspFile(arg)
 
   # For a literal quote, CommandLineToArgvW requires 2n+1 backslashes
   # preceding it, and results in n backslashes + the quote. So we substitute
@@ -71,7 +107,7 @@ def EncodeRspFileList(args):
   if not args: return ''
   if args[0].startswith('call '):
     call, program = args[0].split(' ', 1)
-    program = call + ' ' + os.path.normpath(program)
+    program = call + ' ' + OptionRemainedNormpathForRspFile(program)
   else:
     program = os.path.normpath(args[0])
   return program + ' ' + ' '.join(QuoteForRspFile(arg) for arg in args[1:])

これを diff ファイルとしてどうにかこうにかして適用。

ビルドできない問題点としてはこれで全部のはず。あと、(gyp)/pylib/gyp/generator/ninja.jp で /showIncludes が指定されているせいでログファイルが14MBとかになっちゃうのであらかじめこれらを削っておくのが吉。

だんだん疲れてきたので記事が投げっぱなしになってますが、だいたいこれで通るはず。幸運を祈る。

スポンサーサイト



姫踊子草更新: 練習ソフト対応メニュー関連の瑕疵を修正しました

キー入力入れ替えソフト姫踊子草版2.0100号構築4番を公開しました。入手はいつものとおり公式サイトから、またVectorへの登録・公開は少し後になります。

練習ソフト対応関連メニューの不具合修正

前版というか最近の版についてお知らせいただいた次の問題を修正しました。

  • [練習ソフト対応関連(T)]-[自動用設定を手動選択(M)]の下に入るべき項目と並列位置に入るべき項目が逆になっていました。自動設定は本来メニューで指定するまでもなく選択されるはずなので、そちらのほうが手間のかかる操作でなくてはいけません。
  • 上記振り分けに関連して、設定名と実動作が一致していませんでした。

本年4月公開分の大改造の影響だと思うのですが、特に後者について、前からそうだったりするとかだったら恐ろしすぎる…

theme : キーカスタマイズ
genre : コンピュータ

姫踊子草更新: バグ二件修正

こんばんは。キー入力入れ替えソフト姫踊子草版2.0100号構築3番を本日公開いたしました。

ATOKのATOKスタイルキー設定における問題修正

先月に公開を始めた版2.0100号系統では、かな配列適用中にIMEの英字入力モードが必要になったときの操作を新しいものに変えていたのですが、利用者からの連絡により、ATOKのATOKスタイルキー設定では正しく動作しないことが分かりました。

具体的には英数キー・ひらがなキー・カタカナキーを入力したときにIME側が英数入力・ひらがな入力・カタカナ入力に切り替わることを期待していたのですが、ATOKスタイルではそのような挙動にはならないそうです。もちろん他のIMEでも同様の問題は起こりえます。

対処法としてはIME側の設定を変更してください、といういささか面倒な内容になってしまうのですが、他に方法がありませんのでご容赦ください。 ATOK2015については、説明書にてやり方を一通り解説しております

正確には前月27日に公開していた版の話になります。

逐次打鍵入力使用時の補助鍵盤画像問題

ACT, AZIKなど逐次打鍵入力を使っていて、かつ補助鍵盤画像を出している場合は、キー操作ごとに画像の内容が変化して、常に次のキー操作と入力される文字が分かるようになっている…はずだったのですが、こちらもこの4月以降の版で初期状態しか表示されていない問題がありましたので、修正いたしました。

説明書のHTML5+CSS3化

見た目にはあまり変わりのない話で恐縮ですが、説明書のHTML5+CSS3化を進めています。Webブラウザは最新のものをお使いくださいますようお願いいたします。

Vector様への登録状況

現時点で、Vector様では二つ前の版が公開されており、現在一つ前の版の更新申請中です。またゴールデンウィークなので更新が遅れるかもしれません。Vector様への最新版申請はその後にする予定です。

theme : キーカスタマイズ
genre : コンピュータ

シェアレジ受付再開しました

表題の通り、キー入力入れ替えソフト姫踊子草のシェアレジ受付を再開しています。また、各種説明文のシェアレジへのリンクが古いままでしたので、その部分だけ修正した姫踊子草の最新版を公開しています。

今回の修正はこのようなリンク関係だけですので、すでに利用権を入手いただいている方は更新不要です。

公開してからWindows XP/Vista Service Pack へのリンクも更新しなくてはならないことに気がついたんですが、それは次の版で修正いたします。

…という文章を25日の時点で書いていたんですが設定を下書きから公開にするのを忘れてました。しばらくぶりって怖い。

theme : キーカスタマイズ
genre : コンピュータ

姫踊子草版2.0100号のご案内

生きてます!まだ生きてますよ!

というわけで一年五ヶ月ぶり、前回の更新も十ヶ月ぶりのものだったので、実質二十七ヶ月ぶりの更新です。さすがにそろそろ忘れ去られていそうですが更新してしまったものは仕方がないので公開のお知らせです。

今回少しだけですが価格改定を行っています。Vectorでの価格改定申請は1~2週間かかるそうなのでしばらくはシェアレジからの入金とパスワード発行はできなくなると思います。試用期間は3週間あるので今日から初めてもそれまでには対応できるようになると思います。

今回の更新内容

Windows 8, Windows 10, ストアアプリ

特に Windows 8 で動作が怪しかったものが大分マシな状態になってきた、というのが正直なところです。完璧ではないのですが元々が無理してるんだから仕方がない。これまで Windows Store アプリには対応していなかったのですが、Q's Nicolatter 8 [BETA RELEASE] の説明を参考に、自前でWindows Store アプリを判定した上で、[ひらがな]キーでかな配列適用、[英数]キーでかな配列適用解除、みたいな処理を入れてみました。ストアアプリでなくても姫踊子草の動作がおかしいものはあるでしょうから、タイピング練習機能対応ソフトの応用で個別にも指定できるようになっています。

Windows 10 Pro Technical Preview Build 10049 でも一応動作できるようにしてみました。こちらではストアアプリだけでなく、スタートボタン横の検索ボックスやProject Spartanでもそういう感じの動作になってます。

特定英字記号入力問題の解決

前々からの懸念材料だった「かな配列利用時に[]/を入力するための一番安全な動作」ですが、こちらも解決したっぽいです。かなり汎用性が高いようなので、すべてのIMEにおける標準設定にしています。以前ATOKで直接文字入力がうんたらとか色々迷走していましたが、現在試用しているATOK 2015でも問題は起きていない様子。なぜ今までその方法を使わなかったのかとかは聞かないでください。バカですみません。

CPU利用率問題?

一点懸念材料を告白しておきますと、CPU利用率が変に高止まりしておりまして、私のパソコンで従来ほぼ1%未満だったものが今回から7%~18%あたりをうろうろする状況になっております。50%とか100%ではないのがまた不気味なんですが、もしかしたら気持ちきびきび動作するようになったことの裏返しだったりするかもしれません。

可搬版が可搬になってたらいいなぁ

これまで可搬版を終了させた後、半ば無理矢理にUSBメモリを抜いていたと思うんですが、今回からは正しく終了する限りにおいてより安全に抜けるように…なってたらいいなぁという希望というか。

大改修と嬉しい?誤算

見た目も動作もほとんど変わっていないのですが、内部的には二年分の開発基盤更新に合わせる作業と、全体の設計見直しということで実は一月の末から改修を重ねていました。コンソールウィンドウでも候補選択以外は普通に使えるようになったのがその副産物で、こちらはなぜ今までだめだったのか、そしてなぜ今動作できるのかがさっぱりわかっていませんが結果オーライでお願いいたします。

恒例のご案内

入手は姫踊子草公式サイトから、また今回の苦心のまとめは開発履歴をご覧ください。Vectorソフトライブラリにもいつも通り申請中で、後日先方から公開されることになります。

theme : キーカスタマイズ
genre : コンピュータ

プロフィール

鈴見咲君高

  • Author:鈴見咲君高
  • パソコンは道具、という当たり前の原点を提示してもうすぐ10年。月日の過ぎるのは恐ろしいものです。
最近の記事
最近のコメント
カテゴリー
リンク
RSSフィード
ブログ内検索
最近のトラックバック
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる