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, inmain(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の問題解決に多大な時間を要してしまった。修行が足りないのだろう。