このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Mingw-w64/MSYS2 を入れなくても Git for Windows で間に合うみたい

長年MinGW/MSYSを使い続けているのですけど、最近あまりアップデートされません。例えば、bashは9年前のversion 3.1のままです。世間ではversion 4.2, 4.3が使われているのに。

MinGW/MSYSの後継らしきMingw-w64MSYS2の組み合わせに替えようかと思ったのですが、Git for Windowsがあれば十分な気がしてきました。

内容:

MinGWとMSYS

MinGWとMSYSは一緒に使っている人が多いと思いますが、目的が異なる2つのシステムです。MinGW/MSYSとよく比較されるCygwinは、単一のシステムとしてWindows上にPOSIX環境を実現するものです -- 目的も方式も明快です。これに対して、MinGW/MSYSはちょっと分かりにくい構成になっています。

MinGWWindowsで使えるコンパイラ・ツールキットなんです。gcc, g++、リンカ、アセンブラ、デバッガなど一式です。コマンドラインツール群なので、cmd.exeから直接使っても、IDEのバックエンドに使ってもかまいません。CygwinからMinGWを使うこともできます。コマンド名が「Cygwingcc」とかぶるので、mingw32-gcc, i686-w64-mingw32-gcc なんて別名も準備されています。

もう一方のMSYSは、ユーザーが対話的に使うPOSIXシェル環境を提供します。bashと、さまざまなユーティリティコマンド群からなります。MSYSを使えば、Unix/Linux上のシェルスクリプトが(多くの場合少しの修正で)Windows上でも実行可能となります。

Microsoft Visual C++コマンドライン版の代替となり得る開発ツール」がMinGW、「PowerShellの代替となり得る高機能シェル」がMSYS、と思えばいいでしょう。

開発ツールであるMinGWを、シェル環境MSYSから使う場合が多いのは確かですが、どちらか一方だけをインストールして使うこともできます。例えば、コンパイラが必要ない人はMSYS(bash環境)だけを利用できます。

ディレクトリレイアウトとPATH環境変数

現在のMinGW/MSYSは、パッケージマネージャmingw-getを使ってインストール/アップデートします*1http://sourceforge.net/projects/mingw/files/ からmingw-getのインストーラーであるmingw-get-setup.exeを入手すれば、ここからブートストラッピングして希望のシステムを構成できます。例えば、msys-baseパッケージを導入すればMSYSシェル環境が手に入ります*2

MinGWがインストールされたディレクトリを$MinGWとすると、標準的な構成では:

  • $MinGW\bin\ に開発ツールのコマンド群が入る。
  • $MinGW\msys\1.0\ の下にMSYS一式が入る。

ただし、MSYSのディレクトリは自由に選べる(例えば、C:\MSYS)ので、以下では$MSYSと記します。

MSYS環境内では、Windowsディレクトリ$MSYSがルート(/)に見えます。Windowsのドライブは、/c、/d のようなディレクトリとしてマウントされます。それ以外に、/etc/fstabの記述によりマウントが行えます。MSYSからMinGW開発ツールを使うときは、$MINGWを/mingwにマウントするのが習慣です。こうすると、/mingw/msys/1.0/ が再びルート(/)に戻る循環構造ができますが、特に問題はありません。

PATH環境変数は、Windowsのものがそのまま引き継がれます(C:\Windows → /c/Windows のような変換は受けますが)。/usr/local/bin, /usr/bin, /bin (場合により /mingw/bin)などがMSYSによりPAHTの先頭に追加されます。これにより例えば、/bin/find が C:\Windows\System32\find.exe より優先されるようになります。

Mingw-w64とMSYS2

MinGWコンパイラは32ビットバイナリしか生成できません。64ビットバイナリも生成可能なWindows向けGCCとしてMingw-w64があります。また、より新しいバージョンのGNUソフトウェアをベースにしたMSYS2があります。

Mingw-w64とMSYS2を新たにインストールしようと思ったのですが、待てよ、と。Git for Windowsが、Mingw-w64/MSYS2を含んでいるんですよね。これをそのまま使えばいいんじゃなかろうか。

Git for Windowsコンパイラなどの開発ツールは入ってませんが、これは従来の32ビットMinGWでいいだろう、と。また、64ビットGCCにはTDM-GCCという選択肢もあって、TDM-GCCのほうが使いやすそうです。GCCに拘らないなら、MicrosoftVisual Studio Communityもありますし。

