MinGW, MSYS 周りの知識整理: 参考までに cygwin について


Git Bash とか、 Windows 上の unix ライクな環境を触っていると、そのうちいくつも同じような mingw とか bash とか shell とかが入ってきてわけわからなくなってきたので、まとめ。

MinGW とは

in a nutshell: gcc for Windows.
Windows 用の exe を生成できるコンパイラ。
生成された exe は基本的にそのまま Windows 上で実行できる。

インストールして、実行できるようになるプログラムは gcc とか ld とか。
コンパイラなので、パスを通せばコマンドプロンプトからでも実行できる、はず。

MSYS とは

unix 風のシェル環境を提供するプログラム群 (make, bash, gawk, grep, etc)

Windows の native コマンド(.exe) の実行

パスが通っていれば MSYS bash から、普通に

javac HelloWorld.java

とかしてやれば実行できる

パス変換

MSYS において、 bash や make など、内部でパスを引数にとって処理を行うようなプログラムに対しては、 unix 風のパスを Windows 用のパスに変換する処理がかかっている様子。しかもこれは強制。

ソース:

MinGW(MSYS)

最小限で unix ライクな環境をセットアップできる構成。しかもインストールがいらない(構成を取れる)

git bash とか

unix 系のプログラムを windows にインストールして、何かしらないけれど bash とかそれっぽい機能がついてたらだいたい MSYS bash。

MSYS build と MSYS executable

MSYS の実行 bin ディレクトリを見ると、 .exe でない、実行ファイルが散見するけれども、おそらくこいつらが MSYS executable. MSYS の上からでしか実行できないプログラム。普通の人はこれを作成することはない。これを作成することを MSYS build という。

ソース: MSYS - MinGW の Build for MSYS

cygwin

POSIX 的な環境を Windows 上で再現しようとする。
機能的なコアは、cygwin1.dllというシステムコールへのラッパ。
利用者視点で見ると、cygwin shell という exe を起動すると、端末が立ち上がって、その中はほぼ POSIX shell。

cygwin の gcc の結果生成されるプログラムは、実行時にランタイムライブラリcygwin1.dllを読み込み、その dll がホストPCの中でプロセスをまたいで、cygwin の環境を構築するので、その中で実行される。

native の実行について

PATH の通った native プログラムは実行できる。その際に、MSYS のように勝手にパスの変換は行わない。(自分で明示的に command substitution でパス変換を記述する必要がある。)

Cygwin, MSYS でのファイルシステムのマッピング