パソコンでプログラミングしよう ウィンドウズC++プログラミング環境の構築
1.6.3.6(15)
MSYS2

MSYS2はウィンドウズで稼働するPOSIX互換システムである。

ウィキペディアには現時点でMSYS2の項目が無い。

その他の外部情報

本サイトでの解釈

MSYS2は通常のウィンドウズアプリケーションとしてインストールされるが、インストール後はPOSIX互換システムを提供しウィンドウズと共存する。MSYS2は両者の差異を良く吸収するが、注意を怠ると一方あるいは両方の運用を損なう。ウィンドウズとPOSIXは用語定義も微妙に異なり、それぞれのドキュメント参照も慎重に行う必要がある。

MSYS2はインストールディレクトリ(C:\msys64)をルート(/)とするPOSIX互換システムに加え、サブディレクトリに以下のサブシステムを導入する。

  • msys2サブシステム(/usr)
  • mingw32サブシステム(/mingw32)
  • mingw64サブシステム(/mingw64)

mingw32/mingw64にはそれぞれ32ビット/64ビットのウィンドウズネイティブツールが導入される。これらサブシステムを本サイトはPOSIXサブシステムと総称するが、厳密にはPOSIX互換でない可能性がある。なおルートディレクトリのPOSIX互換システムはmsys2サブシステムへの何らかのリンクにより実現されていると推測される。

ファイルシステム

MSYS2はウィンドウズアプリケーションとしてインストールされたディレクトリをルートとして、POSIX互換システムに以下のファイルシステムを作成する。

POSIXパス 内容
/bin, /dev, /home, /opt, /proc, /tmp, /var, /etc POSIX要件/慣用
/usr msys2サブシステム
/mingw32 mingw32サブシステム
/mingw64 mingw64サブシステム
/c, /d, ... ドライブマウントポイント

これらの一部はウィンドウズ環境からも参照できる。各POSIXサブシステムは以下のようにウィンドウズ環境から利用される。

ウィンドウズパス 内容
C:\msys64\usr msys2サブシステム
C:\msys64\mingw32 mingw32サブシステム
C:\msys64\mingw64 mingw64サブシステム

各POSIXサブシステムはウィンドウズからもアクセスできるサブディレクトリを持つ。本サイトは以下を使用する。

相対パス 内容(ファイル)
bin コマンドラインツール(*.exe), ダイナミックリンクライブラリ(*.dll)
include C++/C言語で使うインクルードファイル(*.h)
lib ライブラリ(*.a)

POSIXサブシステム

各POSIXサブシステムは以下にまとめるが、主要な違いはコマンドサーチパスにある。コマンドサーチパスは他に/usr/local/bin、/bin、/opt/binなどを含むが、理解の単純化のため省略した。

サブシステム コマンドラインツール 本サイトでの利用目的 主なコマンドサーチパス
msys2 msys-2.0.dll依存 パッケージインストール /usr/bin
[ウィンドウズシステム]
mingw32 32ビットウィンドウズネイティブ 32ビットアプリケーション作成 /mingw32/bin
/usr/bin
[ウィンドウズシステム]
mingw64 64ビットウィンドウズネイティブ 64ビットアプリケーション作成 /mingw64/bin
/usr/bin
[ウィンドウズシステム]

/usr/binディレクトリ内のmsys2サブシステムに属するコマンドラインツールは同ディレクトリのダイナミックリンクライブラリ(DLL)msys-2.0.dllに依存する。msys2サブシステムのコンパイラが作成するアプリケーションもmsys-2.0.dllに依存する。msys-2.0.dllがPOSIX互換システムとウィンドウズを仲立ちするレイヤーと見なされる。

/mingw32/binディレクトリ内のmingw32サブシステムに属するコマンドラインツール、および/mingw64/binディレクトリ内のmingw64サブシステムに属するコマンドラインツールは、msys-2.0.dllに依存しないという意味でウィンドウズネイティブと見なされる。mingw32およびmingw64サブシステムのコンパイラが作成するアプリケーションもウィンドウズネイティブとなる。mingw32およびmingw64サブシステムはコマンドサーチパスの下位に/usr/binを含み、自らに無いコマンド(および自らに無いDLL)はmsys2サブシステムを探索する。

POSIX互換ターミナルとシェル

POSIXサブシステムはターミナルにmintty、シェルにbashを標準とし、それぞれPOSIX互換ターミナル、POSIX互換シェルとして参照する。ターミナルを起動サブシステムで区別する場合はmsys2ターミナル、mingw32ターミナル、mingw64ターミナルとして参照する。

POSIXサブシステムの起動

ウィンドウズから各POSIXサブシステムを起動するには、以下のいずれかのランチャーによる。

サブシステム コマンドスクリプト 実行形式
msys2 C:\msys64\msys2_shell.cmd -msys C:\msys64\msys2.exe
mingw32 C:\msys64\msys2_shell.cmd -mingw32 C:\msys64\mingw32.exe
mingw64 C:\msys64\msys2_shell.cmd -mingw64 C:\msys64\mingw64.exe

