The GNU-WIN32/CYGWIN32 FAQ and protomanual 1.5 for release b18. (Japanese)

これは何ですか?

GNU-Win32 ツールは、広く普及している GNU の開発ツールを、x86 および PowerPC プロセッサの Windows NT/95 上に移植したものです。このツールを 用いて開発されたアプリケーションは、 Microsoft Win32 API にも Cygwin32 API にも同様にアクセスできます。この Cygwin32 API は、unix ソケットや プロセスコントロールを含む UNIX 風の機能を提供し、fork や select など が動作します。

これらのツールをインストールすることにより、標準 Microsoft Win32 APIお よび Cygwin32 API を使っての Win32 コンソールアプリケーション、または GUI アプリケーションの作成が可能になります。またたくさんの GNU のツー ルを、ソースから configure し、ビルドすることが簡単にできます。これは gnu-win32 開発ツール自身も含めて、です。さらに、他の多くの Unixでの重 要なプログラムを、ソースコードを大きく変更することなく Windows NT/95 に移植することができます。あるいは単に bash やその他の、完全な unix 風 環境を実現するたくさんのユーティリティを使うこともできます。これらは bash からでも command.com からでも利用可能です。

これはフリーソフトウェアですか?

はい。いくつかは GNU のソフトウェア(gcc、gas、ld、など)で、いくつかは Berkeley license などのライセンスに含まれます。シェアウェアではありま せん。あなたはこれを使用するために、誰かにお金を支払う必要はありません。 あなたがこれらのツールを使用する上で、GNU General Public License がど のように影響を与えるかについての詳細な情報は、この FAQ の copyright の 項を参照してください。

プロジェクトの簡単な歴史

最初は開発ツール(gcc、gdb、gas など)の強化が行われました。これで Win32 ネイティブオブジェクトファイルの生成、解釈ができるようになりました。

次の仕事はツールを Win NT/95 に移植することでした。これをソースの大部 分を Win32 API の文脈内で動作するように書き換えることによって行いまし た。しかしこれはそれぞれのツール全てに対して、膨大な時間を費やすことに なってしまいました。その代りに、共有ライブラリ(cygwin.dll)を書くという 全く異なったアプローチを取ることにしました。これは必要な unix 風の機能 でWin32 API に不足しているもの(fork、spawn、シグナル、select、ソケット など) を追加する、というライブラリです(私たちはこの新しいインタフェー スを Cygwin32 API と呼んでいます)。一旦これが書かれたあとは、unix 上で クロスコンパイラを使って、このライブラリをリンクして、動作する Win32 ツールをビルドすることが可能になりました。

この時点から、私たちは Windows NT でネイティブにリビルドすることができ るネイティブツールを生成する、という目標を達成しようとしました。 Windows NT にも Windows 95 にも 標準的な unix ユーティリティは付属して こないので、cygwin32 API 上で動作する GNU の同種のユーティリティ (fileutils、 textutils、 bash など)が必要になりました。移植作業のほと んどは configure 機構の変更に関するものでした。というのは、ほとんどの ものは箱から(tarfile から?)出してクロスコンパイラで構築する、というわ けにはいかなかったからです。開発ツールとこれらの付加的「ユーザ」ツール が役目を果たすようになり、bash シェルが動いていると、Windows 95 と NT も、GNU configure 機構用の unix の一種のように見えてきました(変なやつ だけどね)。

beta 17.1 リリース以降では、x86 の Windows NT と Windows 95 上でのネイ ティブでリビルドが動作します。

beta 18 リリースノート

もっとも最新のリリースへのリンクは以下で見つけることができます。

`ftp://ftp.cygnus.com/pub/gnu-win32/latest'

前回のリリースからの変更点

これは重要なリリースです。新しい cygwin.dll は以前リンクされたアプリケー ションとのバックワードコンパチビリティがありますが、内容は大きく変わっ ています。

インストール処理が完全に変更され、 InstallShield5 ベースのインストーラ を使うようになっています。これにより過去に経験した数々のインストール時 の問題を減らしてくれます。しかしながら、以下で説明するように、環境変数 は未だに手で設定する必要があります(将来のgnu-win32 インストーラには、 これを自動的に行う機能を持たせるかもしれません)。

各ツール毎の変更:

GCC のコンパイル時間が fork() の代りに spawn() を使うことによって、 20-30% 向上しました。

GCC は、環境変数(COMPILER_PATH、 LIBRARY_PATH、 C_INCLUDE_PATH、 CPLUS_INCLUDE_PATH、 OBJC_INCLUDE_PATH)の値に、 Win32 と POSIX 形式 のパス名(あるいはパス名リスト)のどちらでも受け付けます。

GDB には tcl/tk ベースの GUI(gdbtk) が付属します。"gdb -nw" として起動 することによって、コマンドライン gdb を起動することもできます。

bash は起動時に、 /tmp が存在しており、かつそれがディレクトリであるこ とを確認します。そうでない場合には文句を言います。

gcc と ld に -s をつけて実行すると不正な実行ファイルが作成されていまし た。これに関する bfd のバグが修正されました。

String.h と string.h(と同様なヘッダファイルの組)が衝突して、インクルー ドしたものと違う方が読まれてしまうことを修正しました。

トップレベルの install-sh スクリプトは、foo をインストールしようとして foo が存在しない時は、foo.exe をインストールしようとします。これで多く の Unix ソフトウェアのインストールの問題が解決します。

dlltool に -I オプションをつけて起動することにより、.def ファイルの IMPORT 宣言が試験的にサポートされます。ぜひ気軽にこれを経験してみてく ださい。ただしこの機能がより広くテストされるようになったら、このフラグ はなくなるでしょう。

time はバージョン 1.7 に上がりました。

make はバージョン 3.75 に上がりました。

make は VPATH 変数で、Win32 と POSIX のパス名リストをどちらでも受け付 けます。

Cygwin32 API (cygwin.dll) の変更:

以下がサポートされています:

以下の関数が追加されました:

かなり改善されたシグナル、例外ハンドラがサポートが追加されています。 kill シグナルはかなり良く働くようになりました(bash で コントロールC が 働きます)。

シェルスクリプトが、常にデフォルトの /bin/sh ではなく、#! の後ろに指定 されたシェルで動くようになっています。

浮動小数点レジスタが crt0.o の中で正しく初期化されるようになっています。

com ポートのようなディスク以外のファイルのオープン時には、シンボリック リンクであるか、実行可能であるかというチェックはもはや行いません。

コンソールタイトルは、実行中のプロセスの名前がセットされるようになって います。

winsock はアプリケーションの起動時に初期化されるようになっています。

reent_data がプライベートアドレス空間から cygwin.dll に移動しました。

system() 呼び出しは、fork()/exec() ではなく spawnvp() を呼び出すように なっています。

NT 拡張属性に対するサポートが追加されましたが、あまりにも遅くなってし まうので今のところ無効にしてあります。これをシンボリックリンクや実行可 能属性のファイル状態を記憶するのに使用したいのです。

NT 上でのみ、 mkpasswd と mkgroup ユーティリティが、正しい /etc/passwd と /etc/group を生成します。

以前のリリースではマウントポイントはレジストリの "Cygnus Support" 以下 に格納されていました。これは beta 18 より "Cygnus Solutions" に変更さ れました。レジストリエディタ(NTでは regedit)を使って古いエントリの名前 を変更するか、あるいは単にもう一度マウントを行ってください。そうすれば cygwin.dll が自動的に新しいものを作ります。

マウントポイントは、30 文字ではなく、最大 MAX_PATH までの長さを取るこ とができます。

内容

以下のパッケージがフルリリースの中に含まれています。

Cygnus Developer's Kit (CDK): binutils, byacc, diff, flex, gas, gcc, gdb, ld, libg++, libstdc++, make, patch

user tools: bash, fileutils, findutils, gawk, grep, gzip, m4, sed, shellutils, tar, textutils, time

これらのツールに対してソースコードが全て利用可能です。これは上記の二つ の部分に別れています。

バイナリリリースのインストール:

まず、古いバージョンの gnu-win32 ツールをあなたの $PATH から削除してく ださい(あるいは本体を削除する)。

ftp サーバに接続し、以下のディレクトリに移動します。

`ftp://ftp.cygnus.com/pub/gnu-win32/latest'.