[追記]TDM-GCC入れてみました。 tdm64-gcc-5.1.0-2.exeをダウンロードすると、これが最初のインストールも、後からの構成変更(コンパイラ/関連ツールの追加や削除)もやってくれます。シンプルで使い勝手がいいですね。[/追記]

Git for Windowsのシェル環境

結論から言うと、Windows環境変数をわずかに修正するだけで僕の目的は達成できました。

Windowsのレベルで、$Git\usr\bin が $MSYS\bin(従来のMSYS) より前に来るようにPATHを設定しただけです。bash起動をアイコンからに限定するならこの作業さえ必要ありません(何もすることがない)。

結果的にはやることがないのですが、「何もしなくても大丈夫だ」と納得するためにGit for Windowsの構造を調べました。それについて記しておきましょう。

Git for Windowsは、MSYS2+αなのです。「+α」部分はもちろんWindows向けに調整されたgitコマンドです。MSYS2のコマンド群(bashやlsなど)は全て$Git/usr/binに入っています。Git for Windows特有のコマンドは次のものです。

  • $Git/ に git-bash.exe, git-cmd.exe
  • $Git/bin/ に bash.exe, sh.exe, git.exe
  • $Git/cmd/ に git.exe, git-gui.exe, gitk.exe, start-ssh-agent.cmd
  • $Git/mingw64/bin/ に git.exe, curl.exe など

bash.exeやgit.exeがアチコチに複数あって不安になったのですが、次のようなことみたい。

  • Windowsユーザーに対して、$Git/git-bash.exe または $Git/git-cmd.exe がGit操作用インターフェイスを提供する。
  • $Git/git-bash.exeは、bashを実行する。$Git/git-cmd.exeはcmd.exeを実行する。
  • ($Git/git-cmd.exeはどうでもいいとして)$Git/git-bash.exeは、新しいコンソールウィンドウ内で$Git/bin/bash.exeを起動する。
  • $Git/bin/bash.exeは、環境変数MSYSTEMをMINGW64に設定して、$Git/usr/bin/bash.exeを起動する。

環境変数MSYSTEMをMINGW64にセットするのは、bashのスタートアップファイルである/etc/profile内で、PATHに /mingw64/bin を追加させるためです。gitコマンドの本体は /mingw64/bin/git.exe なのでこれが必要です。

ところが、「WindowsにおけるGit利用環境は整った: Git for Windows と SourceTree for Windows」で説明した方法でGit for Windowsをインストールしておけば、PATHに$Git/cmd/が入っており、$Git/cmd/git.exeを経由して$Git/mingw64/bin/git.exeを起動できます。

結局、ラッパーである$Git/git-bash.exeや$Git/bin/git.exeは無視してもよくて*3、直接に$Git/usr/bin/bash.exeを起動してもいいのです。bashが必要とする /user/bin, /bin などは/etc/profileで追加されます。他のシェル(cmed.exe、PowerShell)からlsしたりbashを起動するため、という理由で、Windowsレベルで$Git\usr\binをPATHに追加しておいたほうが便利、というだけです。

まとめ

何もしなくていい割にはゴチャゴチャしているので事情をまとめておきます。

  • cmd.exeやPowerShellからbash, lsなどのMSYSコマンドを使いたい場合: Windows環境変数PATHに$Git\usr\binを加える。
  • ショートカットアイコンやフルパスでbashを起動して使う場合: 起動するプログラムとして$Git\usr\bin\bash.exeを指定する。/etc/profile と ~/.profile を実行させるには --login オプションを付ける。
  • gitを実行するためには、$Git\cmdがPATHに入っている必要がある。

なお、Git for Windowsをインストールするとき、"Adjusting your PATH environment"のダイアログにおいて"Run Git and induced Unix tools from the Windows Command Prompt."を選ぶと、gitと(bash自身を含む)MSYSコマンド群を使えるように設定してくれます。次のディレクトリをこの順でPATHに追加します。

  1. $Git\cmd
  2. $Git\mingw64\bin
  3. $Git\usr\bin

考えるのが面倒なら、設定を変えて再インストールしてしまうのが一番手っ取り早いです。

*1:mingw-getのGUIは便利ですが、GUIコマンドラインで挙動が違うという噂もあります。

*2:他のソフトウェア、例えばRuby DebKit、Haskell Platform、gnupackなどにMinGW/MSYSが同梱されています。VagrantやCoqもMinGWコマンドの一部を内部に持っています。なので、同じコマンドがディスクのアチコチに重複して存在する事態になります。

*3:$Git/git-bash.exe と $Git/bin/* は、Gitコンソールだけで閉じた環境を作るためのものです。MSYS2を普通に利用するときには無用です。