Cygwin Snapshotsでは、開発中の Cygwin DLL のソースコードとバイナリが公開されています。 ここで用いられている配布形式は以下の 5 つです
Cygwin DLL は主に winsup と newlib の二つのパッケージからなっています。 winsup には UNIX のシステムコールのエミュレータ、いくつかのツール、 およびアプリケーション開発に必要な必要なヘッダファイルが含まれています。 Cygwin の開発チームがメンテナンスしているのは winsup だけです。 newlib は主に組み込み環境を対象とした C 言語のライブラリ関数の実装です。 こちらは Red Hat の Jeff Johnston によってメンテナンスされています。
Cygwin DLLに加えられたの変更点の大半は、C:/cygwin/bin/cygwin1.dll を cygwin1-date.dll.bz2 を解凍したものと入れ換えるだけで反映されます。 cygwin1.dll を入れ替える場合には Cygwin のアプリケーションをすべて終了して、 コマンドプロンプトかエクスプローラで入れ替えます。 古い cygwin1.dll は念のため保存しておきましょう。
Cygwin DLL のバグに気付いたら、cygwin1.dll だけを最新の snapshot と入れ替えてみてください。 すでにそのバグは直っているかもしれません。 snapshot は致命的なバグが入った状態で公開されることもあるので、 入れ替えるとかえって事態が悪くなることもあります。 そんなときには少し前の日付けの snapshot を試してみましょう。
Cygwin DLL の API に関する変更は cygwin1.dll を入れ替えるだけでは反映されません。 cygwin-inst-date.tar.bz2 をインストールして、アプリケーションをコンパイルしなおす必要があります。
アプリケーションをコンパイルしていて、 UNIX ならあるはずの関数や変数が見つからないと怒られた場合には、 ChangeLog を調べて、 その関数や変数が追加されていないか確認してみましょう。 もし追加されていたら、 最新の cygwin-inst-date.tar.bz2 をインストールしてコンパイルしなおすと、 コンパイルが通るかもしれません。
ちなみに、API が変更されると、winsup-src-date.tar.bz2 に含まれる version.h の CYGWIN_VERSION_API_MINOR の値が変更されます。 この値は uname -r を実行することでも確認できます。 以下の37という数字がそれです。
$ uname -r 1.3.0(0.37/3/2)
Cygwin DLL に導入された新しい機能を利用するために、 コマンドの入れ替え/追加が必要な場合もあります。 その際には、cygwin-inst-date.tar.bz2 をインストールするか、必要なファイルだけを取り出してインストールします。
最新のソースコードから Cygwin DLL のバイナリを作成する方法を説明します。
CVS のリポジトリから取得する方法と、Cygwin Snapshots から作成する方法があります。
まず環境変数 CVSROOT を設定してログインします。
$ export CVSROOT=:pserver:anoncvs@cygwin.com:/cvs/src $ cvs login (Logging in to anoncvs@sources.redhat.com) CVS password: anoncvs
必要なファイルをチェックアウトします。 最初にトップディレクトリのファイルをチェックアウトして、 次に必要なサブディレクトリをチェックアウトします。
$ cvs -z3 checkout -l src cvs server: Updating src U src/.cvsignore U src/COPYING ... $ cvs -z3 checkout src/winsup src/newlib src/libiberty src/include src/config src/etc cvs server: Updating src/winsup U src/winsup/CYGWIN_LICENSE U src/winsup/ChangeLog ... $ cd src
Cygwin Snapshots から最新の cygwin-src-date.tar.bz2 を取ってきて展開します。 たとえば cygwin-src-20000828.tar.bz2 が最新なら
$ mkdir src; cd src $ bzcat cygwin-src-20000828.tar.bz2 | tar xf -
ソースを展開したディレクトリとは別のディレクトリで configure を実行します。 winsup の Makefile は、ソースと同じディレクトリで make することを想定していないので、そのまま configure を実行すると失敗する可能性があります。
$ mkdir BUILD; cd BUILD $ CFLAGS=-O2 CXXFLAGS=-O2 ../configure --prefix=/usr
make を実行すると、i686-pc-cygwin/winsup/cygwin/ に new-cygwin1.dll が生成されます。これが新しい cygwin1.dll です。 前述したように、Cygwin のアプリケーションをすべて終了して、 コマンドプロンプトかエクスプローラで C:/cygwin/bin/cygwin1.dll と入れ替えます。
cygwin-inst-date.tar.bz2 をインストールするのと同じ状態にする場合には、以下のように make を実行します。
$ cd i686-pc-cygwin/newlib $ make tooldir=/usr install $ cd ../winsup $ make -i install_cygwin install_utils install_cygserver
newlib で make を実行するときに tooldir=/usr を付けないと、/usr/i686-pc-cygwin にファイルがインストールされてしまいます。 winsup で make を実行するときに -i を付けるのは、cygwin1.dll の入れ替えでエラーになったときに、そこで止まるのを防ぐためです。
バージョンの異なる cygwin1.dll は同時に一つのコンピュータに同居できません。 親プロセスと子プロセスにリンクされる cygwin1.dll のバージョンが違うと、fork の実行に失敗します。