MinGW (64bit) + MSYS 環境の構築 (1)


はじめに

64ビットバイナリを生成できる MinGW (SEH, posix-threads) 環境を構築しましたので、2回にわたって紹介してみます。この環境で Qt5 をビルドできる事を確認しました。また、以前、MinGW 環境から msysgit を利用する方法についてまとめましたが、今回は Git の入った MSYS を導入しましたので、msysgit は不要になります。

※ 2014/02/02 追加: 本記事の設定だけでは、Git コマンドの一部が文字化けします。合わせて MinGW64 環境の Git で文字化けを解消する | DeVlog – 銀の翼で翔べ – の設定もすることをおすすめします。

MinGW バイナリの選定

64ビットの MinGW は、本家とは独立した MinGW-w64 で提供されています。また、独自にアレンジした TDM-GCC も良く利用されているようです。MinGW-w64 プロジェクトは、さらに個別のバイナリを提供するプロジェクトで構成されていて、Downloads を開くと、Automated Builds, Cygwin, Fedora Project, Mingw-builds Project, Win-builds Project といったプロジェクトがある事がわかります。

今回は、これらの中から以下のポイントで選定しました。

  • C++ の例外処理方法として SEH が利用できる。
  • GCC 4.8.2 以上が利用できる。

MinGW では、C++ 例外を扱う方法として SJLJ という方式が使われてきました。一方、 Windows の標準的なビルド環境である Visual C++ では SEH が採用されていて、この差異が MinGW で生成されたバイナリを遅くする要因になっていました。(Windows で Qt5 が遅いわけ | Qt のあれこれ (仮)) MinGW-w64 では、SJLJ に加えて DWARF(32ビット), SEH(64ビット)を利用できるようになっています。今回は SEH を使ったバイナリを採用することにします。

また、当初 TDM-GCC を使っていましたが、Qt のビルドで再定義エラーがでてしまい色々と調べたところ、 gcc 4.8.1 のヘッダに問題がある事がわかりました。そこで、gcc 4.8.2 以上とすることにしました。

これらの事から、Mingw-builds Project のバイナリを使うことにしました。

Mingw-builds のインストール

  1. GCC for both x64 & x86 Windows! – MinGW-w64Downloads ページにある Mingw-builds Project から Host/Winodws 64 の Download > Sourceforge.net のリンクページに移動します。(※注:installer のリンクでインストーラをダウンロードすると、gcc 4.8.1 しか選べません。)

  2. 4.8.2 > threads-posix > seh とたどり、x86_64-4.8.2-release-posix-seh-rt_v3-rev1.7z をダウンロードします。(スレッドは、posix としました。その方が多くのプロジェクトをビルドしやすいと思います。)
  3. 上記ファイルを展開し、mingw64 ディレクトリを c: に配置 (c:mingw64) します。(.7z は圧縮形式の一つです。適当なツールで展開してください。)

MSYS のインストール

MinGW は、DLL とコンパイラ等の最低限の環境のみ提供しています。実際に各種コードをビルドする際には、さらに多くのツールが必要となる場合が大半です。それらを提供してくれるのが MSYS です。今回導入する MSYS (32ビット) は、autotools、wget、Git、subversion 等多くのツール群が入っているのでとても使い勝手が良いです。(今回の MSYS は 32ビットですが、バイナリを生成するのは MinGW が提供するコンパイラなので、生成物には問題ありません。)
以下の手順でインストールします。

  1. MinGW-builds – Browse Files at SourceForge.net に移動し、msys+7za+wget+svn+git+mercurial+cvs-rev13.7z をダウンロードします。
  2. 上記ファイルを展開し、msys ディレクトリを MinGW64 のルート (c:mingw64) に配置 (c:mingw64msys) します。
  3. MSYS から MinGW の環境を利用できるようにするためには、/etc/fstab を使って MinGW のディレクトリを MSYS の /mingw にマウントします。 (/etc/profile では、あらかじめ /mingw/bin をパスに加える設定になっています。) 具体的には、
    c:mingw64msysetcfstab.sample を fstab という名前でコピーし、以下の記述を追加します。(サンプルには /perl のマウントが記述されていますが、これは一旦コメントアウトしておきます。)
    Windows 上のディレクトリをセパレータ ‘/’ で記述し、スペースを空けて MSYS 上のディレクトリを記述します。(MSYS 上では、c:mingw64msys が / になっています。)

以上で MSYS がインストールできました。ここで、エクスプローラから c:mingw64msysmsys.bat を起動してみてください。コマンドプロンプトが開きますので、ls /mingw で c:mingw64 の内容が表示されるかどうか確認してください。表示されない場合は、fstab の記述に何か間違いがあるものと思われます。

