stylesheet

2011-03-14

Windows7 x64でdulwich-0.7.0のビルドが通らなかった

mercurialでgitレポジトリをcloneできるようにするhg-gitプラグインをインストールしたときのメモ。

$ easy_install hg-git

Windows7 x64 + VC2008 + python2.7環境でeasy_installすると依存ライブラリdulwichのビルドで...

running build
running build_py
running build_ext
building 'dulwich._diff_tree' extension
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -Idulwich -IC:\usr\local\python2\include -IC:\usr\local\python2\PC /Tcdulwich/_diff_tree.c /Fobuild\temp.win-amd64-2.7\Release\dulwich/_diff_tree.obj
_diff_tree.c
dulwich/_diff_tree.c(267) : error C2065: 'mode_t' : 定義されていない識別子です。
dulwich/_diff_tree.c(267) : error C2146: 構文エラー : ')' が、識別子 'lmode' の前に必要です。
error: command '"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64\cl.exe"' failed with exit status 2

こけました...

dulwichの修正とインストール

さっそくソースを取ってきてかくにーん。
こけてるのはdulwich/_diff_tree.cのこの辺...

   Py_DECREF(mode);
   return NULL;
  }
  result = PyBool_FromLong(S_ISDIR((mode_t)lmode));
 }
 Py_INCREF(result);

mode_tでGREPしてみるもどこにも定義されている形跡なし。
ここはひとつ禁断のモンキーパンチパッチでいっとけ。定義されてなければ、定義してしまえばいいよね。

_diff_tree.cの先頭あたり(23行目)に...

 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA  02110-1301, USA.
 */

#include &rt;Python.h<
#include &rt;sys/stat.h<

typedef int mode_t; // &rt;- It's a monkey magic!

#if (PY_VERSION_HEX &rt; 0x02050000)
typedef int Py_ssize_t;

挿入!

素早くbuildして確認。

$ setup.py build
...
building 'dulwich._diff_tree' extension
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -Idulwich -IC:\usr\local\python2\include -IC:\usr\local\python2\PC /Tcdulwich/_diff_tree.c /Fobuild\temp.win-amd64-2.7\Release\dulwich/_diff_tree.obj
_diff_tree.c
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64\link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:C:\usr\local\python2\libs /LIBPATH:C:\usr\local\python2\PCbuild\amd64 /EXPORT:init_diff_tree build\temp.win-amd64-2.7\Release\dulwich/_diff_tree.obj /OUT:build\lib.win-amd64-2.7\dulwich\_diff_tree.pyd /IMPLIB:build\temp.win-amd64-2.7\Release\dulwich\_diff_tree.lib /MANIFESTFILE:build\temp.win-amd64-2.7\Release\dulwich\_diff_tree.pyd.manifest
_diff_tree.obj : warning LNK4197: エクスポート 'init_diff_tree' が複数回指定されています。一番最初の指定を適用します。
   ライブラリ build\temp.win-amd64-2.7\Release\dulwich\_diff_tree.lib とオブジェクト build\temp.win-amd64-2.7\Release\dulwich\_diff_tree.exp を作成中
C:\Program Files\Microsoft SDKs\Windows\v7.0\bin\x64\mt.exe -nologo -manifest build\temp.win-amd64-2.7\Release\dulwich\_diff_tree.pyd.manifest -outputresource:build\lib.win-amd64-2.7\dulwich\_diff_tree.pyd;2
...

warning出てるけど気にしなーい。

$ setup.py install

で、なんとかなりました。

  • TortoiseHGならTortoiseHg/library.zipにdulwichが含まれてるので不要?
  • dulwichのsetup.pyにPurePythonモードがあるのは後で知った。(setup.py --pure install)

hg-gitプラグインの有効化

インストールがうまくいったのでmercurialの設定に進む。

ホームディレクトリ直下のmercurial.iniを編集してhggitプラグインを有効にする。bookmarksプラグインも使うようなのでなければついでに追加しておく。

[extensions]
bookmarks = 
hggit =           # <- コレだ
win32mbcs = 
rebase = 
keyword = 
eol = 
mq = 

動作確認

適当なgitレポジトリをcloneしてみる。
今回はrubyの軽量フレームワークSinatraにする。特に意味はない。

$ hg clone git://github.com/sinatra/sinatra.git
destination directory: sinatra
importing Hg objects into Git
Counting objects: 7276, done.
Compressing objects: 100% (3568/3568), done.
Total 7276 (delta 4337), reused 6208 (delta 3549)
importing Git objects into Hg
updating to branch default
102 files updated, 0 files merged, 0 files removed, 0 files unresolved

うまくいった。

感想

素直にgitをインストールすればよかったかも...。

- 終わり -