mozcをFreeBSDでビルドしようとして挫折

Google日本語入力OSS版であるところのmozcをFreeBSDでビルドしようとして普通に挫折し,予告通り不毛な週末を過ごしたので,そのメモ.っていや本当に全部つぶしたワケじゃないけど.よい子は真似するの禁止.

LinuxBuildInstructionsに従いコードを入手し,Compilation に移る前に色々と修正する.

makeとしてgmakeを使うようにしとく

% export BUILD_COMMAND=gmake

QTDIRなる環境変数があるので,よく分からんけど /usr/local を指すようにしとく

% export QTDIR=/usr/local

何かしらんけどデフォルトの g++ じゃ駄目だったので,LLVMのg++を使う*1.ついでにgccLLVMのにしとく.

% export CC=/usr/local/bin/llvm-gcc
% export CXX=/usr/local/bin/llvm-g++

ビルドスクリプトFreeBSDLinuxとして認識するようにしとく.build_mozc.py 編集

def IsLinux():
  """Returns true if the platform is Linux."""
-  return os.name == 'posix' and os.uname()[0] == 'Linux'
+  return os.name == 'posix' and os.uname()[0] == 'Linux' or os.name == 'posix' and os.uname()[0] == 'FreeBSD'

インクルードディレクトリなどの設定.gyp/commons.gypi編集して追記*2

'include_dirs': [
 (略)
+ '-I/usr/local/include'
],
+'ldflags': [
+ '-L/usr/local/lib'
+],

const charとcharでハマってるので,base/iconv.cc 編集*3

 void IconvHelper(iconv_t ic, const string &input, string *output) {
   (略)
-   char *ibuf = const_cast<char *>(input.data());
+   const char *ibuf = const_cast<char *>(input.data());
   (略)
-     if (iconv(ic, reinterpret_cast<char **>(&ibuf),&ilen, &obuf, &olen)
+     if (iconv(ic, &ibuf, &ilen, &obuf, &olen)
   (略)
 }

PTHREAD_MUTEX_RECURSIVE_NP が使えるのはLinuxだけみたいなので,PTHREAD_MUTEX_RECURSIVEに置き換える.base/mutex.h 編集

#ifdef OS_LINUX
- #define PTHREAD_MUTEX_RECURSIVE_VALUE PTHREAD_MUTEX_RECURSIVE_NP
+ #define PTHREAD_MUTEX_RECURSIVE_VALUE PTHREAD_MUTEX_RECURSIVE
#endif


で,Compilationの手順を追っていくと,以下のエラーで落ちる.

Running: gmake -j4 BUILDTYPE=Release build_tools
out/Release/.deps/out/Release/obj.target/gen_suggestion_filter_main/prediction/gen_suggestion_filter_main.o.d:9: *** タ ーゲットパターンが `%' を含んでいません.  中止.
Traceback (most recent call last):
  File "build_mozc.py", line 586, in <module>
    main()
  File "build_mozc.py", line 576, in main
    BuildToolsMain(original_directory_name)
  File "build_mozc.py", line 541, in BuildToolsMain
    BuildMain(original_directory_name)
  File "build_mozc.py", line 520, in BuildMain
    BuildOnLinux(options, targets)
  File "build_mozc.py", line 393, in BuildOnLinux
    target_names)
  File "build_mozc.py", line 312, in RunOrDie
    '==========']))
__main__.RunOrDieError:
==========
 ERROR: gmake -j4 BUILDTYPE=Release build_tools
==========

見たところ自動生成されたMakefile (正確にはインクルードされる依存関係記述)が壊れているらしい.どのタイミングで誰が生成してるのか全く不明なので,ここで挫折.個別対処しようにも,どう直せば良いのかよく分からない上,同様に壊れてるファイルが大量に存在するし.ということで続きはまた来週 *4

*1:__sync_val_compare_and_swapがundefined referenceになってしまった.LLVMのライブラリには入ってたのでこっちを使うようにした.もっと良い解決方法があるはず.

*2:Makefileは自動生成

*3:あんまりあってる気がしない…

*4:いや,多分何もしないか何も進展しないと思うけど…