帰ってきた「しっぽのさきっちょ」

しっぽのさきっちょ: 2016-03-01 付 (2017-03-24 更新)

MSYS2 による gcc 開発環境の構築 ― MSYS2 のインストールから初期化処理まで

no extension

これは Qiita の以下の記事からの再構成である。

ここでは以下の3部構成になっている。

  1. MSYS2 のインストールから初期化処理まで (← イマココ)
  2. gcc パッケージ群の導入
  3. pgpdump をビルドする

gcc と MSYS2

MSYS の後継(?)とも言える MSYS2 ではgcc を含む開発環境を 32bit と 64bit で併設できるらしい。

今回は MSYS2 を使って gcc 開発環境を構築する。

なお,単に gcc が欲しいのであれば TDM-GCC のほうがお勧めである。 そうではなく gcc を含む UNIX 互換の開発環境が欲しいのであれば,今回紹介する MSYS2 が適切と思われる(UNIX 系のコマンドを Windows にポーティングする場合など)。 また開発環境は要らないが UNIX 互換の動作環境が欲しいだけなら Git for Windows を導入する手もある1

MSYS2 のインストール

では早速 64bit 版インストーラ(今回は msys2-x86_64-20161025.exe を使用)でインストールを行ってみる。

MSYS2 Installing (1)
MSYS2 Installing (1)

わお! 日本語だ。

MSYS2 Installing (2)
MSYS2 Installing (2)
MSYS2 Installing (3)
MSYS2 Installing (3)
MSYS2 Installing (4)
MSYS2 Installing (4)
MSYS2 Installing (5)
MSYS2 Installing (5)

このまま「完了」するとターミナル(mintty)が起動する。 のだが,ここでちょっと寄り道する。 「MSYS2 64bit を実行中」のチェックを外して「完了」しよう。

MSYS2 起動モード

MSYS2 には3つの起動モジュールがある(64bit 版をインストールした場合)。

  • mingw32.exe
  • mingw64.exe
  • msys2.exe

またそれぞれに ini ファイルが用意されている。 たとえば msys2.exe であればこんな感じ。

#MSYS=winsymlinks:nativestrict
#MSYS=error_start:mingw64/bin/qtcreator.exe|-debug|<process-id>
#CHERE_INVOKING=1
#MSYS2_PATH_TYPE=inherit
MSYSTEM=MSYS

どうやら ini ファイルの内容をそのまま環境変数として渡しているようだ。 このうち MSYSTEM に注目すると以下のようになっている。

バッチファイル セットする値
mingw32.exe MINGW32
mingw64.exe MINGW64
msys2.exe MSYS

MSYSTEM/etc/profile 内で参照される。 以下に /etc/profile の一部を引用する。

MSYS2_PATH="/usr/local/bin:/usr/bin:/bin"
MANPATH='/usr/local/man:/usr/share/man:/usr/man:/share/man'
INFOPATH='/usr/local/info:/usr/share/info:/usr/info:/share/info'

case "${MSYS2_PATH_TYPE:-minimal}" in
  strict)
    # Do not inherit any path configuration, and allow for full customization
    # of external path. This is supposed to be used in special cases such as
    # debugging without need to change this file, but not daily usage.
    unset ORIGINAL_PATH
    ;;
  inherit)
    # Inherit previous path. Note that this will make all of the Windows path
    # available in current shell, with possible interference in project builds.
    ORIGINAL_PATH="${ORIGINAL_PATH:-${PATH}}"
    ;;
  *)
    # Do not inherit any path configuration but configure a default Windows path
    # suitable for normal usage with minimal external interference.
    WIN_ROOT="$(PATH=${MSYS2_PATH} cygpath -Wu)"
    ORIGINAL_PATH="${WIN_ROOT}/System32:${WIN_ROOT}:${WIN_ROOT}/System32/Wbem:${WIN_ROOT}/System32/WindowsPowerShell/v1.0/"
