Windows10でMSYS2でC++環境を作る

# WindowsでC++
自分用にメモしておきます。
以下のようなWindows10でC++をコンパイルして実行出来る最低限の環境を作ります。
Windows10上でインストーラを使ってインストールする物は極力減らす方針です。

- Windows10でC++をコンパイルして実行できる
- Visual StudioとかのIDEは覚える事が多いので出来ればシンプルにしたい
- Makeも使える方が嬉しいしGitも使ってみたい

## 作る環境
- Windows10
- Visual Studio Code (VSCode)
- MSYS2

以上の3要素でC++を最低限コンパイル出来る環境を目指す。
ターミナルとかGitとかMakeとかはMSYS2の物を使う。



## [Visual Studio Code (VSCode)](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)をインストール
ダウンロードして画面に従いインストールを行う。


## [MSYS2](http://msys2.org)をインストール
ページ上部から`msys2-x64_86-(date).exe`をダウンロードし、ページの手順に沿ってインストールを行う。


MSYS2 MSYSを起動してパッケージを更新する。

```:パッケージの更新
$ pacman -Syu
```

途中でMSYS2を再起動する事になるので再起動した後に以下で残りを更新する。

```:残りの更新
$ pacman -Su
```

MSYS2で以下のコマンドを実行しC/C++環境に必要なパッケージを入手する。

```:MSYS2
$ pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb make git
```

ここまでやるとMSYS2上でgccが使えるようになっていると思うので、MSYS2で以下を実行してテストする。

```bash:MSYS2
$ gcc -v
$ make -v
$ git --version
```

正しく実行出来るとバージョン情報が表示される。

## ホームディレクトリの設定
デフォルトではMSYS2のホームディレクトリは`C:\msys64\home\ユーザー名`に設定されている。
ホームディレクトリの変更自体は`export HOME=/C/Users/ユーザー名`すれば良いが、OpenSSHの鍵の参照先が`$HOME/.ssh/`ではなくて`/home/ユーザー名/.ssh/`を直接参照するため、別の手段を設定する必要が有る。

そこで、今回はWindows10の付属機能で`C:\msys64\home`から`C:\Users`へシンボリックリンクを貼る。

事前に`C:\msys64\home\ユーザー名`の中身を`C:\Users\ユーザー名`に移動して、`C:\msys64\home`ディレクトリを削除しておく。

```:cmd.exe(管理者権限モード)
$ mklink /D C:\msys64\home C:\Users
```
他には`/etc/fstab`を書く方法が有るらしいが今回はこれで。

## VSCodeでMSYS2のGitを使えるように下準備

`C:\msys64\usr\bin\git-wrap.bat`に以下を記述して保存する。

```:git-wrap.bat
@echo off
setlocal

rem If you don't add path for msys2 into %PATH%, enable following line.
rem set PATH=c:\msys64\usr\bin;%PATH%

if "%1" equ "rev-parse" goto rev_parse
git %*
goto :eof
:rev_parse
for /f %%1 in ('git %*') do cygpath -w %%1
```

## VSCodeの設定
### 設定ファイルを開く
`Ctrl + Shift + P`でコマンド検索欄を出す。
`opensettings`とか入力すると`Preferences: Open Settings (JSON)`が見つかるので選ぶと`settings.json`が開かれる

### 設定の追記

ファイルを以下のように編集する。既に何かあるならカッコやカンマとか構造を壊さないように追記する。
特に最初と最後のカッコ`{...}`を忘れないように。

