cygwin上でrepo syncを実行する

私の環境(Windows 7 with service pack1, Cygwin 1.7.8)では普通にインストールしても上手く行かなかったので、備忘録のために書く。

repoのために追加インストールするパッケージ

libiconv

Cygwinのパッケージでは無いが、これがないとrepo init実行時に以下のエラーが発生する。

$ repo init -u git://android.git.kernel.org/platform/manifest.git
gpg: error loading `iconv.dll': The specified module could not be found.

DLLということで私はGnuPGの本家からバイナリをダウンロードしたが(http://www.gnupg.org/download/iconv.html)、Cygwinオプションパッケージ Default/libiconvをインストールしても良いのかもしれない。(未検証)

Web/curl

repoなどのコマンドをダウンロード、インストールするのに使用する

Utils/gnupg(1.4.9-2)

暗号鍵を作成するためにGNU Privacy Guardを使用する。明示的にインストールしないとrepo init実行時に以下のエラーが発生する。

$ repo init -u git://android.git.kernel.org/platform/manifest.git
gpg: keyblock resource `/cygdrive/d/Users/kazz/.repoconfig/gnupg\secring.gpg': file open error
gpg: keyblock resource `/cygdrive/d/Users/kazz/.repoconfig/gnupg\pubring.gpg': file open error
gpg: no writable keyring found: eof
gpg: error reading `[stdin]': general error
gpg: import from `[stdin]' failed: general error
gpg: Total number processed: 0
fatal: registering repo maintainer keys failed
Interpreters/python(2.5.5-1)

repo initなどのコマンドはPythonスクリプトで書かれているのでPythonのインストールは必須となる。また、この場合Pythonのバージョンが重要であり、デフォルトでインストールされる2.6.5では駄目で、明示的に2.5.5を選択する必要がある。

デフォルトで2.6.5をインストールするとrepo init実行時に以下のエラーが発生する

$ repo init -u git://android.git.kernel.org/platform/manifest.git
      1 [main] python 4280 E:\cygwin\bin\python.exe: *** fatal error - unable to
 remap \\?\E:\cygwin\lib\python2.6\lib-dynload\select.dll to same address as par
ent: 0x3C0000 != 0x3E0000
Stack trace:
Frame     Function  Args
0022A6A8  6102792B  (0022A6A8, 00000000, 00000000, 771D7A4B)
0022A998  6102792B  (6117DC60, 00008000, 00000000, 6117F977)
0022B9C8  61004F3B  (611A6FAC, 61247BF4, 003C0000, 003E0000)
End of stack trace
      0 [main] python 792 fork: child 4280 - died waiting for dll loading, errno
 11
Traceback (most recent call last):
  File "/usr/bin/repo", line 603, in 
    main(sys.argv[1:])
  File "/usr/bin/repo", line 570, in main
    _Init(args)
  File "/usr/bin/repo", line 184, in _Init
    _CheckGitVersion()
  File "/usr/bin/repo", line 213, in _CheckGitVersion
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
  File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1049, in _execute_child
    self.pid = os.fork()
OSError: [Errno 11] Resource temporarily unavailable


ここまでやってやっとrepo initが動きrepo syncを実行できた。(問題解決に今日一日潰したのは内緒だ)


オープンソースは非常にありがたいものだが大勢の開発者が書いたソフトウェアの集合体なので、いざ実行すると本来の目的と離れた所問題が発生することも多く、それが分からない人間には厳しい。
今回もandroidソースコードが置かれているリモートのリポジトリと同期を取るためにrepoをインストールして実行するのが目的なのだが、一見全く関係の無いGnuPGの問題解決に多大な時間を要してしまった。修行が足りないのだろう。