Cygwin と MSYS

Windows に UNIX 風の環境を作りだす Cygwin と MSYS。 どちらも便利なものだが、やはりそれなりの問題も抱えている。 簡単にこの二つの仕組みをまとめて特徴を知っておこう。

Cygwin

Cygwin のコアは cygwin.dll という DLL で、 そこで fork や open や read と言った API を提供しているわけだ。 その Cygwin DLL の重要な機能の一つにパスの変換がある。

違いと言えば「/」と「\」の違い、というのもあるのだが、 まあこれは一対一の置換なのでなんとかなる。 問題は「ドライブ」である。こんなものは UNIX にはないので プログラムの側も全く考慮していないし、ルートディレクトリの 扱いもややこしい。

そこで Cygwin ではどうしたかと言うと、 最初に「Cygwinのルートディレクトリ」を決めて (デフォルトでは C:\cygwin)、その中に独自の ファイルシステムを作ってしまう。 しかしそれではその外にアクセスできないので、 /cygdrive/c が C:、 /cygdrive/d が D: を表す、というように決めた。 これで全ファイルシステムにアクセスできるようになった。 この表現を「Cygwin パス」と呼んでおこう。 以下にいくつかパス変換の例を示す。

Cygwin パスWindows ネイティブパス
/ C:\cygwin
/usr C:\cygwin\usr
/cygdrive/c C:\
/cygdrive/d/usr D:\usr

おおまかに言って問題は二つある。

一つは、変換すること自体である。 あくまでパスを変換するのは Cygwin DLL で、しかも実行時である。 Cygwin DLL をリンクしていないプログラムは Windows パスが直に 見えているから、Cygwin のプログラムと連携するのが難しい。

もう一つは、サブディレクトリに見えるものが 実際は「上」にあることだ。 例えば / から見て /cygdrive/c は 下にあるのに、それは実は C:\ だから上にある。 これは UNIX ではシンボリックリンクを使わないと起こらないし、 そのときは区別ができる。Cygwin 環境ではできない。

MSYS

MinGW も Cygwin と同じようにパスの変換をしている。 しかし fork だの exec だののエミュレーションはしない。 とにかく必要なものだけが動けばいいという立場だ。

MSYS パスの変換の方式は Cygwin とまた違う。 MSYS にもエミュレーションを行う DLL がある (msys.dll) のだが、 その DLL を置いたところが /bin になる。 そして /bin の一つ上のディレクトリが /になる。

また、/bin/usr/bin でもある。 //usr でもある。 とても気持ち悪い。

最後に、各ドライブは /cC:\/dD:\ というようにアクセスできる。

さらにこの他に (MSYSの) /etc/fstab を 使って対応を指定する方法もある。フォーマットは中に 書いてあるので見てみてほしい。ただし MSYS シェルを 再起動しないと効果が出ない。

ビルド環境のまとめ

(ビルド環境)

ちょっと小さかった……。

Copyright (c) 2002 Minero Aoki <aamine@loveruby.net>