Cygwin 本体 cygwin-1.5.25-15-src.tar.bz2 に対する差分ソースファイルと, 便宜のためのコンパイル済みバイナリを md5sum 値とともに示します。
初期の 2006/3/31 版 (Cygwin 1.5.19-4 用) と比べ,2006/8/9 版 (Cygwin 1.5.21-2 用) 以降 (本バージョンを含む) では下記の点を改良しています。
さらに 2008/3/11 版以降 (本バージョンを含む) では下記の改良をしています。
ただし,今のところ Windows Vista のコンソールが,サロゲートペアで表現される追加漢字面の表示に対応していませんから, 実際にコマンド行でそれらの漢字を見ることはできません。 もっとも,これは表示の問題だけで,コンソール上の論理的なデータそのものは正当ですから, メモ帳とのあいだでコピー&ペーストしたり,作成したファイル名をエクスプローラで確認すると, 正しくそれらの漢字を扱えていることが確認できます。
本バージョン (2008/11/18 版) では2箇所変更しました。
.gnu_debuglink の参照を無くしました。
そうしなければ,make 時に
../../.././winsup/cygwin/cygwin.sc:143: undefined section `.gnu_debuglink' referenced in expression
というエラーが出て終わります。
__cygwin_debug_size はどこからも参照されていません。
01:~/cygwin-1.5.25-15/winsup/cygwin$ diff cygwin.sc~ cygwin.sc 114c114 < __cygwin_debug_size = SIZEOF(.gnu_debuglink); --- > /* __cygwin_debug_size = SIZEOF(.gnu_debuglink); */ 11:~/cygwin-1.5.25-15/winsup/cygwin$
01:~/cygwin-1.5.25-15/winsup/cygwin$ diff -c fhandler_console.cc~ fhandler_console.cc *** fhandler_console.cc~ Tue Nov 18 13:23:49 2008 --- fhandler_console.cc Tue Nov 18 14:43:40 2008 *************** *** 1643,1648 **** --- 1643,1650 ---- MultiByteToWideChar (CP_UTF8, 0, buf, offset, wbuf, r); insert_spaces (mock_wswidth (wbuf, r)); r = WriteConsoleW (oh, wbuf, r, &dummy, 0); + if (r == 0) + break; done = WideCharToMultiByte (CP_UTF8, 0, wbuf, dummy, 0, 0, 0, 0); } 11:~/cygwin-1.5.25-15/winsup/cygwin$
ここでは Unicode 文字列を WriteConsoleW で出力し,実際に出力された文字数を
dummy に得ています。それを WideCharToMultiByte へ渡すことで
UTF-8 文字列でのバイト数を数えているわけですが,今までは WriteConsoleW
の戻り値を検査していなかったため,エラー時に dummy が初期化されないまま
WideCharToMultiByte に Unicode 文字列長として渡されていました。
dummy の値によっては Unicode 文字列の領域をはるかに超えるアクセスが行われ,
ACCESS VIOLATION が発生します (なお,dummy という変数名は 4 バイトのダミーバッファ変数を流用したからで,決して
ほめられるコーディングではありませんが,ここでは最低限の改修に留めています)。
具体的には,先日公開された Cygwin の新しい
X11R7.4 の X サーバが,このバグにより起動時にクラッシュしていました。
GDB や strace ではコンソール出力が成功してしまうため,バグが再現せず,
現象を把握できませんでしたが,クラッシュ時に残された XWin.exe.stackdump
ファイルのスタックトレースの引数に 0xFDE9 = 65001 = CP_UTF8
があることが解決の手がかりとなりました。もしもゴミでなければ,次の引数が 0,
その次がスタック上の (おそらくローカル配列の) アドレス,その次がなにか大きな値
(ないし関数のアドレス?) であることから候補が十分に絞られます。
Frame Function Args 0022876C 77EA194A (00018018, 656D5D5E, 00018016, 00000000) 00228794 77EA1421 (0000FDE9, 00000000, 002287F0, 656E6967) 002287C8 77E992A5 (0000FDE9, 00000000, 002287F0, 656E6967) 0022C8E8 61026673 (61185BE8, 005C5EE0, 005C5F12, 00000000) ……
cygwin1-dll-20-11-18.tar.bz2 を展開すると, cygwin1.dll が得られます。 すべての Cygwin プロセスを終了させてから, C:\cygwin\bin に置きます。 Life with Cygwin 7.2 も参考にしてください。 Life with Cygwin 4.2.2 のように非 ASCII 文字を含むパス名 (「デスクトップ」など) を mount している場合は, C:\cygwin\bin\cygwin1.dll を置き換えた後,いったん Windows をログオフまたは再起動します。 共有メモリ上の mount テーブルを UTF-8 に切り替えるためです。
インストールに成功した場合,/proc/version の内容出力は下記の結果になります。 ただし NT-5.1 は Windows XP で実行した場合です。 Windows 2000 では NT-5.0 に, Windows Vista では NT-6.0 になります。
01:~$ cat /proc/version CYGWIN_NT-5.1 1.5.25(0.156/4/2) 2008-11-18 15:24 01:~$
自分でコンパイルする場合は次のようにします。
01:~$ tar xf cygwin-1.5.25-15-src.tar.bz2 01:~$ cd cygwin-1.5.25-15/winsup 01:~/cygwin-1.5.25-15/winsup$ bzcat ~/winsup-utf8-patch-20-11-18.diff.bz2 | patch -p0 patching file ./cygwin/cygwin.sc patching file ./cygwin/fhandler.h patching file ./cygwin/fhandler_console.cc patching file ./cygwin/miscfuncs.cc patching file ./cygwin/path.cc patching file ./cygwin/spawn.cc patching file ./cygwin/winsup.h 01:~/cygwin-1.5.25-15/winsup$
01:~/cygwin-1.5.25-15/winsup$ cd .. 01:~/cygwin-1.5.25-15$ ./configure
01:~/cygwin-1.5.25-15$ make
make がドキュメント生成段階で失敗しても, i686-pc-cygwin/winsup/cygwin に new-cygwin1.dll と cygwin0.dll が出来ていればビルドは成功です。 両者の実体は同じです ("ls -i" で確認できます)。 C:\cygwin\bin\cygwin1.dll として置きます。 /proc/version の内容出力の日付と時刻は,dll の作成日時になります。
注意: 自分でコンパイルする場合は,make するディレクトリのパスに空白等を含めないようにするのが無難です。
cygutils-1.3.4-1-src.tar.bz2 に含まれる cygstart コマンドに対する変更前後のソースファイルと,便宜のためのコンパイル済みバイナリを md5sum 値とともに示します。
cygstart-exe-210424.tar.bz2 を展開すると cygstart.exe が得られます。 /bin/ (実体は C:\cygwin\bin) にコピーしてください。
自分でコンパイルする場合は, cygutils-1.3.4-1-src.tar.bz2 の内容を展開し, cygutils-1.3.4/src/cygstart/cygstart.c を, cygstart-21-04-24.tar.bz2 を展開して得られる cygstart.c に置き換えてコンパイルします。
.bashrc, .inputrc, .vimrc をホームディレクトリに置きます。
python をインストールしている場合, sitecustomize.py を /usr/lib/python2.5/site-packages/ に置きます。
注意: この設定ファイルは筆者が現在使っているものです。 UTF-8 のため以外の設定事項も含まれています。 使用法 を参考に,適宜内容を取捨選択してください。