開発ツールが必要なら…

もしあなたが開発ツールと GNU configure 機構を実行するのに必要なプログ ラムが欲しければ、全リリースをダウンロードしなければなりません。

`cdk.exe' をダウンロードします。

ネットワークコネクションの信頼性が低いときは、代りに小さな塊に分割され たバイナリをダウンロードしてください。分割 cdk インストーラは、 `cdk-split'サブディレクトリからファイルを取得してください。ダ ウンロードが終わったら、コマンドプロンプトから以下のようにして分割ファ イルを結合してください。

copy /b xaa + xab + xac + ... + xag + xah cdk.exe
del xa*.*

`cdk.exe' を実行し、指示に従ってツールをインストールしてくだ さい。デフォルトのインストール場所は `<systemdrive>:\gnuwin32\b18' です。以下の例では、 <systemdrive> が C ドライブで、このディレクトリへインストール することを前提としています。

次に gnu-win32 関連の環境変数を四つ設定しなければなりません。そうしな いとツールは正しく動作しません。これらのツールを bash からと同様に command.com からも使えるようにするため、この設定を bash の外で行った方 が良いかもしれません。つまり、NT ではコントロールパネルの `System' を使うか、Windows 95 では autoexec.bat を修正する、 ということです。

インストール場所を `C:\gnuwin32\b18' と仮定します。

1) GCC_EXEC_PREFIX 環境変数を以下の値に設定する。

`C:\gnuwin32\b18\H-i386-cygwin32\lib\gcc-lib\'

最後のバックスラッシュは重要です!

2) 以下を $PATH に追加する。これはバイナリが存在する場所です。

`C:\gnuwin32\b18\H-i386-cygwin32\bin;C:\gnuwin32\b18\tcl\bin'

3) TCL_LIBRARY 環境変数を以下の値に設定する。

`C:/gnuwin32/b18/tcl/lib/tcl7.6'

この変数では、前向きのスラッシュ `/' を使用しなければなりません。

4) GDBTK_LIBRARY 環境変数を以下の値に設定する。

`C:/gnuwin32/b18/share/gdbtcl'

この変数では、前向きのスラッシュ `/' を使用しなければなりません。

さまざまなプログラムでは `/bin/sh' が参照できるようになってい る必要があります。`/bin' ディレクトリを、もし存在しなければ作 成し、そこに `sh.exe' をコピーしなくてはなりません。 `mount' ユーティリティを使って、どのドライブ文字を `/' としてマウントするかを選択することができます。 `mount' に関する詳細は情報は Frequently Asked Questions (FAQ) ファイルを参照してください。

bash や byacc を含む多くのプログラムでは `/tmp' を参照する必 要があります。 `/tmp'`/' としてマウントされてい るドライブに存在することを確認して、もし必要なら作成してください。

これで終わりました!

もしこのツールをアンインストールしたいと思ったときには、コントロールパ ネルの「アプリケーションの追加と削除」("Add/Remove Programs")によって できるでしょう。

開発ツールに興味がなかったら…

もし単に bash 、fileutils、textutils やその他のユーティリティだけが必 要で開発ツールが必要でなければ、全部のリリースをインストールする必要は ありません。

`usertools.exe' をダウンロードしてください。

ネットワークコネクションの信頼性が低いときには、代りに小さな塊に分割さ れたバイナリをダウンロードしてください。分割されたユーザツールのインス トーラは、`usertools-split' サブディレクトリ以下のファイルを 取得してください。ダウンロードが終わったら、コマンドプロンプトから以下 を行って、分割ファイルを結合してください。

copy /b xaa + xab + xac + xad + xae usertools.exe
del xa*.*

`usertools.exe' を実行して、指示に従ってツールをインストール してください。デフォルトのインストール場所は `<systemdrive>:\gnuwin32\b18' です。以降の例では <systemdrive> が C ドライブのこのディレクトリにインストールす るものと仮定しています。

次に $PATH に実行ファイルの場所を追加する必要があります。これらのツー ルを bash からと同様にcommand.com からも使えるようにするため、この設定 を bash の外で行った方が良いかもしれません。つまり、NT ではコントロー ルパネルの `System' を使うか、Windows 95 では autoexec.bat を 修正する、ということです。

`C:\gnuwin32\b18' にインストールする場合、以下の値を $PATH に 追加してください。

