archlinuxのAURのmozc-ut 1.6.1187.102.20120529-1がコンパイルできないときの対処法

前置き

2012/10/02頃にuimをアップデートをしたら経験則からライブラリ関係でmozcが死んでしまったような気がするのでmozcを再コンパイルしようとしましたがうまく通りませんでしたので書きます
(もしかしたら違ったかも)

前置き

ここで紹介している方法は

    % yaourt -S mozc-ut

で入れていて、尚且つ

    (前略)

    ==> Starting build()...
      -> =====================================================
      ->                *** Build Info ***
      ->  The following package files will be generated:
      ->   * mozc-ut-1.6.1187.102.20120529-1-i686.pkg.tar.xz
      ->   * uim-mozc-ut-1.6.1187.102.20120529-1-i686.pkg.tar.xz
      ->   * emacs-mozc-ut-1.6.1187.102.20120529-1-i686.pkg.tar.xz
      -> =====================================================
    ==> Generating UT dictionary seed...
    generate chimei.txt...
    /tmp/yaourt-tmp-root/aur-mozc-ut/src/mozcdic-ut-20120529
    check major ut dictionaries...
    check minor ut dictionaries...
    generate babibubebo from vavivuvevo...
    /tmp/yaourt-tmp-root/aur-mozc-ut/src/mozcdic-ut-20120529
    ==> Done.
    patching file session/internal/keymap.cc
    Hunk #1 succeeded at 542 (offset -44 lines).
    patching file session/internal/keymap_interface.h
    Hunk #1 succeeded at 139 (offset 8 lines).
    patching file session/session.cc
    Hunk #1 succeeded at 638 (offset -14 lines).
    Hunk #2 succeeded at 2311 with fuzz 1 (offset 488 lines).
    patching file session/session.h
    Hunk #1 succeeded at 121 with fuzz 1 (offset 41 lines).
    patching file gui/config_dialog/keymap_en.ts
    Hunk #1 succeeded at 108 (offset 4 lines).
    patching file composer/composition_interface.h
    Hunk #1 succeeded at 50 (offset 1 line).
    patching file composer/composer.cc
    Hunk #1 succeeded at 523 with fuzz 1 (offset 60 lines).
    patching file composer/internal/composition.cc
    Hunk #1 succeeded at 132 (offset 15 lines).
    patching file composer/internal/composition.h
    Hunk #1 FAILED at 53.
    1 out of 1 hunk FAILED -- saving rejects to file composer/internal/composition.h.rej
    patching file composer/composer.h
    Hunk #1 succeeded at 126 (offset 1 line).
    Hunk #2 succeeded at 140 (offset 1 line).
    ==> ERROR: A failure occurred in build().
        Aborting...
    ==> ERROR: Makepkg was unable to build mozc-ut.

このようなpatchで当てるときに失敗してそうな場合に有効です
他の場合は知らないです
ちなみにuimを使うようにPKGBUILDをいじらないとこの問題は発生しないと思います

何をするのか

patchのファイルが少しおかしいのを直すだけです
今回の場合は

    patching file composer/internal/composition.h
    Hunk #1 FAILED at 53.
    1 out of 1 hunk FAILED -- saving rejects to file composer/internal/composition.h.rej

ここに注目して composer/internal/composition.hの53行目からのpatchを修正します
他にもいじります

やり方

まずは作業フォルダに移動してから

    % yaourt -G mozc-ut

ビルドする時にyaourtがAURから落とすファイルをカレントディレクトリに落として

次に修正が必要なファイルを落とします
PKGBUILDに

    _uimmozcrev=317
    (中略)
    http://downloads.sourceforge.net/project/pnsft-aur/mozc/uim-mozc-${_uimmozcrev}.tar.xz

このように修正が必要なファイルを取得していると書いてあるので

    % curl -L -O 'http://downloads.sourceforge.net/project/pnsft-aur/mozc/uim-mozc-317.tar.xz'

リダイレクトが必要なページだと思うのでwgetではなくcurlなどで落としてください。別にモダンブラウザでも問題ありません

    % tar xf uim-mozc-317.tar.xz

解凍したのち問題のpatchのファイルをエディタで開いて直接いじります(別にdiffを使ってもいいけど…)

    % vim uim-mozc-317/mozc-kill-line.diff
※実際には行番号は書いていません

    152 --- composer/internal/composition.h>(revision 52)
    153 +++ composer/internal/composition.h>(working copy)
    154 @@ -53,6 +53,7 @@
    (略)

とりあえずこの152行目から始まるpatchと
http://mozc.googlecode.com/svn/trunk/src/composer/internal/composition.h
ここにある元ファイルの53行目あたりを見て(バージョンを指定していないので場合によっては違うけど)
何が問題なのか推測して
前の型のところにvirtualとかかれていないのが問題のように思えたので