esac

unset MINGW_MOUNT_POINT
source '/etc/msystem'
case "${MSYSTEM}" in
MINGW32)
  MINGW_MOUNT_POINT="${MINGW_PREFIX}"
  PATH="${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
  PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
  ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
  MANPATH="${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
  ;;
MINGW64)
  MINGW_MOUNT_POINT="${MINGW_PREFIX}"
  PATH="${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
  PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
  ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
  MANPATH="${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
  ;;
*)
  PATH="${MSYS2_PATH}:/opt/bin${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
  PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/share/pkgconfig:/lib/pkgconfig"
esac

MINGW32 または MINGW64 の場合は,新たに /mingw32 または /mingw64 がパス等に追加されているのがお分かりだろうか。

ConEmu から MSYS2 bash を起動する

以上から,環境変数 MSYSTEM を適切に設定すれば MSYS2 の起動モジュールを介さずに shell を起動しても構わないことが分かる。 ここでは ConEmu から MSYS2 の bash を起動することを考える。 以下のように Tasks 設定で MSYS2 の bash を起動するシーケンスを設定すればよい。

ConEmu Setting
ConEmu Setting

起動シーケンスは以下のとおり。

set MSYSTEM=MSYS & chcp 65001 & C:\msys64\usr\bin\bash.exe --login -i -new_console:C:"C:\msys64\msys2.ico"

前半で環境変数とコードページ(65001 は UTF-8)を設定し,後半で実際に bash を呼び出している。

初期設定

では本題に戻ろう。 msys2.exe または環境変数 MSYSTEMMSYS をセットして shell を起動し,まずはコア・パッケージを最新のものに更新する。