`C:\gnuwin32\b18\H-i386-cygwin32\bin'

さまざまなプログラムでは `/bin/sh' が参照できるようになってい る必要があります。`/bin' ディレクトリを、もし存在しなければ作 成し、そこに `sh.exe' をコピーしなくてはなりません。 `mount' ユーティリティを使って、どのドライブ文字を `/' としてマウントするかを選択することができます。 `mount' に関する詳細は情報は Frequently Asked Questions (FAQ) ファイルを参照してください。

bash を含む多くのプログラムでは `/tmp' を参照する必要がありま す。 `/tmp'`/' としてマウントされているドライブ に存在することを確認して、もし必要なら作成してください。

これで終わりました!

もしこのツールをアンインストールしたいと思ったときには、コントロールパ ネルの「アプリケーションの追加と削除」("Add/Remove Programs")によって できるでしょう。

ソースコードのインストール

このリリースに対応するソースコードをダウンロードする前に、上記のツール (全リリースかまたはユーザツールのみのどちらか)をインストールしなければ なりません。

ソースコードの住処となるディレクトリを作成し、そこに `cd' し ます。

ftp サーバに接続し、次のディレクトリに cd します。

`ftp://ftp.cygnus.com/pub/gnu-win32/latest'.

ユーザツールのソースコードが必要ならば、`usertools-src' サブ ディレクトリに`cd' し、そこにあるファイルをダウンロードして ください。Cygnus Developer's Kit のソースが必要なら、 `cdk-src' サブディレクトリに `cd' して、そこにあるファ イルをダウンロードしてください。

command.com に戻ります。ユーザツールのソースの場合:

copy /b xba + xbb + xbc + xbd + ... + xbk + xbl usersrc.tar.gz
del xb*.*
gunzip -d usersrc.tar.gz
tar xvf usersrc.tar

コンパイラツールのソースの場合:

copy /b xca + xcb + xcc + xcd + ... + xck + xcl cdksrc.tar.gz
del xc*.*
gunzip -d cdksrc.tar.gz
tar xvf cdksrc.tar

どちらも `src' というディレクトリの中に展開します。

これで終わりでしょう…。

オンライン上での Cygnus 情報源

GNU-Win32 プロジェクトのメインの WWW ページは

http://www.cygnus.com/misc/gnu-win32/

ツール毎の情報はここで見つかります。

http://www.cygnus.com/library/

さらなるドキュメントへのリンクはメインの web ページからアクセスできます。

既知の問題、潜在的な問題

DLL 内における固定長配列

DLL内には依然、動的な構造体でなく固定長配列が使用されている個所が多数 残っています。動的な構造体の使用は我々に必要以上のお金を使わせるし、 Cygwin32 層の能力を制限してしまいます。これらのいくつかは beta 16 以降 で修正されてきています。

POSIX 関数の不足

標準 POSIX 機能として用意されているべき機能で未だ用意されていないもの がたくさんあります。また、いくつかの関数は完全には実装されていません。 例えば、 sync はほとんど何もしないにも関わらず 0 を返します。これらの 差は、ゆっくりとですが必ず埋めていきます。

引数における // 形式のパス名を扱えないプログラム

gcc や他のツールは、現在のパス名の形式に完全には適合していません。自分 自身をホストにしようとしたときに絶対必要となる -I//d/foo という引数は 通用しません。このときは、一つだけのスラッシュによる通常のパスのみが使 われます。

DOS 特殊ファイル名

ファイル名に com1、lpt1、aux は、ファイル名の基幹部分としても、拡張子 部分としても使えません。もし使ってしまうと面倒が起きるでしょう。Unixプ ログラムはこれらの名前を避けるような楽しいことはしてくれません。例えば、 perl のディストリビューションの中には aux.sh というファイ ルがあります。perl のコンフィグレーションでは aux.sh ファ イルが存在することを確認しようとしますが、`aux' という魔法の文字が含ま れているファイルを操作しようとしてハングしてしまうでしょう。

ユーザ定義 malloc

もしあなたのプログラム中で malloc という名前の関数を定義 していて、DLL(cygwin32.dll) とリンクした場合、 DLL はあなたの malloc を呼び出します。あなたの malloc がきちんと動くか確 認した方が良いです。

プログラムを bash からではなく DOS コマンドプロンプトから実行した場合、 DLL はコマンドラインのワイルドカードを展開しようとします。この処理はあ なたの main 関数の処理を開始する 前に malloc を 呼び出します。もしあなたのmalloc が、main が 呼び出された後に起こる初期化を必要とするようにかかれている場合、間違い なくおかしくなるでしょう。

大文字/小文字が混在したファイル名

perl の config はまた別の問題を引き起こします。config<foo>.SH スクリプトは "Makefile" という名前のファイルを生成しますが、その途中で "makefile" という名前のファイルを使用、削除します。NT では大文字/小文 字の違いは無視されるため、Makefile が攻撃を受けてしまい、後には何も残 りません。これは `mixed' オプション付きでマウントすることによって回避 できます(訳注: GNU-Win32 ではファイル名の大文字、小 文字の混在が可能なのですか? を参照のこと)。

質問と解答集

これらのツールはどこで手に入れられるの?

メインの ftp サイトは `ftp://ftp.cygnus.com/pub/gnu-win32' で す。他にもいくつかミラーサイトがあります。

ドキュメントはどこにあるの?

gnu-win32 の WWW ページにはたくさんのリンクがあります。

`http://www.cygnus.com/misc/gnu-win32/'

最低限 Release Notes とメインの WWW ページは目を通しておきましょう。 何か書いてあるかも知れません。

ツールのみに関する情報はここにあります。

`http://www.cygnus.com/library/'

gnu-win32 メーリングリストにはどうすれば参加できますか?

gnu-win23 メーリングリストに参加するには以下にメールを送ってください。

gnu-win32-request@cygnus.com

メッセージの本文は以下のように書いてください。

        subscribe gnu-win32  <your-email-address-here>

ここで <your-email-address-here> はあなたのメールアドレスです。

メーリングリストを脱会するには以下にメールを送ります。

gnu-win32-request@cygnus.com

脱会する時はメッセージの本文は以下のように書いてください。

        unsubscribe gnu-win32 <your-email-address-here>

メーリングリストの過去のアーカイブは以下にあります。

`http://www.cygnus.com/ml/gnu-win32'

現在使用しているアーカイブ用のプログラムは非常にやわなので、最新の状態 に保つには問題があります。これは近々直そうとしています。ご迷惑をおかけ します。

gcc が動かないんですけど?