```JavaScript:settings.json
{
    // VSCodeで使うターミナルの設定
    "terminal.integrated.shell.windows": "C:/msys64/usr/bin/bash.exe",
    "terminal.integrated.env.windows": {
        // inheritにする事でWindows10のPATHを引き継ぐ
        // 引き継がない場合はコメントアウト
        "MSYS2_PATH_TYPE": "inherit",
        "MSYSTEM": "MINGW64",
        "CHERE_INVOKING": "1"
    },
    "terminal.integrated.shellArgs.windows": [
        "--login"
    ],
    "terminal.integrated.cursorStyle": "line",
    // Gitのパスの設定(先ほど作ったバッチファイルを読み込むように)
    "git.path": "C:/msys64/usr/bin/git-wrap.bat"
}
```
以上のようにするとVSCode上で`Terminal -> New Terminal`で開いたターミナルがMSYS2 MINGW64になる。

## コンパイルと実行
コンパイルに必要な`g++`コマンドとか`make`コマンドとかが使えるようになっているはずなので後はプログラムを書くだけ。
一応、基本的なC++プログラムとそれをmakeするための`Makefile`を書いておく。

```c++:hello_world.cpp
#include <iostream>
using namespace std;
int main() {
    cout << "Hello, World !" << endl;
    return 0;
}
```

```makefile:Makefile
hello_world: hello_world.cpp
	g++ -o hello_world.exe hello_world.cpp
clean:
	rm hello_world.exe
```

上記2つのファイルを適当なディレクトリに保存して実行を行う。

```bash:コンパイルと実行
# g++コマンドを直接使う
$ g++ hello_world.cpp
$ ./a.exe
Hello, World !
$ rm ./a.exe

# makeコマンドを使ってみる
$ make
g++ -o hello_world.exe hello_world.cpp
$ ./hello_world.exe
Hello, World !
$ make clean
rm hello_world.exe
```

これで、とりあえずC++のプログラムをコンパイルして実行出来る環境が完成した。

## (余談)コマンドプロンプトでgccを使いたい場合
MSYS2のターミナルでは予めMinGWのbinへPATHが通っている。
Windows10のコマンドプロンプトで使う意にはWindows10のPATHにMinGWのbinを追記する必要が有る。
イメージ的には、入力されたコマンドを探すフォルダを追加している感じ。

コマンドプロンプトを**管理者権限**で実行して以下のコマンドで環境変数PATHに追記する。
管理者権限モードで起動した場合は割と何でも出来てしまうので注意する。

間違えそうな人は普通に`Windowsの設定-システム -> バージョン情報 -> システム情報 -> 設定の変更 -> 詳細設定 -> 環境変数(N)...`から`システム環境変数`の`Path`を編集して最後に`C:\msys64\mingw64\bin`と`C:\msys64\usr\bin`を追加しても良い。

```:cmd.exe(Administrator)
$ setx /M PATH "%PATH%;C:\msys64\mingw64\bin;C:\msys64\usr\bin"
```

## (余談)MSYS2とMINGW64とMINGW32の違い
gccにMSYS版とMINGW64版が有るが違いがよく分からなかったが参考文献によると以下のためらしい。
>MSYS2とMinGW64の最大の違いは、POSIXエミュレーションを介しているか否か。
 --- MSYS2,MinGW64,Cygwinの違い

MSYS2とMINGW64でターミナルが2種類用意されてるのはそんなに違いは無くて、MINGW64では`C:\mingw64\bin`にパスが通っているだけ。

## 参考文献
[MSYS2 MinGW GCC環境をつくる（その1）](https://blogs.osdn.jp/2018/01/30/msys2-mingw.html)
[Visual Studio Code 15.1の統合シェルをMSYS2のbashにする](https://qiita.com/yumetodo/items/42132a1e8435504448aa)
[[FYI] Using git on msys2 #4651](https://github.com/Microsoft/vscode/issues/4651)
[msys2での$HOMEとOpenSSHでのホームディレクトリの違い](https://qiita.com/nana4gonta/items/622571c66bfe7f1c7150)
[Windows10でシンボリックリンクを設定する方法](http://www.wannko.net/windows10/etc/sinlink.html)
[MSYS2,MinGW64,Cygwinの違い](https://www.glamenv-septzen.net/view/1422)