MSYS2 を今まで pacman でアップデートしてきたんですが、ちょっと apcupsd の apctray.exe をいじりたくて、make したら make がないとか言われたんで調べてみたら、構成がいろいろ変わっていて、/ucrt64 とかいろいろできていて、path を通さないといけないっぽい。ので、ちょっと調べてみました。
MSYS2 にある複数環境、C++ アプリ開発で簡単にまとめられていました。が、さてじゃあどれを使うのがいいのかというと、「自分がやりたいことができる環境にしなさい」らしいのですが……。
本家のドキュメントを見ると、Environments に、
If you are unsure, go with UCRT64.
とあるので、UCRT64 にしてみます。すると、
For example, in the UCRT64 environment the
$PATH
variable starts with/ucrt64/bin:/usr/bin
so you get all ucrt64 based tools as well as all msys tools.
とあるように、UCRT64 環境を選ぶと、$PATH が /ucrt64/bin:/usr/bin というふうに変更されて、パスが通るようになっているようです。デフォルトでは bash が呼ばれるので、まずは /etc/profile が読み込まれるはず。そちらを見ると、
unset MINGW_MOUNT_POINT
. '/etc/msystem'
case "${MSYSTEM}" in
MINGW*|CLANG*|UCRT*)
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"
PKG_CONFIG_SYSTEM_INCLUDE_PATH="${MINGW_MOUNT_POINT}/include"
PKG_CONFIG_SYSTEM_LIBRARY_PATH="${MINGW_MOUNT_POINT}/lib"
ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
MANPATH="${MINGW_MOUNT_POINT}/local/man:${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
INFOPATH="${MINGW_MOUNT_POINT}/local/info:${MINGW_MOUNT_POINT}/share/info:${INFOPATH}"
;;
*)
PATH="${MSYS2_PATH}:/opt/bin${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/share/pkgconfig:/lib/pkgconfig"
esac
となっていて、2行目(ファイル中では48行目)で /etc/msystem をソースしています。長い行の改行がおかしな感じになってますが。
/etc/msystem を見ると、冒頭に
export MSYSTEM="${MSYSTEM:-MSYS}"
とあって、$MSYSTEM が定義されてなければ "MSYS" を設定するようになっています。
ということは、/etc/msystem が読まれる前に MSYSTEM を設定すれば、あとはドミノ倒しでうまくいきそうです。……なのですが、Shells には、
The launchers set the
MSYSTEM
variable and open a terminal window (mintty) with a proper shell (bash). Bash in turn sources/etc/profile
which sets the environment depending on the value ofMSYSTEM
.Without the correct environment, various things may and will (sometimes silently) break. The exception is using mingw subsystems from pure Windows, which shouldn't require any special environment apart from an entry in
PATH
. Do not setMSYSTEM
outside of the shells, because that will also break things.
とあり、最後の行でなんだかよくわからないことが書いてあります。たぶん、ここは「shellが読み込んだ後に MSYSTEM を変えるな」ということだと思うのですが…。
ランチャが MSYSTEM 変数をセットしてから mintty を開くということなので、ランチャを見てみます。msys2_shell.cmd がそれです。すると37行目から、
rem Shell types
if "x%~1" == "x-msys" shift& set /a msys2_shiftCounter+=1& set MSYSTEM=MSYS& goto :checkparams
if "x%~1" == "x-msys2" shift& set /a msys2_shiftCounter+=1& set MSYSTEM=MSYS& goto :checkparams
if "x%~1" == "x-mingw32" shift& set /a msys2_shiftCounter+=1& set MSYSTEM=MINGW32& goto :checkparams
if "x%~1" == "x-mingw64" shift& set /a msys2_shiftCounter+=1& set MSYSTEM=MINGW64& goto :checkparams
if "x%~1" == "x-ucrt64" shift& set /a msys2_shiftCounter+=1& set MSYSTEM=UCRT64& goto :checkparams
if "x%~1" == "x-clang64" shift& set /a msys2_shiftCounter+=1& set MSYSTEM=CLANG64& goto :checkparams
if "x%~1" == "x-clang32" shift& set /a msys2_shiftCounter+=1& set MSYSTEM=CLANG32& goto :checkparams
if "x%~1" == "x-clangarm64" shift& set /a msys2_shiftCounter+=1& set MSYSTEM=CLANGARM64& goto :checkparams
if "x%~1" == "x-mingw" shift& set /a msys2_shiftCounter+=1& (if exist "%WD%..\..\mingw64" (set MSYSTEM=MINGW64) else (set MSYSTEM=MINGW32))& goto :checkparams
などとなっています。どうやら、msys2_shell.cmd に続いてハイフンとシェルタイプを指定すればよいようです。
うちの場合、Windows Terminal を使って MSYS2 を開くので、今までは
C:/Apps/msys64/msys2_shell.cmd -no-start -defterm -msys2 -here -shell zsh
としていましたが、UCRT64環境にしたければ -msys2 を -ucrt64 にすればよいようです。てっきり /etc 以下のどこかのファイルかと思ってしまいました。