"gcc: installation problem, cannot exec `cpp': No such file or directory" というエラーが出た場合は、GCC_EXEC_PREFIX という環境変数が 正しく設定されていません。その場合は、このリリースに付属している README.txt を読み直すべきです。というのは、他にも /tmp を作成するなど の必要な作業がされていないかもしれないからです。

助けて! /tmp を作らないとツールが変な動作をするんです!

多くの Unix のツール(bash、byacc など)は /tmp が常に存在するものと思っ ています。これは Win32 の国では保証されていません。/tmp を作るか、適当な ディレクトリを選んで、/tmp にマウントしてください。

bash が "49054596: No such file or directory" などと文句を言ってくるのですけど?

ちゃんと /tmp を作りました? beta 18 以降では bash は /tmp が見つからな いときは警告を出します。

beta 18 の GDB が動かない! 何が悪いの?

そのエラーが、"Tcl_Init failed: Can't find a usable init.tcl..." とい うものであれば、おそらく TCL_LIBRARY 環境変数の値が間違って設定されて います。c:\gnuwin32\b18 以下にインストールしたのであれば、TCL_LIBRARY の値は C:/gnuwin32/b18/tcl/lib/tcl7.6 (スラッシュはすべて前向き `/')に 設定されていなければなりません。

"Unable to find main.tcl..." というエラーであれば、GDBTK_LIBRARY 環境 変数が正しいパスではありません。c:\gnuwin32\b18 以下にインストールした のであれば、GDBTK_LIBRARY は C:/gnuwin32/b18/share/tcl (スラッシュはす べて前向き `/')に設定されていなければなりません。

"invalid command name 'create_command_window'" などのようなエラーの場 合には、おそらく GDBTK_LIBRARY 環境変数の値に、前向きのスラッシュ`/' ではなくバックスラッシュ`\' が含まれています。

私のマウントポイントはどこいっちゃったの?

以前のリリースでは、マウントポイントはレジストリの "Cygnus Support" 以 下に格納されていました。これは beta 18 から "Cygnus Solutions" に変更 されました。レジストリエディタ(NT では regedit)を使って古いエントリの 名前を変更するか、あるいは単にもう一度マウントを行ってください。 cygwin.dll は自動的に新しい名前で作成します。

どうして man、 less、 bison などは beta に含まれていないの?

明らかな理由として、私たちは全てのツールを Cygwin32 ツールとして動作す るように移植し、バイナリ配布を提供し保守を行うことは実行不可能です。そ の代りに、Cygnus はその労力を、核となる開発ツールに集中するべきである と考えています。たぶん V や wxwin も含めるべきかな? less や man コマン ドは、満足できる程度に動くものができれば、それも含めるようになるでしょ う。

他の移植されたツールは、正式なリリースに追加修正されているはずなので、 そのツール用のソースから素直にコンパイルできます。もしそれが不可能な場 合は、他の誰か(理由によってはもしかしたら Cygnus)が diff を保守し、ftp できるところに置くでしょう。おそらくそのようなツールはgnu-win32 の Web サイト上でリストを作ることができるでしょう…。

which はどこにあるの?

which コマンドは含まれていないのですが、ほとんど同様のことを行う bash のビルトインコマンド "type" を使うことができます。

bash が "foo: command not found" というのですけど?

コマンドが見つからないからです。コマンド名を間違えたか、そのコマンドが パスの中に入っていないかのどちらかです。

bash から vfork できない、と言われます(あるいは単にハングする)。どうして?

ほとんどの場合、これは自分自身がパスに含まれていないからです。bashを実 行する前に、bash が置いてあるディレクトリがあなたのパスに含まれている かどうか確認してください。また、bash のコピーを /bin/sh.exe としてイン ストールすることも忘れないでください。

シェルスクリプトを実行しようとして、それが間違いなく存在しているにも関 わらず `no such file or directory' のようなエラーが出た場合には、おそ らくbash が /bin/sh を見つけらないのが問題なのです。

これらはみんな、どんな風に動いてるの?

Unix スタイルの API を提供する C のライブラリがあります。アプリケーショ ンはそれとリンクされて…、ほら、Windows 上で動きました。

目標は、あなたのアプリケーションを Windows で動かすために必要な全ての 行儀の悪いやつを、C ライブラリに追加することです。そうすればあなたのア プリケーションは、ソースレベルでの変更無しに、Unix と Windows で動くで しょう。

この C ライブラリは DLL 内にあり、基本的なアプリケーションはとても小さ くなります。またこれにより、DLL の変更時にバックワードコンパチビリティ を残すことで、Win32/Unix 翻訳層のアップグレートを容易にアップグレード できます。

どうやって GUI アプリケーションを作るのですか?

Cygwin32 ライブラリや kernel32 ライブラリなどのいくつかはデフォルトで 含まれますが、非常に良く使われる Win32 API 呼び出し以外のものを使って いる場合には、リンク時にライブラリを追加する必要があるかもしれません。 以下が提供されている追加 Win32 ライブラリのリストです。

advapi32  largeint  ole32     scrnsave  vfw32
cap       lz32      oleaut32  shell32   win32spl
comctl32  mapi32    oledlg    snmp      winmm
comdlg32  mfcuia32  olepro32  svrapi    winserve
ctl3d32   mgmtapi   opengl32  tapi32    winspool
dlcapi    mpr       penwin32  th32      winstrm
gdi32     msacm32   pkpd32    thunk32   wow32
glaux     nddeapi   rasapi32  url       wsock32
glu32     netapi32  rpcdce4   user32    wst
icmp      odbc32    rpcndr    uuid
imm32     odbccp32  rpcns4    vdmdbg
kernel32  oldnames  rpcrt4    version

最後に、コンソールウィンドウが出てこないようにさせるには、GCC のコマン ドラインに "-Wl,--subsystem,windows" の文字列を追加してください。

どうして Microsoft の Win32 ヘッダを再配布しないのですか?

`Microsoft Open Tools License agreement' の セクション 2.d.f には、 「エンドユーザに対して再配布可能の形でさらに再配布することは認められな い」、とあるようです。私たちはこれを、私たちがあなたにあげることはでき るけれども、それをあなたが他の誰かにあげることはできない、という意味だ と取りました。これは Cygnus としては賛成できないことです。ですが幸運に も、私たちはほぼ完璧な、独自の Win32 ヘッダを持っています。

/etc はどうやって設定するの?

/etc を正しく設定するには(そうすると例えば "ls -l" がユーザ情報を正し く表示するようになる)、もしあなたが NT を使っているのなら(NTFS ファイ ルシステムの方が良い)、単に / としてマウントされているファイルシステム に/etc ディレクトリを作り、そして mkpasswd と mkgroup を使って、 /etc/passwd と /etc/group をそれぞれ作成してください。Windows 95 の Win32 API は不完全なので、もしあなたが Windows 95 を使っているのなら残 念でした。

私の NT でツールを再構築するにはどうするのでしょう?

ソースが /src にあり、/obj ディレクトリでビルドし、/install にツールを インストールしたい、仮定します。

bash
cd /obj
/src/configure --prefix=/install -v > configure.log 2>&1
make > make.log 2>&1
make install > install.log 2>&1

Unix と NT でファイルを共有したいのですが?

開発中は、私たちは Samba の動いている Unix マシンと NT/Windows 95 デュ アルブートマシンの両方を使っています。私たちはよく Unix 上のクロスコン パイラを使ってビルドしてバイナリとソースを NT/Win 95 システムにコピー したり、あるいは単に Samba でマウントされたパーティション上で直接いじ くりまわしたりしています。これらのツールは NTFS 上でもちゃんと動くはず ですが、通常私たちは、 Windows 95 上からもアクセスできるように FATファ イルシステムを使用しています。

Cygwin32 の fork() はどう実装されてるの?

Cygwin32 の fork() は、本質的には `non-copy on write' 方式(古い Unix のバージョンで取られていた方式)の fork() のように動作します。このため、 多少遅いです。

beta 18 ではこのように動作します。

親は、子のための Cygwin プロセステーブルの領域を初期化します。親は Win32 の CreateProcess に自分が起動されたときと同じパスを与えて、中断 した子を生成します。親は setjmp を呼び出してコンテキストを保存し、この ポインタを Cygwin32 の共有メモリ領域にセットします(この領域は全ての Cygwin32タスク間で共有されてます)。親は、子の .data と .bss セクション を、自分のアドレス空間から中断した子のアドレス空間へとコピーして埋めま す。そして親はその子を開始させます。親は mutex によって、子が安全な地 点に来るまで待ちます。子は開始して fork されたのがわかったら、保存され たジャンプバッファを使って longjump します。子は親の待っている mutexを セットし、そして親がスタックとヒープを埋めてくれるまで、別の mutex 上 でブロックします。親は子が安全な領域に入ったことを知って、スタックとヒー プを自分のものから子の中へコピーし、子が待っている mutex を解放して、 fork 呼び出しからリターンします。子はブロックしている mutex から起きて、 共有領域を通して渡された mmap 領域を再作成し、fork 自身からリターンし ます。

ワイルドカード(ファイル名展開)はどう動くの?

CYGWIN.DLL を使うアプリケーションが起動して、その時 PID 環境変数が見つからない場合は、これは DOS スタイルのコマンドプロンプト から起動されたものとみなします。これはまず間違いはありません。というのも、 他のツール(bash も含めて)は起動時に新しいプロセスの PID がいくつである かを知るために PID を設定するからです。

DLL が、これは DOS スタイルのプロンプトから来たと思ったときは、与えら れたコマンドラインに対してファイル名の展開を実行します。これはつまり、 DOS から LS *.EXE とタイプした場合、あなたが期待している であろう動作を行う、ということです。

注意: ファイル名展開はmallocを使用します。もしあなたのア プリケーションが malloc を定義しているのなら、それが使用 されます。これはあなたにとってとんでもないことかもしれません(訳注: ユーザ定義 malloc 参照のこと)。

他のドライブはどうやってアクセスするの?

beta 16 以降では、任意のドライブ文字をパスに含めて参照することができま す。ドライブ a: に対して ls を実行するには、以下のようにします。

bash$ ls //a/

あるいは、"mount" コマンドを使って一つのスラッシュだけで参照することも できます。

bash$ mount a:/ /mnt/floppy
bash$ ls /mnt/floppy
....

raw デバイスに書き込みたい場合には、A ドライブには /dev/fd0 、B ドライブには /dev/fd1 を使いま す。

bash$ tar cf /dev/fd0 *.exe
bash$ tar tvf /dev/fd0
....

また、UNC パスに対しても標準的な方法でアクセスできることも覚えておいて ください。上記で述べたドライブ文字のショートカットのために、UNC パスの マシン名は、一文字よりも長くなくてはなりません。

他のディスクにはどうやって到達できるの?

`mount' コマンドを使ってマウントすることができます。例えば、

$ mount i:/a /a
$ mount 
i:\a on /a type dos (normal)
c:\ on / type dos (normal)

これはファイルがオープンされるときに文字列の置き換えによって行われます。 従って、上記のようにマウントされている上で ls /a/barを行 うと、内部の仕掛けが ls i:/a/bar に変換します。

ドライブをマウントするのはただ一度だけでよいことを覚えておいてください。 この対応づけはレジストリ内に保存されるので、マウントはずっと永遠に有効 になります。マウントを取り除くには umunt コマンドを使います(あるいはレ ジストリエディタか)。

`-m' オプションを与えると、mount に対して「大文字、小文字混在モード」 (訳注: ファイル名の大文字と小文字を区別するモード。次項 GNU-Win32 ではファイル名の大文字、小文字の混在が可能な のですか? を参照のこと)を有効にしたいという指示になります。`-b' オプションはバイナリモードでマウントします。

もしこのリリースを `C' ドライブ以外のドライブに置きたい場合には、先に 進むためには mount コマンドを使用しなければいけません

例えば、f:/fish 以下にツリーをインストールしたとします。 すなわち、バイナリの行き場所はf:/fish/bin 以下、などにな ります。

$ mount f:/fish /usr
この意味は、 ls /usr/bin を実行すると、CYGWIN.DLL は f:/fish/bin を見に行く、ということです。

GNU-Win32 ではファイル名の大文字、小文字の混在が可能なのですか?

いくつかの Unix プログラムでは、同じ綴りのファイル名を大文字、小文字を 違えて使い分けられることができると期待しています。重大な例として perl のコンフィグレーションスクリプトがあり、これは Makefilemakefile を必要とします。WIN32 はただ大文字、小文字だ けが違うこれらのファイルを区別できず、コンフィグレーションは失敗します。

この機能の使用は現時点では推奨はしませんが、`mixed'マウント属性を有効 にすることによって回避することができます(訳注: と原文には書いてありま すが、b18 ではこの機能は動作しない、という報告が GNU-Win32 mailing list の方にありました)。

これが有効になっていると、cygwin32 はファイル名中の大文字、小文字が変 わるところに `^' 記号を入れます。これで FooFOOというファイルを作ることができます。そのディレクトリ内 では、幕の後ろで^f^oo^foo というファイル が作成されています。

あなたが全て cygwin32 上で書かれたアプリケーションの中で生活するのであ れば、舞台裏でどのように名前がつけられるかは問題ではありませんが、しか し cygwin32 と「実生活」とを行き来したい場合には、たぶんこのスイッチは オフにした方が良いでしょう。

もしインストール時にこのスイッチを無効にしていて、その後でこれを有効に すると、いくつかのことができなくなります。例えば、 /usr/include/_G_config.h があって、その後このディレクトリ で大文字、小文字混在のパス名を有効にすると、もはや _G_config.h に辿り着くことはできなくなります。なぜならば、 _G_config.h を要求すると、cygwin32 はこの要求を _^G_^config.h という存在しないものに変えてしまうからです。

この問題は一方を混在モード、もう一方を非混在(通常)モードという二つのディ レクトリツリーにマウントして、それらの間でファイルをお手玉することによっ て回避することができます。でもそうまでして苦労する価値はたぶんないでしょ う。

DLL はどうやって作るの?

gnu-win32 プロジェクトの web ページ (http://www.cygnus.com/misc/gnu-win32)上に、この手順を説明した文書があ ります。

私の古い gnu-win32 プログラムが動かないんです!

ごめんなさい、そういうものなんです。DLL と 全ての gnu-win32 アプリケー ションにリンクされる crt0.o の間には依存関係があります。このインタフェー スはそうしばしば変更されることはありませんが、それが変更された場合には 全てリンクし直す必要があります。gnu-win32 ツールが時を重ねていくにつれ て、再リンクが必要な変更はなくなっていくでしょう。beta 16 と 17 のリリー スでビルドされたプログラムは、beta 18 の cygwin.dll と一緒でも、期待さ れるように動くようになっています。

どうして beta 16 でプリプロセッサのマクロ定義が変わっちゃったの?

このリリースの前は、これらがとても混乱していて、とても「良く」定義され ていました。今は、Win32 API にアクセスするためには _WIN32 、DLL によっ て提供される cygwin32 環境にアクセスするためには __CYGWIN32__ がありま す。

_WIN32 を選んだのは、これが Microsoft が VC++ の中で定義しているもので あり、VC++ のサンプルに従えるようコンパチビリティを持つのは良いことだ と考えたからです。私たちは _MFC_VER を使って VC++ でコンパイルされるべ きコードを指示しています。

暴走しちゃったら、どうすれば戻れるの?

ときたま、これらのツールは単に止まってしまいます(aux.sh というファイル を読んでみると簡単に止められます)。元の世界に戻るには、^C を押して bash か cmd プロンプトに戻ってください。

もし別のシェルを起動していて、それでアプリケーションが動かなかったのな ら、暴走したプロセスがまだどこかで動いてると思った方がいいです。

pview があるのなら、それを起動して kill してください(aux 関係であれば、 アプリケーションは cp という名前になっているかも知れません)。pview か それと同様なものがなければ、おそらくログアウトしなければならないでしょ う。

DOS/Unix の CR/LF 問題はどう処理されているの?

デフォルトでは、バイナリを扱うツール(objdump など)は、unix 風のバイナ リモードで操作し、テキストファイルを扱うツール(bash など)はテキストモー ドで操作します。

テキストファイルモードにおける DOS の CR/LF 改行は、レジストリの fmode-binary を 0 に設定することで有効にできます。私はファイルタイプは 「自然」のままにしようとしてきました。デフォルトではファイルはテキスト モードでオープンされますが、これは open 呼び出しの2つめ の引数に O_BINARY を付け加えるか、 fopen呼び 出しの2つめの引数に"b" を付け加えることによって変更できま す。

lseek は現在はバイナリモードでのみ動作します。

ベースリロケーション情報を持ったファイルを作るには?

LD はリロケーション情報を生成できますが、デフォルトでは生成しません。 現在の構造では、dlltool とリンカのよる別のパスが必要とされ、出力イメー ジは常に大きくなります。

もしリロケーション情報が必要であれば、以下のようなことをしなければなり ません。

gcc -o foo.o foo.c
gcc -o bar.o bar.c

ld -s -o foo.jnk --base-file foo.base foo.o bar.o
dlltool --dllname foo.exe --base-file foo.base --output-exp foo.exp
ld -s -o foo.exe foo.o bar.o foo.exp 

最初のリンクは、どこでリロケーションが必要なのかを探し出すだけのもので、 そのリストを foo.base に作ります。そして dlltool がこれを読み出し、リ ロケーションデータが含まれる foo.exp を生成します。2つめのリンクは再び 全てを一つにまとめあげます。

何が起こってるかをデバッグするにはどうすればいいの?

GDB を使ってあなたのアプリケーションをデバッグすることができます(-g フ ラグをつけてコンパイルするのを忘れないでね!)。問題が cygwin.dll 内部に あるときには、set strace=1 することで、アプリケーションを 実行したときに全てのデバッグ用情報が山ほどスクリーンに表示されます。こ の値は 1で全部をオン、4 でシステムコール表示を有効にする、 などがあります(詳細情報は winsup/include/sys/strace.h を見てく ださい)。

bash を使っているのなら、export STRACE=1 とすることで、 cygwin.dll 内のバグを追いかけるのに有用な syscall 風の詳細な出力が見ら れます。

シンボリックリンクはどう動いてるの?

CYGWIN.DLL はマジックヘッダを持つリンクファイルを生成します。どこかに リンクされているファイルまたはディレクトリをオープンすると、そのマジッ クヘッダに書かれてあるファイルまたはディレクトリをオープンします。

リンカが、何かを見つけられない、と文句を言います。

ありがちなエラーとして、コマンドライン上のライブラリを、それが必要とさ れるものより前に置いてしまうというものがあります。

これは間違い。 gcc -lstdc++ hello.cc
これは正しい。 gcc hello.cc -lstdc++

API の中にある関数を使っているのに、リンクエラーが出ます。

その関数は恐らくヘッダファイルで宣言されていないか、UNICODE 用のものが 入っていないかでしょう。

libc をリンクしている dll を作れますか?

はい。

なぜ、実行ファイルでもないのに `x' 属性を持つファイルがあるの?

ファイルに対して unix スタイルの属性ビットを操作するときは、ライブラリ は WIN32 API で提供されていないいくつかの情報を埋めなくてはなりません。

これはファイル名が .exe か .bat であれば実行可能と判断しますし、またファ イルの先頭文字に "#!" を持つものも同様です。

どうしてあなたは/メーリングリストでは私の質問に答えてくれないの?

それはおそらく、あなたの質問はすでに FAQ の中にあるからです。また、お そらく誰もあなたの質問に答える時間がないのでしょう。あるいは、誰も答え を知らないのかも…。

ネットワーク関連の関数はどう働くの?

cygwin32 におけるネットワークサポートは Unix API の提供を想定しており、 winsock API ではありません。

API 上では同じ名前の関数でも、意味の違う関数が存在します。

例えば、Unix の select システムコールは標準ファイルハンドルとソケット のハンドルに対して待つことができますが、winsock の select コールはソケッ トのみです。このため、cygwin.dll はさまざまな winsock/win32 関数に、無 理矢理 Unix select と同じようなことをさせるために、裏でかなり汚いこと をやっています。

もしすでに winsock を使っているアプリケーションを移植しようとしている のであれば、 cygwin32 のネットワークサポートを使用するには間違っていま す。

しかしそれでもネイティブの winsock も cygwin32 も使うことはできます。 cygwin.dll が export している関数は 'cygwin32_<name>' という名 前です。 たくさんのマクロ定義が、標準の Unix 名から DLL で export され ている名前への関連付けを行っているのです。 include/netdb.h を覗いてみて ください。

..etc..
void		cygwin32_setprotoent (int);
void		cygwin32_setservent (int);
void		cygwin32_setrpcent (int);
..etc..
#ifndef __INSIDE_CYGWIN_NET__
#define endprotoent cygwin32_endprotoent 
#define endservent cygwin32_endservent 
#define endrpcent  cygwin32_endrpcent  
..etc..

これは標準 Unix ヘッダファイルを include すると Unix->cygwin32 の マッピングが行われる、というアイデアです。これを使った場合、 libwinsock.a をリンクする必要はありません。ネットワークに必要な全ての ものは DLL 内にあります。

あなたのアプリケーション用に your-app->winsock マッピングを行う必 要はありません。単に winsock.h を include して(これはディストリビュー ションには含まれません。ごめんなさい)、libwinsock.a をリンクするだけで す。

mywinsock.h ファイルは、標準 winsock.h をハックしたもので、標準 Unix API と衝突するビット値や他のヘッダで定義されていたりするものを削除した ものです。 例えば、mywinsock.h においては struct hostent の定義は削除 されています。これは Unix マシンでは netdb の中にあるものだからです。 これをあなたのアプリケーションで使うのは良いことではありません。

なんでこんな変なディレクトリ構造なの?

どうして cpp.exe、cc1.exe などは bin ディレクトリにはないの?

どうして lib や include ディレクトリが一つじゃないの?

H-i386-cygwin32\lib\gcc-lib\...\cygnus-2.7.2-960712\include
x86-cygwin32\include
x86-cygwin32\H-i386-cygwin32\i386-cygwin32\include

この方法では、違ったホスト、ターゲット間での複数のリリースが、同じツリー の中で共存できます。 H-i386-cygwin32 は、i386-cygwin32 によってホスト されるという意味で、全てのホストで共有される共通ファイルはトップレベル のディレクトリにあり、ターゲット毎のファイルは H-i386-cygwin32/i386-cygwin32 以下にある、といった具合です。

もし ppc NT マシンと x86 NT マシンとでファイルを共有するサーバがあった とすれば、H-i386-cygwin32 と H-powerpcle-cygwin32 の両方のディレクトリ を持ち、トップレベルにある共通のファイルはそれぞれのマシン毎に重複して 持つことはありません。もし i386-cygwin32 と m68k-coff 間のクロスコンパ イラでビルド、インストールした場合には(それが今あるのかどうかは良く分 からないけど、まあ、単なる例として)、H-i386-cygwin32/m68k-aout という ターゲット依存ファイルの入ったディレクトリができて、m68k-aout- のプレ フィックスがついたバイナリがいくつか H-i386-cygwin32/bin にできるでしょ う。

通常、リリースを識別するためにさらに上のレベルのディレクトリを作ります。 もし 複数の gnuwin32 リリースが別々の DLL バージョンとして共存する場合 には、以下のようなディレクトリができるでしょう。

gnuwin32/b16/H-i386-cygwin32
gnuwin32/b17/H-i386-cygwin32
...

どちらにしろ、これはディレクトリ構造をさらに複雑にさせますが、さらに複 雑なインストールを行う人々のためには価値があることです。

msvc++ と gcc でコンパイルされたオブジェクトを混ぜられますか?

はい、おそらく動きます。キーポイントはリンクするのに、 GNU ld ではなく MS の LINK.EXE を使うことのようです。C++/Obj C のコンストラクタに関す る問題があるようです。

random 、srandom 関数はどこにあるの?

これらは cygwin.dll には含まれていないのですが、標準的な GNU の ftp サ イトで入手できるライブラリに含まれています。

シェルスクリプトが Makefile の中からちゃんと動かないんですけど?

$PATH の中に . (ドット)が必要です。Makefile から起動される全てのシェル スクリプトの前にいちいち /bin/sh を付け加える必要はありません。

GNU-WIN32 と CYGWIN32 はちゃんと考えられた上での名前なのですか?

私たちはソースの中では GNU-WIN32 は少しずつ除去していこうとしています。 これは2つのもっともな理由によるものです - a) 全てが GNU のコードではな い。b) WIN32 API を提供しているものではない。