また、ホームディレクトリ (~) は、c:mingw64msyshomeuser-name (user-name は Windows 上のアカウント名) となっていて、最初に msys.bat を実行したときに自動的に作成されます。このディレクトリは MSYS 上では /home/user-name としてマッピングされています。

※注) msys.bat にパラメータを指定すると、コマンドプロンプトでなく mintty 等のターミナルエミュレータを起動できます。ただし、mintty 上では、Git の動作に支障が出る場合があります。(例えば、git clone がフリーズします。) Windows ではターミナルエミュレータを起動しなくても問題はないので、パラメータ無しで起動する事をお勧めします。(パラメータを指定しないと、古いターミナルエミュレータである rxvt が起動するという情報も見受けられましたが、msys.bat を見る限りそのような事はありません。)

MSYS のショートカットを作る

毎回ディレクトリをたどって msys.bat を起動するのは大変なので、スタートメニューに登録しておきます。手順は以下の通りです。

  1. エクスプローラで msys.bat を右クリックし、「ショートカットの作成」でショートカットを作成する。
  2. ショートカット名を、わかりやすい名前に変更する。
  3. 上記ショートカットを左下のスタートメニューにドラッグしてドロップする。

以上でスタートメニューから MSYS 環境を開くことができるようになります。

MSYS の調整

ここで、もう少し MSYS を調整しておきます。

  1. msys.bat は Windows に設定されているパスを追加しますが、これが干渉する場合もあるので最小限のパス構成にします。msys.bat の先頭に以下を追加しておきます。 これで、Windows 上のパスは、Windows ディレクトリの Sytem32 のみが取り込まれます。MSYS から必要なツール類は、別途 .bashrc で追加します。msys.bat で起動したコマンドプロンプトから、echo $PATH とすると、以下のようになっているはずです。
    .:/usr/local/bin:/mingw/bin:/bin:/c/Windows/System32
  2. MSYS のホームディレクトリ (c:mingw64msyshomeuser-name) に、以下の内容の .profile というファイルを置き、Bash が使えるようにします。
  3. c:mingw64msyshomeuser-name.bashrc を作成し、以下を記述します。

    1行目: TERM 環境変数を設定します。これが無いと以下のような警告が出る場合があります。(less コマンド等)

    WARNING: terminal is not fully functional

    2-3行目: ls コマンドの結果に色をつけます。これは好みの問題ですが、ディレクトリとファイルの区別等が色分けされていると見やすいと思いますので設定しています。

    4-5行目: コマンドプロンプトを修正しています。カレントディレクトリや、Git のブランチ名を表示するようにしています。好みに応じて修正してください。試しに ls -l /mingw を実行すると以下のように表示されます。

  4. ホームディレクトリに .ssh ディレクトリを作成し、秘密鍵 (id_rsa) を配置します。これまで使っていたものをコピーしてくれば良いと思います。(putty を使っていた場合は、.ppk を変換する必要があるでしょう。) まだ鍵を生成していない場合は、msys.bat のプロンプト上で ssh-keygen を実行して作成します。
  5. Git の設定は、今まで使っていたのものがあれば .gitconfig を MSYS のホームディレクトリにコピーすれば良いです。ただし、MSYS 上の作業では、autocrlf は切っておく方が無難です。最後にコマンドプロンプトで以下を実行しておきます。

以上で、MinGW64 + MSYS の環境がほぼ整いました。msys.bat で開くコマンドプロンプトから、Linux のツール群を利用できます。次回は、他のツールも導入してみます。

[参考サイト]

[関連記事]

  1. MinGW (64bit) + MSYS 環境の構築 (2) | DeVlog – 銀の翼で翔べ –
  2. MinGW64 環境の Git で文字化けを解消する | DeVlog – 銀の翼で翔べ –

bakabon88

エラーポイントは箇所がずれてましたので。。。

_set_invalid_parameter_handler (gl_msvc_invalid_parameter_handler);
. ^

bakabon88

こんにちは。
最近Git for windows と Ruby DevKit を導入したのですが、2つのMsys環境を一つにできないかと探していたらこちらにたどり着きました。
とても分りやすい記事で簡単にMsys/MinGW/Git環境を構築することができました。ありがとうございます。
快適にMsysを使用できているのですがある現象を解決できなくてコメントさせて頂きました。

ある現象とは、sed でテキストファイルを -i オプション付きで書き換えるとファイルは書き換わりますが
sed: preserving permissions for ./sed001072': Permission denied
のエラーが出てパーミッションが書き換わり、偶に末尾に[e]を付けたバックアップファイルらしきものが作成されます。