$ pacman -Syu
:: パッケージデータベースの同期中...
 mingw32                                              232.6 KiB   720K/s 00:00 [##################] 100%
 mingw32.sig                                           96.0   B  93.8K/s 00:00 [##################] 100%
 mingw64                                              231.6 KiB   740K/s 00:00 [##################] 100%
 mingw64.sig                                           96.0   B  0.00B/s 00:00 [##################] 100%
 msys                                                 130.7 KiB   165K/s 00:01 [##################] 100%
 msys.sig                                              96.0   B  93.8K/s 00:00 [##################] 100%
==> Checking if there are critical packages to upgrade.
pacman 5.0.0.6348.cc5a8f1-1 -> 5.0.1.6388.dcb2397-1
==> Core packages require updating.
==> Please close all other MSYS2 derived windows (e.g. terminal
==> windows, Bash sessions, etc) before proceeding.
==> 警告: When the update has completed, you MUST close this MSYS2 window
==> 警告: (use Alt-F4 or red [ X ], etc.), rather than 'exit'!!!
Press [Enter] key when ready to start update...
==> Updating core packages...
警告: bash-4.3.042-4 は最新です -- スキップ
警告: msys2-runtime-2.4.1.16860.40c26fc-1 は最新です -- スキップ
依存関係を解決しています...
衝突するパッケージがないか確認しています...

パッケージ (2) msys2-runtime-devel-2.4.1.16860.40c26fc-1  pacman-5.0.1.6388.dcb2397-1

合計ダウンロード容量:  10.34 MiB
合計インストール容量:  54.72 MiB
最終的なアップグレード容量:  21.12 MiB

:: インストールを行いますか? [Y/n]
:: パッケージを取得します ...
 pacman-5.0.1.6388.dcb2397-1-x86_64                     6.8 MiB  1248K/s 00:06 [##################] 100%
 msys2-runtime-devel-2.4.1.16860.40c26fc-1-x86_64       3.5 MiB  1027K/s 00:04 [##################] 100%
(2/2) キーリングのキーを確認                                                   [##################] 100%
(2/2) パッケージの整合性をチェック                                             [##################] 100%
(2/2) パッケージファイルのロード                                               [##################] 100%
(2/2) ファイルの衝突をチェック                                                 [##################] 100%
(2/2) 空き容量を確認                                                           [##################] 100%
:: パッケージの変更を処理しています...
(1/2) 更新 pacman                                                              [##################] 100%
(2/2) インストール msys2-runtime-devel                                         [##################] 100%
Please close this window.

おや。 ツールが更新された。 pacman -Syu で更新があった場合,いったん shell を閉じて起動し直す。 このとき exit コマンドで終了するのではなく,強制終了する。

Shell を再起動したら他のインストール済みのパッケージを更新しよう。

$ pacman -Su
:: システム全体の更新を開始...
依存関係を解決しています...
衝突するパッケージがないか確認しています...

パッケージ (7) curl-7.47.1-1  file-5.25-1  gnupg-1.4.20-1  libcurl-7.47.1-1  libopenssl-1.0.2.f-1
               mintty-1~2.2.3-1  openssl-1.0.2.f-1

合計ダウンロード容量:   4.40 MiB
合計インストール容量:  20.60 MiB
最終的なアップグレード容量:   0.12 MiB

:: インストールを行いますか? [Y/n] y
:: パッケージを取得します...
 libopenssl-1.0.2.f-1-x86_64                          815.3 KiB   796K/s 00:01 [##################] 100%
 openssl-1.0.2.f-1-x86_64                            1336.9 KiB   977K/s 00:01 [##################] 100%
 libcurl-7.47.1-1-x86_64                              185.0 KiB   269K/s 00:01 [##################] 100%
 curl-7.47.1-1-x86_64                                 595.3 KiB   855K/s 00:01 [##################] 100%
 file-5.25-1-x86_64                                   396.5 KiB   767K/s 00:01 [##################] 100%
 gnupg-1.4.20-1-x86_64                               1026.9 KiB   672K/s 00:02 [##################] 100%
 mintty-1~2.2.3-1-x86_64                              147.2 KiB   436K/s 00:00 [##################] 100%
(7/7) キーリングのキーを確認                                                   [##################] 100%
(7/7) パッケージの整合性をチェック                                             [##################] 100%
(7/7) パッケージファイルのロード                                               [##################] 100%
(7/7) ファイルの衝突をチェック                                                 [##################] 100%
(7/7) 空き容量を確認                                                           [##################] 100%
:: パッケージの変更を処理しています...
(1/7) 更新 libopenssl                                                          [##################] 100%
(2/7) 更新 openssl                                                             [##################] 100%
(3/7) 更新 libcurl                                                             [##################] 100%
(4/7) 更新 curl                                                                [##################] 100%
(5/7) 更新 file                                                                [##################] 100%
(6/7) 更新 gnupg                                                               [##################] 100%
gpg: /etc/pacman.d/gnupg/trustdb.gpg: 信用データベースができました
gpg: 究極的に信用する鍵が見つかりません
gpg: Generating pacman keyring master key...
gpg: skipping control `%no-protection' ()
.+++++
+++++
gpg: 鍵CD81616Cを究極的に信用するよう記録しました
gpg: Done
==> 信用データベースを更新...
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
==> msys2.gpg からキーを追加...
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
==> キーリングの信頼されたキーに署名...
  -> キーに署名 D55E7A6D7CE9BA1587C0ACACF40D263ECA25678A...
  -> キーに署名 123D4D51A1793859C2BE916BBBE514E53E0D0813...
  -> キーに署名 B91BCF3303284BF90CC043CA9F418C233E652008...
  -> キーに署名 9DD0D4217D75A33B896159E6DA7EF2ABAEEA755C...
==> 所有者信頼値をインポート...
gpg: setting ownertrust to 4
gpg: setting ownertrust to 4
gpg: setting ownertrust to 4
gpg: inserting ownertrust of 4
==> 信用データベースを更新...
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   4  信用: 0-, 0q, 0n, 0m, 0f, 1u
gpg: 深さ: 1  有効性:   4  署名:   3  信用: 0-, 0q, 0n, 4m, 0f, 0u
gpg: 深さ: 2  有効性:   3  署名:   0  信用: 3-, 0q, 0n, 0m, 0f, 0u
(7/7) 更新 mintty                                                              [##################] 100%

これで初期化は終了。 次回へ続く。

【おまけ1】 ホームディレクトリについて

MSYS2 のホームディレクトリは,インストールフォルダ直下の home\username フォルダになるが, Windows 上で自前のホームディレクトリを作っている場合は,その場所を /etc/fstab でマウントする手もある。

C:/home	/home

この場合,元のフォルダにある .profile ファイル等の移動も忘れないこと。

【おまけ2】 Proxy サーバ越しのアクセス

Proxy サーバ越しに curl を使う場合は ~/.curlrc に以下の記述を追加する。

proxy-user = "username:password"
proxy = "http://proxy.example.com:8080"

パッケージ管理コマンドである pacman を Proxy サーバ越しに使う場合は,上述の通りに curl の設定をしたうえで /etc/pacman.conf ファイルの以下の記述を探し,コメントを解除する。

#XferCommand = /usr/bin/curl -C - -f %u > %o

GnuPG で鍵サーバにアクセスする場合も, Proxy サーバ越しにアクセスするのであれば, ~/.gnupg/gpg.conf に以下のオプションを追記する。

keyserver-options http-proxy=http://username:password@proxy.example.com:8080/

実は /etc/pacman.d/gnupg ディレクトリにも gpg.conf ファイルがあって pacman-key コマンドはこちらを見てるっぽい2

$ pacman-key -l
/etc/pacman.d/gnupg/pubring.gpg
-------------------------------
pub   2048R/CD81616C 2016-03-01
uid                  Pacman Keyring Master Key <pacman@localhost>

pub   2048R/CA25678A 2014-09-28
uid                  Alexey Pavlov (Alexpux) <alexey.pawlow@gmail.com>
sub   2048R/2BBF340E 2014-09-28

pub   4096R/AEEA755C 2014-10-04
uid                  Martell Malone (martell) <martellmalone@gmail.com>
sub   4096R/2A292C03 2014-10-04

pub   4096R/3E0D0813 2014-09-28
uid                  Ray Donnelly (MSYS2 Developer - master key) <mingw.android@gmail.com>
sub   4096R/8603AA9D 2014-09-28

pub   2048R/3E652008 2014-09-29
uid                  Ignacio Casal Quinteiro <icquinteiro@gmail.com>
sub   2048R/64D62A76 2014-09-29

pub   2048D/A47D45A1 2013-11-11
uid                  Alexey Pavlov (Alexpux) <alexpux@gmail.com>
sub   2048g/31CF7700 2013-11-11

pub   4096R/2C51581E 2015-07-22
uid                  Martell Malone (MSYS2 Developer) <martellmalone@gmail.com>
sub   4096R/282D6707 2015-07-22

pub   4096R/4CA56930 2014-09-28
uid                  Ray Donnelly (MSYS2 Developer) <mingw.android@gmail.com>
sub   4096R/576CF231 2014-09-28

もしかしたらこちらの gpg.conf ファイルも修正する必要があるかもしれない(未確認)。

関連するブックマーク


  1. Git for Windows には bash などの MSYS2 サブセットを含んでいるため, Git for Windows の bash (通称 git bash)を起動することで UNIX 互換の動作環境を得られる。なお Git for Windows の環境は git を動かすための最小限のツールしか入っていないため, Git for Windows SDK も併せて導入し,その中の pacman コマンドで必要に応じてのツールを追加する。 pacman については次回説明する。 [return]
  2. ちなみに /etc/pacman.d/gnupg ディレクトリにある鍵束を GnuPG から直接見る場合には gpg --homedir /etc/pacman.d/gnupg --list-keys とする。 [return]