私たちはとりあえず、コンフィグレーションの合言葉として cygwin32 を使っていますが、もっと良い名前があれば変更されるでしょう。

この名前の構成にはちょっとばかり理屈があります。これらのツール一式全部 を `gnu-win32' と呼び、これらが動作するライブラリ、API を Cygwin32 API と呼びます。

V って何ですか?

(`http://www.cs.unm.edu/~wampler/aboutv.html' より抜粋)

V は、異なったグラフィックインタフェースプラットフォーム上でさまざまな アプリケーションを開発するための、汎用 C++ GUI フレームワークです。こ れは、全て最新のインタフェース部品を使った最高水準の商用アプリケーショ ンには向かないでしょうけれども、非常に完成度が高く、カスタムGUIアプリ ケーションの大部分に適しているものです。 V を使って開発されたアプリケー ションは、プラットフォームネイティブの look&feel を持ち、さらにプラッ トフォームを超えた移植性があります。

V では、メニュー、ステータスバー、ツールバー、描画キャンバスなどを持っ たウインドウ、汎用コントロール(ボタン、リスト、ラベル、テキストエント リ、チェックボタン、ラジオボタンなど)を持ったモーダルおよびモードレス ダイアログを含む、ほとんどの GUI オブジェクトをサポートしており、また ポータブルな印刷もサポートしています。

