A Brief History of the Cygwin Project
Cygwin プロジェクトの簡単な歴史
本ページは Cygwin 本家サイトの 「A Brief History of the Cygwin Project」を翻訳したものです。
行うべき最初のことは、Win32 のネイティブオブジェクトフォーマットを生成/解釈出来るように、開発ツール(gcc、gdb、gas など)の機能強化を行うことでした。
次の作業はツールを Win NT/95 に移植することでした。これはソースの大部分を Win32 API の文脈で動作するように書き換えることでも出来たでしょう。 しかしこれでは、それぞれのツール全てに対して膨大な時間を費やすことになってしまいます。 その代りに我々は、共有ライブラリ(Cygwin DLL)を書くという全く異なったアプローチを取ることにしました。 これは Win32 API に不足しているが UNIX 風の環境には必要な機能(fork、 spawn、シグナル、select、ソケットなど)を追加するライブラリです。 我々はこの新しいインタフェースを Cygwin API と呼んでいます。 一旦これが書かれた後は、UNIX 上のクロスコンパイラを使ってこのライブラリをリンクし、動作する Win32 ツールをビルドすることが可能になりました。
この時点で我々は、Windows NT と 95 上で自分自身を再構築出来るネイティブツールの作成、 という目標を達成しました(これはよくセルフホスティングと呼ばれます)。 どちらの OS にも UNIX の標準ユーザツール(fileutils、 textutils、bash などなど)は付属していないので、 私たちは Cygwin API で動作する同等の GNU ツールを手にしなければなりませんでした。 これらのツールのほとんどは以前はそれ専用にビルドされていたので、 configure スクリプトをクロスコンパイルできるように修正する必要がありました。 その変更以外にも、ごく僅かですがソースレベルの変更が必要でした。 bash が開発ツールやユーザツールと共に正しく動いていれば、 Windows 95 も NT も、GNU configure のメカニズムから見れば UNIX の一種のように見えます。 セルフホスティングは beta 17.1 リリース以降で達成されました。
B20 リリースでコンパイラが EGCS ベースとなり、Cygwin の POSIX 的レイヤに依存しないネイティブ Win32 実行形式をコンパイルすることを可能にするフラグがサポートされました。 デフォルトでは依然として Cygwin ライブラリを使用します。
Beta 20.1 リリース(1998 年 12 月 4 日)
これは Beta 20 リリースに対するバグ修正のアップデートです。
主な変更は Cygwin ライブラリの改善版ですが、ツール類に対する小さな変更もいくつか行われています。
各ツールに対する変更:
gcc の「-mno-cygwin」フラグが正しいヘッダをインクルードするようになりました。 20.0 では、誤って Cygwin のヘッダをインクルードしていました。
gcc の「-pipe」フラグが正常に動作するようになりました。
cygcheck プログラムが cpp を見つけられないのは正しい動作である、 ということをユーザに保証するようにしました。
md5sum の「-b」フラグが、バイナリファイルに対して正しいチェックサムを生成するために使われるようになりました。
コンパイラツールのソースに libtermcap ライブラリが追加されました。 これは termcap ライブラリと /etc/termcap ファイルの新しいソースです。
less ページャ(libtermcap を使用したもの) がバイナリ配布ファイルに含まれるようになりました。
Cygwin API (cygwin.dll) の変更:
このバージョンの Cygwin は、beta 20、19 リリースと後方互換性があります。 Windows 9x 上での動作はより安定したものとなり、9x 上での configure に関するバグ(NT でも多少の影響があった) も修正されました。
CYGWIN 環境変数の値の最初に、 二つのスペースを入れておく必要があったバグが修正されました。
select 呼び出しにおけるシリアルサポートが修正されました。
非 cygwin アプリケーションからロードされる DLL の扱いが改善されました。 dlopen のバグが修正されました。
sysconf 関数に _SC_CHILD_MAX を渡して得られる値が、 _POSIX_CHILD_MAX (3) ではなく CHILD_MAX (63) になりました。
パスに関する小さなバグが幾つか修正されました。 「mkdir a/」が失敗する原因も修正されています。
インクルードファイル sys/sysmacros.h が追加されました。 不足していた wcslen と wcscmp のプロトタイプが wchar.h に追加されました。
__P が include/sys/cdefs.h の中で定義されるようになりました。 この最後の修正をサポートするために、トップレベルの Makefile.in は CC_FOR_TARGET と CXX_FOR_TARGET を個別に設定するようになりました。
Cygwin は、以下の newlib のベッセル関数をエクスポートするようにしました: j1、jn、y1、yn
tty の ioctl オプションがいくつか追加されました: TCGETA、TCSETA、 TCSETAW、TCSETAF
いくつかの関数で、NULL ポインタ参照の対処がよりきれいになりました。
#! を経由した際の相対パスによる実行の問題を修正しました。
Beta 20 リリース(1998 年 10 月 30 日)
これは Beta 19 リリースからの大きなアップデートです。 EGCS ベースのコンパイラや最新版ツールに加えて、このリリースには、前回からの数多くの改良とバグ修正を含む新しいバージョンの Cygwin ライブラリが含まれます。
プロジェクトの名前が新しくなりました!
このリリースから、「GNU-Win32」の名前を引退させることになりました。 また Cygwin32 から「32」を外すことにしました。 つまり、ツール類のことを「Cygwin ツールセット」、 ライブラリを「Cygwin ライブラリ」あるいは「Cygwin DLL」、 ライブラリのインタフェースを「Cygwin API」と呼ぶことになります。
この名前の変更のため、「Cygwin32」という名前に関係するライブラリの外観は全て変更されます。 例えば、CYGWIN32 環境変数は CYGWIN 環境変数になりました。 cygwin32_ で始まる API 関数は、後方互換性のためにこの形でもまだ利用できますし、 同時に新しい cygwin_ 接頭辞付きの名前でも利用できます。 同じことが、プリプロセッサ定義が __CYGWIN32__ から __CYGWIN__ に変わったことについても言えます。 将来のリリースではこの古い名前は削除されますので、 ほんの少しだけ時間を割いて頂き、この「32」を削除して下さるようお願いします。 これによって引き起こされる混乱を皆さんにお詫びいたします。 この名前を「Bob」にしても良かったのですが、その名前はすでに Microsoft に取られていたので… :-) (訳注: 言わずとしれた Microsoft のベイパーウェア「Bob」 に引っ掛けています。訳者の記憶によれば、「Bob」は Microsoft がコンピュータをよりフレンドリに使えるようにするためのソフトウェアとして計画されたはずで、その名称の由来は、 アメリカ人男性の名前として一番ポピュラーなのが「Bob」であるから、というものだったと思います)
なぜ変更したか? 一つには、この配布物に含まれるソフトウェアは、Cygwin ライブラリ自身も含めて、 GNU のソフトウェアではないものがあるからです。 従って、このプロジェクトを「GNU-Win32」と呼ぶことは、常に少しだけ間違っています。 それに加え、「Cygwin ライブラリ」を使うこれらのツールを 「Cygwin ツール」と呼んだ方が、より混乱が少ないだろうと考えたからです。
また、sourceware.cygnus.com という新しい立派な web/ftp サイト上に移った、ということもお知らせしてしておきます。 古いアドレスはしばらくの期間(不定)は有効です(願わくは、少なくとも全てのミラーが修正されるまで)。
各ツールに対する変更:
最新の正式な EGCS リリースが、 Cygwin ディストリビューションで使用される基本のコンパイラになりました。 つまり、x86/Cygwin 関連のパッチがいくつか入った EGCS 1.1 が、このリリースに入っているコンパイラです。
UNIX プログラムの移植よりも Windows ネイティブな開発に興味がある人にとっては、 新しい gcc のフラグ「-mno-cygwin」によって最新の Mingw32ライブラリがリンクされ、 Cygwin を使用しない実行形式が生成出来る、ということは朗報でしょう。
その他の開発ツールは、全て最新のバージョンにアップデートされました。 リンカ(ld)にはたくさんの重大なバグ修正が入っています。 DLL から .reloc セクションを安全に strip することが可能になりました。 windres リソースコンパイラは大きく改善されました。
Beta 20 には、ash-0.3.2-4、bash 2.02.1、grep-2.2、ncurses 4.2、less 332 といった数多くのパッケージのアップグレードも含まれています。 bzip2 0.9.0 を配布に含めました。また、df ユーティリティが fileutils パッケージからの仲間に加わったことにも気がつくでしょう。
sh の実行バイナリは従来通り Debian Linux ディストリビューションからの ash ですが、Beta 19 リリースで問題のあったクォーティングのバグはもう無くなりました。 bash で Control-C を行っても、バックグラウンドの処理を止めてしまうことが無くなりました。
Tcl/tk はバージョン 8.1a2(と追加パッチ)にアップグレードされました。 tix と itcl の互換性のあるバージョンが含まれています。 これらには全て Cygwin 版の configure ファイルも含まれているので、 Win32 版 tcl/tk の UNIX 風の構築を行うことができます。 expect は Cygwin 用追加パッチの入った 5.26 にアップグレードされています。
お客様のご意見とご要望にお応えして、Cygwin は、GDBtk や WinGDB よりもより良い GDB のグラフィカルなフロントエンドを開発しました。 この tcl ベースの GUI は、 GNUPro ツールキットのお客様に対して現在出荷されています。 この GDB に対する変更の仕掛けと GDB に組み込まれた tcl インタプリタは、 GPL ベースのソースの一部です。ですが、 tcl のスクリプトは現時点ではネットワーク上では利用できません。このため、 この Cygwin リリースでは、コマンドラインバージョンの gdb のみしか入っていません。
DJ Delorie が「cygcheck」という新しいプログラムを書いてくれました。 このプログラムは、ある実行バイナリがどの DLL をどこからロードするか、 などといった、Cygwin 環境がどのように設定されているかに関する有用な情報を表示してくれます。 これによって、よくある設定上の問題の診断が簡単になることを願っています。
ps ユーティリティがアップグレードされています。 出力フォーマットを長くしたり短くしたりするなど、 幾つかのオプションがつきました。
Cygwin API (cygwin.dll) の変更:
このバージョンの Cygwin は、beta 19 リリースと後方互換性があります。 古い「cygwinb19.dll」を消してしまい、 「cygwin1.dll」を「cygwinb19.dll」にコピーすれば、 B19 でコンパイルされた古い実行ファイルを新しい 「cygwin1.dll」で使用することが出来ます。
Cygwin の内部では、かなりの部分がさまざまな問題を解決するために書き直されたり、 修正されたりしています。もし何か特定の問題について疑問がある場合は、 開発ツールソースの中の winsup/ChangeLog ファイルに、 過去 3 年間に渡って DLL に施されてきた修正が全て記載されています。 以下に要点をいくつか示します。
Cygwin のバージョン番号付けに新しい体系を使うようになりました。 DLL、API、共有メモリ領域インターフェース、 レジストリインタフェースのそれぞれに個別のバージョン番号がつくようになっています。 これにより、一つのユーザ環境に複数の Cygwin ツール群を共存させることがより簡単になるだろうと思います。
Windows 98 がサポートされています (Cygwin の視点から見れば、 Windows 95 と同じようなものです)。 それでも Windows NT にアップグレードすることをお薦めしますが。
Cygwin の実行速度についてはまだ改善すべきことが数多く残っていますが、 B20 のリリースに先立っていくらか改善の努力を施しました。 恐らく最新バージョンの Cygwin は、今までの中で最速であると思います。 それに加えて、ファイルのオープン/クローズや tty の使用に関連する、厄介なハンドルリークをいくつか塞ぎました。
lseek 呼出しは WriteFile を使うようになり、EOF を越えた書き込みが行われたときのギャップは Win32 の仕様にあるように「未定義」のデータが残されるのではなく、0 で埋められるようになりました。
Cygwin ヘッダファイルを大きく改善する作業が行われました。
UNIX 形式のシリアル I/O 用の Cygwin サポートがより改善されました。
パスの扱いは再度修正され、書き直しが行われています。 デフォルトでは、UNIX のパーミッション/実行状態を格納するのに、NT の拡張属性を使うことは無くなりました。 FAT パーティション上に NT が作成するファイルは、数千のファイルの規模に耐えられないからです(全てがのろのろと遅くなってしまう)。
シグナルの扱いについてもかなり注目するものがあります。しかし残念ながら、タイマと Windows 9x の組み合わせではまだ幾つかの問題が残っています。
tty の数は 16 から 128 に上げられました。
DLL に含まれた新しい API: sethostent、endhostend
既に述べたように、cygwin32_ の接頭辞のついた関数は全て cygwin_ の接頭辞付きでエクスポートされるようになっています。 あなたのプログラムを、この新しい名前の関数を呼び出すように調整して下さるようお願いします。
「遅い」デバイスの read において signal が正しく制御されるようになりました。 すなわち、read は EINTR を返します。
Beta 19 リリース(1998 年 2 月 26 日)
これはメジャーリリースです。これには更に新しいバージョンの Cygwin32 ライブラリが含まれています。 Cygwin API の互換性が失われるような変更が行われたので、dll の名前は cygwinb19.dll に変更されました。 以前に作成された実行プログラムを無効にしないようにするためです。
B19 でコンパイルされたアプリケーションが B18 でコンパイルされたアプリケーションを exec() するときは、B18 でコンパイルされた実行プログラムは普通の Win32 実行プログラムとして扱われることに注意してください。 これはつまり、オープンしたファイルディスクリプタやその他の内部データは exec() 呼び出しにおいて継承されないということです。 この理由は、Cygwin ライブラリのバージョンの違いによって違った共有メモリ領域が使用されるからです。 これはあなたが行おうとしていることによっては重大かも知れませんし、そうでないかも知れません。
Cygwin32 ライブラリの Beta 19 リリースは、引き続き GNU General Public License(GPL) に従ってライセンスされます。
コンパイラツールで使用される PE 形式の定義は、Microsoft のものにより近くなりました。 これによって他のベンダの開発ツールとの間での共同利用がより可能になるでしょうが、 しかしおそらくこの領域についてはまだまだやるべきことが多く残っているでしょう。 この変更によって、以前作成されたオブジェクトファイル(.o) やスタティックライブラリファイル(.a)が使えなくなりますので、 必要なものは忘れずに古い .o と.a ファイルを消して作成し直して下さい!
最後に、古いシンボリックリンクはこのリリースで無効になります。 シンボリックリンクの印として「system」属性が使われるようになり、 fstat と他のファイル関連の呼び出し速度が非常に向上しました。 古いシンボリックリンクを作り直すか、あるいはそれらの 「system」属性フラグをセットすれば、正しく認識されるようになるでしょう。
新しいインストーラは、 program files のショートカットをインストールすることで全ての環境変数の設定を自動的に行います。 このショートカットは全ての環境変数を正しく設定して bash プロンプトを立ち上げます。 この結果、セットアップ処理は前回のリリースよりもよりきれいになりました。
最終的にはツールを移動させる人のために、デフォルトの環境変数を設定するバッチファイルが、 cygnus.bat という名前でインストールディレクトリのルートにインストールされます。 ツールは/cygwin/b19 にインストールするようにコンパイルされているので、 この場所にインストールしたときは、 bin ディレクトリがパスに入っていれば各ツールは 「それだけで動く」はずです(特別な環境変数は何も必要ありません)。 唯一の例外は、MAKE_MODE で、これは通常の UNIX 風の make の動作をさせたい場合に設定する必要があります - さらに詳しくは以下の make のノートを参照して下さい。
各ツールに対する変更:
Ian Lance Taylor によって、「windres」というリソースコンパイラが書かれました。 これは Windows リソースを、テキストの rc ファイルから COFF ファイルにコンパイルするために使用されます。ソースは binutils サブディレクトリの中にあります。
多くのユーティリティがバージョンアップされました。 Beta 19には bash 2.01.1、fileutils 3.16、gawk 3.0.3、patch 2.5、 shellutils 1.16、 tar 1.12、textutils 1.22、texinfo 3.11 が含まれます。 Cygwin32 上の bash では、数ある改良の中での特筆点として、ジョブコントロールが動作するようになりました。
sh の実行プログラムは、 Linux の Debian ディストリビューションの ash 0.2 になりました。このより小さくなったシェルを /bin/sh.exe として使うことで、 configure が大きくスピードアップします。
Bison 1.25 が追加されました。
Tcl/Tk はバージョン 8.0 にバージョンアップしました。 互換性のあるバージョンの tix と itcl が追加されました。 これらは全て Cygwin32 コンパチブルな configure ファイルが含まれていて、Win32 版の Tcl/Tk を UNIX 流の方法でビルドできます。
Expect 5.21.3 が含まれ、基本的には動作しています。
バイナリは Pentium ベースのシステムで速度が向上するよう i686 最適化をオンにしてコンパイルされていますが、i386 以降のチップでも動作するはずです。
リンカ(ld)が強化されました -- dll をリンクする際、idata3 ターミネータが自動的に追加されるようになりました。
kill はシグナルの名前の引数をサポートするようになりました。 ps はプロセスの開始時間情報を表示するようになりました。
デフォルトのツールのインストールでは詳細は隠されますが、make ユーティリティのデフォルトは Win32 モードになりました。 これはサブシェルとして cmd.exe/command.com を使うというモードです。 このモードではファイル名にバックスラッシュが使えます。 UNIX プログラムをビルドするには MAKE_MODE 環境変数を「UNIX」に設定する必要があります。 こうすることでサブシェルに sh.exe を使用する従来の振る舞いになるでしょう。
Cygwin32 API (cygwin.dll) の変更:
インタフェースがより明確になりました。libc、libm と UNIX 互換関数が含まれています。 libgcc.a の外部名は含まれません。 これによってより安定したインタフェースになるはずです。 インタフェースのドキュメントは calls.texinfo を参照して下さい。
dll 全体の振る舞いを制御する環境変数は、CYGWIN32 という変数一つだけになりました:
set CYGWIN32=[no]title [no]strip_title [no]binmode [no]glob strace=mask:cache,file [no]tty
「set CYGWIN32=title tty」と設定すれば、tty のサポート(以下参照) を行い、現在の実行プロセスをタイトルバーに表示します。
B19 では以下のサポートが追加されています:
- tty と仮想 tty デバイス。今のところ、tty はデフォルトではオフです。 コンソールを取得するのは、Cygwin コンソール内で Cygwin ではないコンソールプログラムを使用するときに問題を引き起こすからです。 これをオンにするには、環境変数 CYGWIN32 に「tty」を含むように設定します。
- ハードリンク(NTFS ファイルシステム上の NT が必要)。 使用不能のときは(NTFS 以外のファイルシステム上では)、 link() は以前のリリースで行っていたように当該ファイルのコピーを作ります。
- SIGWINCH シグナル。tty 制御が有効のとき、 プロセスは画面サイズが変更されたときに SIGWINCH シグナルを受け取ります。
- 端末エスケープシーケンスの追加: <ESC>[n1;n2r によるスクロール領域の設定と、 xterm のエスケープシーケンスを使ったコンソールタイトルの設定: <ESC>]2;newtitle^G 。
以下の関数が追加されました:
- ptsname, grantpt, unlockpt
- login, logout, ttyslot, ctermid
- cfgetispeed, cfgetospeed, cfsetispeed, cfsetospeed
- setitimer, getitimer, ftime, tzset
- wait3, wait4, pause, sigpause
- getpgid, killpg, setegid (stub)
- strlwr, strupr
- sexecve, sexecl, sexecle, sexeclp, sexeclpe, sexecv, sexecp, sexecvpe
- rcmd, rresvport, rexec
- strsignal, strtosigno
- dlopen, dlsym, dlclose, dlerror
- inet_netof, inet_makeaddr
- socketpair
- fpathconf, realpath, chroot (stub)
- initgroups (stub), getgroups
- random, srandom
以下の関数は削除されました:
- ScreenCols, ScreenGetCursor, ScreenRows, ScreenSetCursor
- getkey, kbhit
- crypt (stub)
- 全ての libgcc.a エクスポート
WinSock dll(wsock32.dll)はもはや Cygwin32 DLL に暗黙のうちにリンクされません。 代りに、プロセスが Cygwin32 のネットワーク関数を最初に呼び出したときに、LoadLibrary によって明示的にロードされます。 これによって多くのプロセスはかなりスピードアップします(configure で約 20%)。
シグナル関連のコードは一から書き直されました。パスを扱うコードのほとんども同様です。
ファイル名展開(globbing)と getopt のコードは BSD 派生のコードに置き換えられました。 正規表現のコードは Henry Spencer の Public Domain な実装に置き換えられました。
Doug Lea の malloc が cygwin から公開されるデフォルトの malloc として使用されるようになりました。 この malloc はスピードとコンパクトさのバランスを非常にうまくとっていますが、 しかしすでに free されているメモリを free しようとするのを許してくれません。 すなわち、セグメンテーション違反を引き起こします。
bsearch 関数は書き直されました。
Alt Gr キーの動作がこのリリースで変更されました。 左 alt キーは今までどおりESC キーシーケンスを生成します。 右 alt(Alt Gr) キーは国ごとのキーボードレイアウトに従った文字が生成されるようになりました。
CYGWIN32 環境変数に「title」を含めない限り、プロセスはタイトルバーに名前を表示しなくなりました(上記参照)。
複数の cygwin.dll は、それらが同一(同時にビルドされたもの)でない限り、同じメモリ空間を使わなくなりました。 これによって互換性のない共有メモリの使い方をする複数の DLL を同時に走らせることができます。 これはバグありの cygwin.dll をデバッグする機能でもあります。 最新の cygwin.dll をシステム上に一つだけ残すようにすれば、全ての cygwin プロセスが同じ共有メモリ空間に存在するということが保障されるでしょう。
/ のマウントのデフォルトはもはや C: ではありません。 システムドライブ(OS がインストールされているドライブ)がデフォルトになりました。
標準のダイナミックライブラリローダ関数 dl* が利用できるようになりました。 Cygwin32 B19 は fork の後に正しくデータをコピーし、親プロセスにロードされていた DLL を自動的に再ロードするようになりました。 更に、DLL はロードされるときに正しく初期化され、グローバルコンストラクタが呼ばれるようになりました。 グローバルデストラクタは DLL が detach されるときに呼び出されます。 親プロセス中で dlopen や dlsym によって得られたハンドルは、fork された子プロセスの中でもアクセス可能です。 LD_LIBRARY_PATH 環境変数が dlopen 検索に使用されます。
cygwin32 で作成された .dll 内では <cygwin32/cygwin_dll.h> ファイルをインクルードし、これらの関数を使用する .dll を作成するには DECLARE_CYGWIN_DLL (dll-entry-point) 行を使用してください。
Beta 18 リリース(1997 年 5 月 6 日)
これはメジャーリリースです。新しい cygwin.dll は以前リンクされたアプリケーションとの後方互換性がありますが、内容は大きく変わっています。
インストール処理が完全に変更され、InstallShield5 ベースのインストーラを使うようになっています。 これにより過去に経験した数々のインストール時の問題を減らしてくれます。 しかしながら、配布ファイルに付属している README.txt で説明されているように、環境変数は未だに手で設定する必要があります(将来の gnu-win32 インストーラには、これを自動的に行う機能を持たせるかもしれません)。
各ツールに対する変更:
fork() の代りに spawn() を使うことによって、GCC のコンパイル時間が 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) の変更:
以下がサポートされています:
- UNC パス
- コンソールモードの逆インデックスエスケープ (訳注: すみません。訳者はこれが何を指すのか分かっていません。どなたかご教示下さい)
- socket と handle が組み合わされた select() のブロッキング
- ディレクトリのシンボリックリンク
- 子プロセスの、親プロセスの変更
以下の関数が追加されました:
- mmap()、mprotect()、msync()、munmap()。これらをサポートするように、fork() も変更されました。
- fsync()、statfs()、fstatfs()。
- getprotobynumber() and getservbyport()。
- get_osfhandle()、cwait()。
- spawnl()、spawnle()、spawnlp()、spawnlpe()、spawnv()、spawnve()、spawnvp()、spawnvpe()。
- nice()。
- sigpending()、sigsuspend()。
- NT でのみ chown()、getgrgid()、getgrnam()、endgrent()、getgrent()、setpwend()、getpwent()、endpwent()。 Win95 ではまだ、これらは全てスタブとなっています。
かなり改善されたシグナル及び例外ハンドラがサポートが追加されています。 kill シグナルはかなり良く働くようになりました(bash で Ctrl-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 までの長さを取ることができます。
Beta 17.1 リリース(1996 年 12 月 10 日)
Win 95 で configure が動くように、再びパッチが適用されました。
ld はデフォルトの実行ファイル名として「a.exe」を作成するように変更されました。
Beta 17 リリース(1996 年 12 月 7 日)
Cygnus Developers' Kit (CDK) と User Tools の両方を全て正しくインストールすれば、 x86 NT 上のツールをネイティブにリビルドすることが可能になりました。
cygwin.dll に大掛かりな変更が行われたにも関わらず、 以前にビルドされたアプリケーションを使うことを妨げるものは何もありません。 新しい DLL は私たちの知る限り、beta 16 と互換性を持っています。 beta 14 でビルドされたプログラムはやはり beta 17 の DLL でも動かないので、 それらを動かすためには再リンクする必要があるでしょう。
Cygwin32 API を形作る winsup ファイルは GNU General Public License のもとに置かれるようになりました。 詳細は添付のプレスリリースを参照してください。
各ツールに対する変更:
gcc はデフォルトで -lkernel32 をリンクし、また mwindows がセットされたときは -luser32 -lgdi32 -lcomdlg32 がリンクされるようになっています。その他の重要な変更として、実行プログラムを作るとき、-o の引数に foo を与えると foo.exe を作成するようになりました。
dlltool には、オプションの中でコンソールか GUI かの選択を行う --subsystem の扱いを良くするパッチが入っています。 ld はスタックの予約サイズを大きく取るように変更されました。 これは NT 上でのネイティブなツール群をビルドするのに必要となります。
C++ のヘッダは正しく設定された GCC_EXEC_PREFIX 環境変数によって与えられます。
fileutils と make の新バージョンが含まれています。findutils が追加されました。
Cygwin32 API (cygwin.dll) の変更:
Scott Christley による標準 Win32 DLL 用のヘッダ、def ファイルが統合されました。以前の Cygnus ヘッダでのみ提供されていたものはすべて適切な場所に追加されました。 私たちのヘッダから抜き出して作った標準 Win32 ヘッダ名の管理ファイルがあるので、 ある特定のヘッダファイルをインクルードしようとしているプログラムも動作します。 より完全なヘッダを持つことで、Win32 のネイティブプログラミングが簡単になりました。
select は一から書き直されました。 新しいものは全てのソケットと全てのハンドルを扱うことができます。 タイムアウト付きのハンドルどソケットはまだ実装されていません。 select はブロッキングを行うようになり、CPU を働かせません。
ファイルハンドル処理は大きく書き換えられました。 fhandler 配列は共有メモリの中ではなく、ローカルメモリの中に移動しました。これはいくつかの振る舞いを改善します。 このサポートのために大きな変更がありました。ansi/vt100 のコンソールサポートがかなり完全なものとなっています。 いくつかの新しいファイルロッキングがサポートされました。矢印キーがサポートされました。
プロセス制御がさらに改善されました。
fork() の重大なバグが修正されました。
system() 呼び出しが動作するようになっています。
unlink() はファイルを削除しようとする前に、読み出し専用のファイルを書き込み可にモードを変更します。 これにより、rm が読み出し専用ファイルに対して何度も「out of queue slots」というメッセージを出して削除できなかった、という未解決の問題が修正されます。
テキストモード読み出しが書き直されました。
新しい syslog によって、NT 上ではイベントログへ、Win 95 ではファイルヘログを取ることができます。
シンボリックリンクが有効です。
readv() と writev() が実装され、公開されました。
MS との互換性のために、DLL からの関数の export を、funcname に加えて _funcname として export します。 この事実を利用しないように提案します。但し、既にこの方法で C ライブラリをアクセスするようになっているコードをビルドする場合はこの限りではありません。
ほとんど全てのソースコードは C++ のファイルになっています。
Beta 16 リリース(1996 年 8 月 30 日)
パス名の扱いは完全に書き直されました。 bash で Q: ドライブを参照するには、//q/ で参照できるようになりました。 もしくは、"mount Q: /q" とタイプすることで、Q: ドライブが /q として見えるようになります。
Windows 95 と NT 4.0b2 上で、i386 の Plum Hall positive C 適合試験にパスしました。
fork は以前は DLL 内からはアクセスは出来ませんでした。 もはやそんなことはなくなり、既に動いているシステムや popen コールを追加することができます。
getdomainname は、レジストリからの情報を取得して動作します(以前は単に「cygnus.com」を返していました)。
readdir で errno が正しくセットされないバグが修正されました。 これによりディレクトリをまたがった diff が動かない問題が修正されました。
シグナル関数内でのエラーチェックが改善されました。 WinSock の初期化は cygwin32_socket 内で checkinit を呼ぶことで行われます(これは、最初にこの処理を行う関数を呼ぶ必要があったというバグを修正します)。
新規関数: sigaddset, sigismember, sigfillset, sigemptyset
sysdef ファイルにあった余分なアンダースコアを取り除きました。
cygwin.dll に関連付けられるメジャーおよびマイナーバージョン番号が出来ました。 メジャー番号は互換性のなくなる変更が行われたときのみ変わり、マイナー番号は、古いアプリケーションの再リンクを必要としない程度の、何らかの変更が DLL に対して行われたときに変わります。
include/sys/param.h の中の HZ の値を正しい値 1000 に変更しました (「time sleep 5」が 50 を返す、と言われていたバグが修正されます)。
i386 と ppc プロセッサの両方で、様々な例外処理が修正されました。
Cygnus Kerberos を動作させるために必要な time 関連がいろいろと修正されました。 time 用新規関数: gmtime, corelocaltime
spawn と fork に様々な修正が行われました。
仮想 UNIX プロセス処理が追加されました。 新しく ps と kill コマンドが追加されました。
Control-Z は、テキストモードでオープンされたファイル中では、 正当な EOF 文字として扱われるようになりました。lseek はバイナリモード中でのみ動作します。
select が改訂されました。
その他様々な変更がありました。更に詳細な情報は、ソースコードの winsup/ChangeLog ファイルを参照して下さい。
プリプロセッサのマクロ定義の構成が変更されました。 アプリケーションが Win32 API へのアクセスのチェックを行うためには __WIN32__ ではなく _WIN32を、また Cygwin32 環境の存在のチェックには __CYGWIN32__ を使わなくてはなりません。
GNU findutils、GNU dbm、GNU bison、GNU less、ncurses、ftp、finger、rcl、 cvtres、V はもはや含まれません。 これは将来変更されるかもしれませんが。
以前のリリースでビルドされた古いアプリケーションは、新しい cygwin.dll と再リンクする必要があります。
Beta 14 リリース(1996 年 4 月 10 日)
幾つかのバグが修正されています。GDBM と m4 がリリースに入っています。 GCC は cc1 などのために標準インストールディレクトリを使用するようになります。
gnu-win32 版 V が含まれました。これで UNIX と Windows の両方で変更なしに動作するグラフィックアプリケーションを書くことが出来ます。 V の一部は PPC でも動作します。
標準の DOS シェルからプログラムを実行した場合、DLL はコマンドライン引数にある全てのワイルドカードを展開します。 従って ls *.exe は、bash からでなくとも意図通りに動きます。
ncurses と less が含まれました。DLL の vt100 エミュレーションは完全ではないため、ncurses は全て正しくは動作しません。 そのため、less は多少役に立ちません。(訳注: 原文は「Hence less is more or less useless.」) これは新しい DLL で修正されるかもしれません (curses を利用するものを使用する場合には、TERM 及び HOME 環境変数を設定するのを忘れないでください)。
main を省略すると、ライブラリは WinMain を通常の方法で呼び出そうとします。
Windows 95 上での^ C の動作が大きく改善されました。 これはまだ完全に正しくはありませんが、少なくとも殆どの場合は今の作業を中断し、殆どの場合にマシンをクラッシュさせません。
bash のセッションを 2 つ以上並行して開始することが出来ます。
幾つかのネットワークのサポートが追加されました。 telnet.exe が提供されているにも関わらず動作しないことは分かっていますので、バグ報告は送らないで下さい。
新しい DLL で動かすにはアプリケーションを再リンクする必要があるでしょう。
DLL はそれ自身の .zip ファイルでもリリースされていますので、その他のものが必要ない場合、他の全てをダウンロードする必要はありません。
Beta 13 リリース(1996 年 2 月 9 日)
レジストリが変更されていなければ、ファイルはバイナリモードで開かれます。
「cat >foo <<EOF」のバグが修正されました。
シンボリックリンクの扱いが変更されました。古いリンクはもう使用できません。
二つのリソースツールが提供されました(テストされていません)。
更なる Windows ヘッダファイルが提供されました。WxWindows はぼぼコンパイル出来ます。
「/dev/fd0」又は「/dev/fd1」によって、raw モードでフロッピーディスクを扱うことが出来ます。
大文字/小文字の違いだけで綴りは同じである二つのファイル名が、同じディレクトリ内に存在可能です。
現在の stat はディレクトリ用の st_nlink フィールドを埋めますので、よりよく動作します。
このバージョンは過去のどのバージョンよりも安定しており、NT マシン上で NT に対する configure とビルドが出来るまでになりました。
このバージョンでは PowerPC バージョンも利用可能です。 PowerPC コンパイラはスタックの検査を行いませんので、幾つかのアプリケーションは動かないか、幾つかの入力データに対して動くだけです。 例えばデモの「hello world」はコンパイル出来るでしょうが、gcc は dhrystone ベンチマークのコンパイル中にクラッシュするでしょう。
ツールが(O_TEXT を上書きしない限り)常にファイルをバイナリモードでオープンするか、 (O_TEXT を上書きしない限り)常にファイルをテキストモードでオープンするかを指定する、 新しいレジストリ値「fmode=binary」が追加されました。
ファイルシステムは mixed_case フラグを使ってマウント出来ます。 これは同じ綴りで大文字/小文字が異なるファイルが同じディレクトリに存在することを許可します。
提供されたパッケージのうち幾つかはテストされておらず、使われてさえいません。 それらをコンパイルし、明らかな「ファイルはバイナリモードでオープンされるべき」問題を修正しました。
既に Windows 95 では正しく動作しないとの報告を受けています。 Windows 95 のコンフィグレーションを行うための簡単な方法は持っていませんが、「手元では動作する」ことは確認しました。 これは NT 上でときどき bash がハングするバグについての他の明らかな兆候かもしれません。
Beta 12 リリース(1996 年 1 月 3 日)
bash から非 gnu-win32 アプリケーションを実行出来ます。
mount コマンドを使って、別のディレクトリをマウント出来ます。
最低限の ANSI 端末エミュレーションが含まれました。
パッケージがより小さく、論理的なまとまりに分割されました。
/d<name> 機構はなくなりました。
PowerPC に対する最初のサポートが追加されました。
Beta 11 リリース(1996 年 1 月 3 日)
ftp サイトへの途中で何かが壊れてしまいました。
Beta 10 リリース(1995 年 12 月 5 日)
bash 内で環境変数を渡すことが出来ます。
多くのものがあらかじめコンパイル済みで提供されました。
標準の FSF リリースとの diff が提供されました。
セルフホストが可能です。
シンボリックリンクをサポートします。
ディレクトリレイアウトがより UNIX 風に変更されました。
c 以外のドライブへのアクセスする方法が新しくなります。
i:\foo.cc が /di/foo.cc になります。
fork の厄介なバグが見つかり、修正されました。 CPP は環境変数で与えたディレクトリを検索するようになりました。
Beta 9 リリース
libc と libm を全て共有ライブラリ内に入れました。 これで幾つかのバイナリのサイズは極端に小さくなります。 例えば、ls は 82,949 バイトから 26,624 バイトになります。「Hello World」は 2564 バイトの大きさです。 これは舞台裏で行われているものに対する大きなスピードアップの第一段階です。
異なるプロセス同士は共有メモリを使って通信します。
レジストリをほんの少しだけ使います。
DLLTOOL が「とても」速くなりました。
DLL を割り付けた際の小さな問題が幾つか修正されました。
Beta 8 リリース
GDB が動作します。
GCC がデバッグ情報を生成するようになりました。 これは「非常に巨大な」実行ファイルを作り出します。幸運なことに strip も動作しますが。
クォーティングを動作させるために、更なる作業が行われました。
termios の簡単なサポートが newlib に追加されました。
パスの表現に更によい方式を取ります。 例えば //c/foo は c:\foo のことです。
Beta 7 リリース
再び Win 95 で動きます(これが Beta 6 が宣伝されなかった理由)。
パーミッションはよりうまくごまかせるようになります。
Win32 のバイナリツリー全体を ftp しなくとも、デモのソースが入手可能になりました。
Beta 6 リリース
DLL を作成できるようになりました。小さなデモが含まれています。 tcl、byacc、fileutils、diff、make が含まれています。
Beta 5 リリース
最近のバージョンの Win95 上での動作を妨げるものを全て修正しました。
vfork と exec の変なところが修正されました。
Import ライブラリはただの .o ファイルではなく、本当のライブラリになりました。
gdb が動くようになるまではただの無駄ですので、バイナリイメージとライブラリからデバッグ情報が取り除かれました。
4 つの主要な import ライブラリを書き入れました。
win*.h ファイルは <foo>/include/sys ではなく、<foo>/include にインストールされるようになりました。 これで箱から出してすぐコンパイル出来るものが増えるでしょう。
Beta 4 リリース
PE のサポートが修正されました。 プログラムは NT 3.1、NT 3.5、NT 3.51、Windows 95 上で動作します。
GUI プログラムを作成できます。
他の三つの DLL の .DEF ファイルが開始されました。
新しい GUI のデモプログラム。
C ライブラリはテキストファイルとバイナリファイルを区別します。 従ってツールによって生成されたテキストファイルには、DOS が大好きな、見慣れた ^M が行末の入ります。
Cygnus の Doug Evans は、execve、opendir、 その他様々なすごいことについて、素晴らしいサポートを数多く追加しました。
例外処理が改善されました。
Beta 3 リリース
あまりに古すぎるため、覚えていません。