※実際には行番号は書いていません

    157    virtual size_t DeleteAt(size_t position);
    158 +  virtual size_t KillLineAt(size_t position);
    159    virtual size_t InsertAt(size_t position, const string &input);
    160    virtual size_t InsertKeyAndPreeditAt(size_t position,

このように前のところにvirtualをつけて保存しますがこれを使用してコンパイルをすると

    (前略)
    session/session.cc: In member function ‘bool mozc::session::Session::KillLine(mozc::commands::Command*)’:
    session/session.cc:2321:47: error: too few arguments to function ‘void mozc::session::{anonymous}::SetSessionState(mozc::session::ImeContext::State, mozc::session::ImeContext*)’
    session/session.cc:170:6: note: declared here
    make: *** [out_linux/Release/obj.target/session/session/session.o] Error 1
    Traceback (most recent call last):
      File "build_mozc.py", line 1442, in <module>
        main()
      File "build_mozc.py", line 1430, in main
        BuildMain(cmd_opts, cmd_args, original_directory_name)
      File "build_mozc.py", line 1081, in BuildMain
        BuildOnLinux(options, targets, original_directory_name)
      File "build_mozc.py", line 912, in BuildOnLinux
        RunOrDie([make_command] + build_args + target_names)
      File "/home/noter/dev/tmp/mozc/mozc-ut/src/mozc-ut-1.6.1187.102.20120529/build_tools/util.py", line 97, in RunOrDie
        '==========']))
    build_tools.util.RunOrDieError:
    ==========
     ERROR: make -j1 MAKE_JOBS=1 BUILDTYPE=Release builddir_name=out_linux mozc_server mozc_tool mozc_emacs_helper uim-mozc
    ==========
    ==> ERROR: A failure occurred in build().

よくわからないですがこのようなエラーを吐きます
一度コンパイルなどをしていると存在するファイル(patchを当てないと生成されない)

    mozc-ut/src/mozc-ut-1.6.1187.102.20120529/session/session.cc

このファイルの2321行目でエラーが出ているらしいです
エラーを翻訳すると引数が足りないとかそんなことを言っています
現在のソースコードを確認するとどうやら1つしか与えていないみたいです
本来は2つ与えるみたいですね
この箇所も例のdiffで追加されたものみたいなので同じようにpatchの

※実際には行番号は書いていません

    51 +    SetSessionState(ImeContext::PRECOMPOSITION);

これを他の奴に習って

※実際には行番号は書いていません

    51 +    SetSessionState(ImeContext::PRECOMPOSITION, context_.get());

このように2つ目の引数をcontext_.get()にしときましょう
正直なところあっているかわかりませんが他も2つ目の引数はこれを呼び出しているのでおそらく問題はない…と思いたい

保存をしたら

    % tar Jcf uim-mozc-317.tar.xz uim-mozc-317/

圧縮し直します

    % mv uim-mozc-317.tar.xz mozc-ut/

移動させます

    % vim mozc-ut/PKGBUILD

グローバルから落とすのではなく今作ったファイルを使うようにいじります

修正必要な箇所は87行目のファイルの場所と88行目のそのハッシュ値です

    source+=(uim-mozc-${_uimmozcrev}.tar.xz)

87行目はこのように最後のファイル名だけにした形にしておけばよいです
88行目は

    % sha1sum mozc-ut/uim-mozc-317.tar.xz
    84790a14d4eed97df9fd6c2500e5979976cef182  mozc-ut/uim-mozc-317.tar.xz

こんな感じでハッシュを取得して

    sha1sums+=('84790a14d4eed97df9fd6c2500e5979976cef182')

このように書いておけば間違いないでしょう

この時、ついでにこの時にPKGBUILDを好みに合わせていじってください

次にパッケージを作成します

    % cd mozc-ut/
    % makepkg

この時にコンパイルが実行されるので気長に待ちましょう

何もエラーがなければ最後にインストールをして終了

    # pacman -U ./*.pkg.tar.xz

作成されたファイルはpkg.tar.xzで終わるもので、今回は複数個、生成されているのでこうしています
ちなみにこのpkg.tar.xzを使いまわせばコンパイルをせずに複数のパソコンに導入できます

もしかしたらpacmanをした時に

    loading packages...
    resolving dependencies...
    looking for inter-conflicts...
    error: failed to prepare transaction (could not satisfy dependencies)
    :: emacs-mozc-ut: requires mozc-ut=1.5.1090.102.20120529

このようなエラーが表示されるかもしれません
既に存在しているファイルと衝突が起きるらしいです
今回はこれらのファイルをバージョンアップしたものを導入するので消しても問題ないでしょうし

    # pacman -Rs emacs-mozc-ut

こんな感じで多分消せます。pacmanの使い方はインストールぐらいしか覚えてない…
って、PKGBUILDでemacs内で使えるように設定を変えるの忘れてたよ…
通りでこのようなメッセージが出たわけだ。使ってなかったからいいんだけども

そういうわけでここまでくれば % yaourt -S mozc-ut した後と同じような環境になりましたとさ
後は作業ディレクトリを消したりすれば終わり

だったんだけどmozcが使えなくて少し困惑していると

    # uim-module-manager --register mozc

これをするのを忘れてた
もしかして、アップデートする必要性なかったんじゃ…
ついでに使わないinput methodを消しとこう

後書き

こんな手順でよかったのだろうか…?
簡単な使い方があるのかもしれないけどバージョンアップごとにPKGBUILDをいじるのは面倒くさいな
gentooならUSEがあって便利だった
しかし…10年ぐらい前のパソコンでコンパイルしたくないからgentooっぽいような気がするコンパイル済みのパッケージを配布しているarchlinuxを使っていたのだけどこの辺は利便性のためには仕方ないのかなあ
ただ、bootの時にソフトをバックグラウンドで走らせることによって起動が数秒なのは魅力的かな
もしかしたらgentooのopenrcでもできたかもしれないけど
gentooを使っていたときにuimでmozc使うときはこのPKGBUILDをebuildに移植すればよかった…そしたらibusと共存できそうだ