...

V はまた、多くのカスタムアプリケーションを作るためのすばらしいツールで もあります。 これは研究所、小さなカスタムソフトウェアショップ、エンジ ニアリング会社、または個人でも、グラフィカルユーザインタフェースを必要 とするとするアプリケーション開発、特に複数プラットフォーム上での必要が ある人に向いているツールです。その設計のおかげで、V はネイティブの GUI ツールキットよりもとても簡単に学び、使うことができます。また、MFC や OWL のような大きなフレームワークよりも、簡単に学ぶことができます。これ はフリーウェアですが、GNU Library General Public License に基づいてラ イセンスされ、公共の使用のためにソースコードが常に利用できます。

さらなる情報は、以下の V の WWW ページをご覧ください。 `http://www.cs.unm.edu/~wampler/vgui/vgui.html'.

なぜ DJGPP は使わないの?

DJGPP は同じようなアイデアですが、これは Win95 や Windows NT ではなく DOS 用のものです。DJGPP はアプリケーションに対して道理の通った操作イン タフェースを提供するために、"DOS extender" を使っています。GNU-WIN32で は全てのアプリケーションはネイティブ WIN32 なので、その必要はないので す。GNU-WIN32 では全ての Win32 API 関数を呼び出すことができ、Windows の GUI を使ったプログラムを書くこともできるのです。おそらくいつの日か、 GNU-WIN32 は Alpha や MIPS プロセッサ上でも同じように動くようになるで しょう。

DJGPP に関する詳しい情報は以下で取得できます。

`http://www.delorie.com'.