$ echo 'text document.' > hoge
$ sed -ie 's/text/My/' hoge
sed: preserving permissions for
./sed001072′: Permission denied
$ la -l
-r–r–r– 1 Admin Administrators 13 May 7 07:21 hoge
-rw-r–r– 1 Admin Administrators 15 May 7 07:20 hogee
$ cat hoge
My document.

この現象は Git for Windows の bash 上でも同じ現象でした。
実行環境は、Windows 8.1 x64 で sed のバージョンは 4.2.1 です。

解決策として sed をコンパイルすればいいのではないかと思い、GNU の sed-4.2.2 をコンパイルしたのですが make でコケます。orz

$ mkdir ~/temp ~/temp/sedbin && cd ~/temp
$ wget ftp://ftp.gnu.org/gnu/sed/sed-4.2.2.tar.gz
$ tar xvfz sed-4.2.2.tar.gz
$ cd sed-4.2.2
$ ./configure –prefix=$HOME/temp/sedbin
$ make
:
:
msvc-inval.c: In function ‘gl_msvc_inval_ensure_handler’:
msvc-inval.c:126:39: error: ‘gl_msvc_invalid_parameter_handler’ undeclared (first use in this function)
_set_invalid_parameter_handler (gl_msvc_invalid_parameter_handler);
^
msvc-inval.c:126:39: note: each undeclared identifier is reported only once for
each function it appears in
Makefile:1223: recipe for target msvc-inval.o' failed
make[4]: *** [msvc-inval.o] Error 1
make[4]: Leaving directory
/home/Admin/temp/sed-4.2.2/lib’
Makefile:1243: recipe for target all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory
/home/Admin/temp/sed-4.2.2/lib’
Makefile:1097: recipe for target all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory
/home/Admin/temp/sed-4.2.2/lib’
Makefile:1050: recipe for target all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory
/home/Admin/temp/sed-4.2.2′
Makefile:990: recipe for target `all’ failed
make: *** [all] Error 2

MinGW のビルドの違いかもしれないと思い x686版,win32版,???,??? 4つほど入れ替えてみたのですがすべて同じ結果でした。

あいにく私にはこのコンパイルエラーと戦うスキルを持ってません。orz
何か解決につながる糸口はございませんでしょうか?
長文申し訳ございませんでした。

J-run

bakabon88 様
私の記事が多少なりともお役に立てているようで、うれしく思います。

お困りの件について、
最近 MinGW を触っていないのですぐには確認できないのですが、
コンパイルエラーを見てちょっとひっかかるのは、
msvc-inval.c というファイルの名前です。

名前からすると、
Microsoft Visual C 用のファイルっぽいです。
だとすると、./configure の際に、プラットフォームを指定する必要が
ありそうな気がします。また帰宅したらもう少し調べてみようと思います。

J-run

bakabon88 さん、こんにちは。

状況を詳細に教えていただいたので、私の環境でもコンパイルしてみました。そして、コンパイルエラーは再現できました。
ただ、config.log を見る限り gcc をきちんと認識しているようですので、先のコメントで書いたようなプラットフォーム指定云々の問題ではないのかもしれません。
因みに linux 上でのコンパイルは問題ありませんでした。

そこで、そもそもの問題である sed のエラーの方をぐぐってみたところ、対処法を見つけました。以下の記事をご覧ください。
MinGW 上の sed による置換で permission denied を回避するには | DeVlog – 銀の翼で翔べ – http://www.devlog.alt-area.org/?p=2951

それから、[e]が末尾についたバックアップファイルができる点についてですが、オプションが -ie になっているからだと思います。
これを -ig にすると、[g]が末尾についたバックアップができます。また -i とするとバックアップはできません。
私自身は、sed について詳しくないので間違っていたらすみません。

Kaz

初めましてKazといいます。
記事を参考にMinGWの64bitを導入しました。
mingw-getコマンドを使いたいのですが
どのようにすればいいのでしょうか?

J-run

記事を読んでいただき、ありがとうございます。

ご質問の mingw-get についてですが、今の私の環境では使っていません。ですが、以前インストールした時の記録を探したところ、以下のようにしてインストールできたようです。
1. http://sourceforge.net/projects/mingw/files/Installer/ から mingw-get-setup.exe を実行
2.Installation Directory で MinGW64 のインストールディレクトリを指定

ただし、mingw-get でインストールできるのは 32ビットのツールだけだと思いますので、割り切って使ってください。

メールアドレスが公開されることはありません。