MSYS2のインストールでコマンドスクリプトのショートカットがウィンドウズスタートメニューに追加される。コマンドスクリプトによるランチャーはエクスプローラから起動するとウィンドウズのコマンドプロンプトが一瞬表示され、またタスクバーへピン留めができない。いずれのランチャーもウィンドウズ上にPOSIX互換ターミナルを起動し、それぞれの定めるコマンドサーチパスの下にPOSIX互換シェルのコマンドプロンプト(コマンド受け入れ準備を示す文字列)を表示する。このようにしてPOSIXサブシステム環境を実現するが、各POSIXサブシステム環境は他のPOSIXサブシステム環境およびウィンドウズ環境と基本的には干渉しない。

POSIXサブシステム環境からウィンドウズアプリケーションを実行できる。コマンドサーチパスにウィンドウズシステムを含むのでウィンドウズのシステムツールは(POSIXサブシステムのそれと名前が重複しない限り)名前だけで実行できる。ただし以下の留意が必要となる。

  • POSIX互換シェルは\をエスケープ文字とするためコマンド引数にウィンドウズパスを与える場合は\を\\とする。
  • ウィンドウズパスによるグロッビング(ワイルドカードによるファイル名補完)はほとんどの場合に機能しない。
    user@THINKPAD-L430 MSYS ~
    $ ls subdir/*.txt
    subdir/file1.txt subdir/file2.txt
    user@THINKPAD-L430 MSYS ~
    $ ls subdir\\*.txt
    ls: cannot access 'subdir\*.txt': No such file or directory
  • ウィンドウズツールの出力日本語コードはシフトJIS、POSIX互換ターミナルのデフォルト文字コードはUTF-8なので、日本語出力は文字化けする。
  • ウィンドウズツールのchcp、diskcomp、diskcopy、format、mode、more、treeはMS-DOS互換性のため今なお拡張子がcomであり、POSIX互換シェルからの実行は拡張子を必要とする(環境変数PATHEXTの設定は利用していない)。

本サイトはmsys2サブシステムをコマンドラインツールpacmanによるパッケージインストール目的で使用する。mingw32サブシステムおよびmingw64サブシステムでもpacmanは利用可能と思われるが、MSYS2ホームページはmsys2サブシステムでの運用を推奨し本サイトはそれに倣う。本サイトはmsys2サブシステムでのアプリケーション開発は行わないので、そのコンパイラは導入しない。一方mingw32サブシステムおよびmingw64サブシステムでウィンドウズネイティブなアプリケーション開発を行うため、それぞれのコンパイラを導入する。

ウィンドウズからの利用

POSIXサブシステムコマンドラインツールは、POSIX互換ターミナル依存のフルスクリーンエディタなどを例外として、通常のウィンドウズアプリケーションとしてウィンドウズから起動できる。msys2サブシステムのmsys-2.0.dllに限らず、各サブシステムのコマンドラインツールは同ディレクトリ(binディレクトリ)内のDLLに依存することが多い。mingw32サブシステムとmingw64サブシステムはそれぞれ同一名称のDLLを持つが、ウィンドウズ環境のDLL探索順トップは必ずアプリケーションディレクトリなので多くの場合に問題は発生しない。しかし以下のような懸念が残る。

  • コマンドラインツールがbinディレクトリ以外に属するコマンドを起動し、そのコマンドがbinディレクトリ内のDLLに依存する場合。
  • コマンドラインツールがbinディレクトリ以外のPOSIXサブシステム環境コマンドサーチパスにあるDLLに依存する場合。
  • Git for Windowsのようにそれ自体がカスタムMSYS2をインストールするアプリケーションと共存する場合。

ウィンドウズアプリケーションはアーキテクチャの異なるDLLのロードをスキップするため、コマンドサーチパスに必要なディレクトリを加えることで最初の二つは解決できるかもしれないが、カスタムMSYS2との共存に予測の難しい問題を引き起こす可能性がある。従ってアプリケーション開発はmingw32/mingw64ターミナル上のPOSIXサブシステム環境が最も安全と言えるが、それではコマンドラインベースの開発に限定される。本サイトは統合開発環境を導入し、その中でコンパイラを含むPOSIXサブシステムコマンドラインツールを利用する。統合開発環境はウィンドウズ環境のアプリケーションなので先の懸念を引き継ぐが、統合開発環境の機能活用で解決し安定した運用を目指すのが本サイトの大きなテーマの一つとなる。

ランチャー起動時にシェルへ渡すコマンドを指定すれば、ウィンドウズからPOSIXサブシステム環境の下にコマンドラインツールやスクリプトを(見かけ上)直接実行できる。スクリプトやPOSIX互換ターミナルに依存するコマンドラインツールを(見かけ上)直接実行するにはこれによるしかない。以下は例として、ウィンドウズから64ビット版Pythonのスクリプトidle3を実行する。

C:\msys64\msys2_shell.cmd -mingw64 -c idle3
C:\msys64\mingw64 idle3