このプロジェクトには誰が関わっているの?

私は Geoff Noer (noer@cygnus.com) です。私は Cygwin32 API ライブラリの 現在の保守者で、公開用 beta のビルドなどを管理しています。私は受け取っ たパッチや質問にはできる限り責任を持つように努力していますが、実際には 私には全てのメールに対して答えることは不可能です。win32 関連のネットワー ク上でのリリース作成やヘルプは私の本来の仕事ではないので、いくつかのこ とには答えられません。ごめんなさい。

Steve Chamberlain (sac@transmeta.com)は、このプロジェクトでの win32 依 存のコードのオリジナルをほとんど書きました。彼は beta 14 までのリリー スを仕上げ、その他の多くの gnu のツールを NT で動作するように移植し、V を gnu-win32 ツールと一緒に動くように移植するなどを行ってくれました。

Doug Evans (dje@cygnus.com) は beta 16 においてパス名を扱うコードを書 き直すのに多大な時間を費やし、その他の数え切れない問題を修正してくれま した。 Jason Molenda と Mark Eichin もまた多くの重要な貢献をしてくれま した。

Kim Knuttila と Michael Meissner は PowerPC への移植に長時間参加してく れています。

そしてこのツールを使って、アドバイス、バグリポート、コード修正といった 形でのたくさんの助力をして頂いた皆さん、とてもありがとう。私たちは本当 に感謝しています!

