MSYS2メモ

以前Windows環境が吹き飛んで秘蔵のMSYS2用設定ファイルが失われたことがあったので、改めてメモしておく。

sshd

WindowsネイティブのOpenSSHからMSYS2を起動できないかと思ったが無理そうなので、素直にSSHサーバーを2つ(Windowsネイティブ、MSYS2)立てることにした。

手順はこの辺を参考にした。

基本的には最初のリンク先の手順に従い、ファイアーウォールの設定は2番目のリンク先を参考にした。

なぜかログイン時のプロンプトが $ じゃなくて # になった。

自分の過去の記事:

.bash_profile

WindowsのパスをUnix風に変換するには cygpath コマンドが利用できる。

コンソールのコードページをUTF-8にするにはcmd.exeでchcpコマンドを叩けばよい。わかりやすい変化としては、ドットネット製のコマンドを起動したときの出力がある。

LOCALAPPDATA_UNIX="$(cygpath --unix "$LOCALAPPDATA")"
APPDATA_UNIX="$(cygpath --unix "$APPDATA")"

export PATH=$HOME/.local/bin:/c/texlive/2018/bin/win32:$PATH
cmd.exe //C "chcp 65001 > NUL"
alias code="\"$LOCALAPPDATA_UNIX/Programs/Microsoft VS Code/bin/code\""
alias ls="ls --color=auto"
alias grep="grep --color=auto"
alias sde=$HOME/sde-external-8.56.0-2020-07-05-win/sde.exe
alias dotnet="\"/c/Program Files/dotnet/dotnet.exe\""
export GOROOT=C:\\Go\\
export PATH="$(cygpath --unix "$USERPROFILE")/.cargo/bin:/c/Go/bin/:$PATH"

Haskell環境

stackを入れた。32ビット版も設定してみたが、32ビット版Windowsはサポートされなくなりつつあるのでアレ。

export PATH="$APPDATA_UNIX/local/bin/:$PATH"

function stack32() {
    env PATH="$HOME/.local32/bin:$PATH" STACK_ROOT="C:\\sr32" $HOME/.local32/bin/stack "$@"
}

Visual C++の設定

function vcvars64-vs2017.bat() {
    echo "Using vcvars64.bat from VS2017..."
    source <(cmd //c "(" "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" "&amp;&amp;" "C:\msys64\usr\bin\env" ")" | grep -P '^(?!PWD=)(?!(MAN|INFO|PKG_CONFIG_)PATH=)\w+=' | sed -e "s/[\\|&amp;;()<> \t]/\\\&amp;/g" | sed -re "s/^(.+)$/export \1/g")
}
function vcvars32-vs2017.bat() {
    echo "Using vcvars32.bat from VS2017..."
    source <(cmd //c "(" "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat" "&amp;&amp;" "C:\msys64\usr\bin\env" ")" | grep -P '^(?!PWD=)(?!(MAN|INFO|PKG_CONFIG_)PATH=)\w+=' | sed -e "s/[\\|&amp;;()<> \t]/\\\&amp;/g" | sed -re "s/^(.+)$/export \1/g")
}
function vcvars64-vs2019.bat() {
    echo "Using vcvars64.bat from VS2019..."
    source <(cmd //c "(" "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat" "&amp;&amp;" "C:\msys64\usr\bin\env" ")" | grep -P '^(?!PWD=)(?!(MAN|INFO|PKG_CONFIG_)PATH=)\w+=' | sed -e "s/[\\|&amp;;()<> \t]/\\\&amp;/g" | sed -re "s/^(.+)$/export \1/g")
}
function vcvars32-vs2019.bat() {
    echo "Using vcvars32.bat from VS2019..."
    source <(cmd //c "(" "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat" "&amp;&amp;" "C:\msys64\usr\bin\env" ")" | grep -P '^(?!PWD=)(?!(MAN|INFO|PKG_CONFIG_)PATH=)\w+=' | sed -e "s/[\\|&amp;;()<> \t]/\\\&amp;/g" | sed -re "s/^(.+)$/export \1/g")
}
alias vcvars64.bat=vcvars64-vs2019.bat
alias vcvars32.bat=vcvars32-vs2019.bat

Java

Javaはアップデートごとにインストール先のパスが変わるので、バージョン番号を含むパスをハードコードするのは避けたい。

Javaのインストール先(JavaHome)はレジストリを参照すれば取得できる。

レジストリからJavaのインストール先を取得するコードをJScriptで書くと次のようになる。

var WshShell = new ActiveXObject("WScript.Shell");
var p = "HKLM\\SOFTWARE\\JavaSoft\\JDK\\";
var CurrentVersion = WshShell.RegRead(p + "CurrentVersion");
var JavaHome = WshShell.RegRead(p + CurrentVersion + "\\JavaHome");
WScript.Echo(JavaHome);

しかしJScriptを実行するには別途ファイルを作る必要があり、.bash_profile単体で完結させることができない。

Windows標準のツールで完結させるにはPowerShellを使う方法があるが、ここではMSYS2に付属するregtoolコマンドを使ってみよう。

function get-java-home() {
    local p="/HKLM/SOFTWARE/JavaSoft/JDK"
    local CurrentVersion=$(regtool get "$p/CurrentVersion")
    regtool get "$p/$CurrentVersion/JavaHome"
}

1行で書いて変数に代入するなら

JAVA_HOME=$( p="/HKLM/SOFTWARE/JavaSoft/JDK"; v=$(regtool get "$p/CurrentVersion"); regtool get "$p/$v/JavaHome" )

となる。

以前の記事に書いた、出力エンコーディングをUTF-8にするテクニックと組み合わせると次のようになる。

JAVA_HOME=$( p="/HKLM/SOFTWARE/JavaSoft/JDK"; v=$(regtool get "$p/CurrentVersion"); regtool get "$p/$v/JavaHome" )
JAVA_HOME_UNIX=$(cygpath -u "$JAVA_HOME")
export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
function java() {
    env JAVA_TOOL_OPTIONS="${JAVA_TOOL_OPTIONS/-Dfile.encoding=UTF-8/}" "$JAVA_HOME_UNIX/bin/java.exe" -Dfile.encoding=UTF-8 "$@"
}
function javac() {
    env JAVA_TOOL_OPTIONS="${JAVA_TOOL_OPTIONS/-Dfile.encoding=UTF-8/}" "$JAVA_HOME_UNIX/bin/javac.exe" -J-Dfile.encoding=UTF-8 "$@"
}
function set-java-path() {
    export PATH="$JAVA_HOME_UNIX/bin:$PATH"
}

その他

Windowsで無節操にPathを通すとアレなので、aliasで済む奴はaliasで済ませたい。シェルスクリプト中や他のコマンド経由(e.g. sde)では使えないので、その都度Pathを通せるシェル関数を用意しておくとよさそう。

インタラクティブなプログラムはwinptyでラップする。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です