競技プログラミングのためのVSCode環境構築【Mac OS X Catalina】

長い間放置していたMacBook Proで、競技プログラミングをVSCodeでするための環境構築を行いました。
途中で困ったことなどをメモしていきます。

# VSCodeのインストール
[VSCode 公式](https://code.visualstudio.com/download)からダウンロードしてきます。
VSCodeを開いたら、C/C++用のプラグインをインストールします。（コンパイラではありません。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550283/ea88bdf8-ae9b-4205-ee7b-37d9c4b4ca93.png)
この写真と一致するものを見つけ、インストールしましょう。
また、同じように次の二つもインストールすると良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550283/dbe3a496-0758-4fa6-82e2-eda715cf32ca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550283/b3375571-1b4c-9e6c-f49f-332e8bc44157.png)

# コンパイラのインストール
Macにはもともと[（自分のことをGCCだと思っている精神異常）clang](https://qiita.com/hakatashi/items/f9d9abf05a002b5c4dc5#%E3%81%A7%E3%82%82%E7%92%B0%E5%A2%83%E4%BE%9D%E5%AD%98%E3%81%A3%E3%81%A6%E8%81%9E%E3%81%84%E3%81%9F%E3%82%88)がインストールされていますが、GCCを使いたい場合も多いと思います。（これは完全に個人的な感覚ですが、複雑なプログラムになればなるほどGCCの方が優秀です。）
まずは、HomeBrewをインストールします。

```zsh
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
そして、brew を使って gcc をインストールします。

```zsh
% brew install gcc
```
ここでインストールされる gcc は、gcc-9 という名前なので、シンボリックリンクを作って gcc や g++ で実行できるようにします。

```zsh
% ln -s /usr/local/bin/gcc-9 /usr/local/bin/gcc
% ln -s /usr/local/bin/g++-9 /usr/local/bin/g++
```
ここでインストールされた gcc は、 /usr/local/bin にあります。これに対し、もともとインストールされている gcc は /usr/bin にあるので、環境変数の順番がデフォルトのままであれば、brew でインストールした gcc/g++ が使えます。
一応、 which コマンドで確認しておいてください。

```zsh
% which gcc
/usr/local/bin/gcc
% which g++
/usr/local/bin/g++
```
これで、 gcc のインストールは完了です。

# デバッガのインストール
macOS Catalina では、gdbが使えません。
仕方ないのでlldbを入れたいんですが、僕はすでにXCodeを一度インストールしており、その時についてきたか何かでもともと入っていたのでうまくいくかわかりません。

すでに入っている人も多そうですから、

```zsh
which lldb
```
で存在を確認して、なかったら

```zsh
% brew install llvm --with-lldb
```
でできると思いますが、できなかったらごめんなさい。

# VSCodeの設定
VSCodeの設定をします。
基本的には、デバッグありの実行となしの実行ができるようにします。
### tasks.json の設定
まずは、`Command+Shift+P` でコマンドパレットを開き、`Tasks: Configure Task` を探します。
適当に進めると、ワーキングディレクトリ直下に `.vscode` が生成され、その中に `tasks.json` が生成されるはずです。
この `tasks.json` を、たとえば以下のように設定します。

```json
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: g++ debug build",
            "command": "/usr/local/bin/g++",
            "args": [
                "-O0",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "/usr/local/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```
ビルドコマンドを `usr/local/bin/g++` にするのを忘れないようにしましょう。
また、最適化を防ぐために -O0 オプションをつけておきましょう。（-Og も試しましたが、一部最適化されてしまう変数がありました）

### launch.json の設定
`Command+Shift+D` でデバッグメニューを開くと、次のような画面が表示されます。（実際は、デバッグ構成がない旨表示されるはずです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550283/9a82ebfd-11dd-6354-3576-b6b3797143de.png)
ここの歯車マークをクリックすると、launch.json が生成されます。
ここではデバッグに関する設定を行います。
次のように、先ほど設定したビルドタスクを行ってからデバッガを起動するようにするとよいです。

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(lldb) Launch",
            "type": "lldb",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "C/C++: g++ debug build"
        }
    ]
}
```
これで、F5ボタンでデバッグが開始できるようになります。
lldb の、CLI/GUIのデバッガが使えます。

これでデバッガを使ったデバッグができるようになりました。
デバッグなしの実行には、CodeRunner によって追加された、右上にある実行ボタンを押しましょう。

# おわりに
オンサイトコンテストなどにPCを持っていくには、持ち運びやすくて高性能なMacBookは最適だと思います。
Macでも競プロを楽しみましょう！（？）