商用サイトでは、ネイティブ GNU-Win32 ツールと NT/Win 95 上のクロスコン パイラのサポートを、Cygnus より購入することができます。詳細は info@cygnus.com へメールをお送りください。

履歴

著作権(copyrights)はどうなっていますか?

全般的な考え

多くのユーティリティは GNU GPL で保護されており、他のいくつかはパブリッ クドメインであり、その他は Berkeley スタイルの著作権を持っています。こ れでも全部分類しきれてないかもしれません。GNU GPL の「制限」を全うする と、基本ルールは、もし何かのバイナリを配布すれば、ソースも利用できるよう にしなければならない、ということです。

バイナリを配ることにお金を請求することもできますが、そのバイナリを手に した人には誰にでも、ソースをも手に入れる機会を与えなくてはなりません。 また、その人たちには、そのバイナリとソースをさらに他の人に配る権利も与 えなくてはなりません。

ソースコードの winsup サブディレクトリにある Cygwin32 API ライブラリも また、GNU GPL によって保護されています。デフォルトでは全ての実行ファイ ルはこのライブラリをリンクしているので、beta 17 でコンパイルされている ツールもまたこの GPL のもとで配布されるフリーソフトウェアとなり、ソー スコードも全ての人が利用可能です。

ftp サイトのツリーをミラーするのは、何も問題はないはずです -- 単にソー スコードも利用できるかどうかを確認してもらえれば。もしあなたがミラーを するなら、 `noer@cygnus.com' にメールを送っていただけるとあり がたいです。それであなたのミラーサイトが適切なリストに追加されるでしょう。

もしこの中から選択して取り出したい(場合によっては i386 のものではなく PowerPC バイナリのみを運び出したいと思うでしょう)という場合でも大丈夫 です。

GNU GENERAL PUBLIC LICENSE

		   GNU GENERAL PUBLIC LICENSE
		      Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                          675 Mass Ave, Cambridge, MA 02139, USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

		    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

			    NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

		     END OF TERMS AND CONDITIONS

	Appendix: How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
v    Copyright (C) 19yy  <name of author>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) 19yy name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Library General
Public License instead of this License.

Geoffrey Noer noer@cygnus.com

日本語訳への注

この文書の翻訳は Keisuke Mori(ksk@kt.rim.or.jp) が行いました。ただし訳者はこの文書の内容に 関していかなる責任も負うものではなく、また Cygnus に対していかなるサポー トを行うものでもありません。もちろん誤訳の指摘、その他アドバイスなどは 歓迎いたします。

なお、訳文中特に断りなく "DLL"、"(これらの)ツール" などとある場合、ほ とんどはそれぞれ cygwin.dll と、GNU-Win32 の(usertools などの)ディスト リビューションに含まれるツール類、のことを指しています。