競プロ環境構築入門【M1&M2 Mac】

# はじめに
mdk_51 という ID で競プロをやっていたことがある者です。
JOI や JOIG などに参加していました。
受験でしばらく競プロを中断していたのですが、この春に大学進学が決まりました。
新しく PC を買い環境構築をしようとしているところで、せっかくなら記事にしようと思った次第です。

AtCoder のコードテストでやっていて自分の PC でも実行できるようにしたいと思ったけど PC の細かいことよくわからない、みたいな人をメインの対象にしています。

自分の PC で **コードを VSCode を使って書き、F5 キーを押すことでコンパイル＆実行され、入力すると出力が返ってくる**、というような環境の完成を目指します。

#### PC概要
- Apple M2
- macOS Ventura 13.0

# 0. 基本用語等
C++で書いたコードからコンパイラというもので実行ファイルが作られ、これを実行することで自分の書いたプログラムを動かすことができます。
このコンパイラとして今回インストールするのが `g++` というものです。
また、実行やコンパイルなどは Mac に元から入っている `ターミナル` から行います。
これはアプリ一覧の中の「その他」というタイトルのアプリフォルダにあります。
Dock に追加しておくと良いでしょう。

専門用語はよくわからなくても取り敢えず気にしなくて良いです。
気になったらググってみると良いと思います。

作業中にデベロッパツールが必要だとかいう画面が出てきたらインストールして下さい。（これがないとおそらくうまくいかないです。）
また、コマンドを実行したのにうまくいかないなどあればターミナルを再起動してみて下さい。


# 1. brewのインストール
https://brew.sh/index_ja

上のサイトにアクセスし、「インストール」の下にあるコマンドをターミナルにコピペします。
適宜管理者パスワードなどを入力して下さい。

完了したら以下のコマンドを実行して下さい。
(最初の % は入力不要です。)

```bash
% echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/【自分のユーザ名】/.zprofile
% eval "$(/opt/homebrew/bin/brew shellenv)"
```
`brew` と入力してたくさん表示されたらOKです。

# 2. g++のインストール
以下のコマンドを実行して下さい。

```bash
% brew install gcc
```

これでインストールはされたのですが、デフォルトでは Clang というコンパイラが使われるようになっているので設定を変更する必要があります。
以下のコマンドを実行してみると、Apple clang version 云々と出てくるはずです。
```bash
% gcc -v
```

まずは以下のコマンドで入っている g++ のバージョンを確認します。

```bash
% ls /opt/homebrew/bin/
```

2023/3/13日現在は `g++-12` でしたので、以降このバージョンで書こうと思います。別のバージョンの場合は適宜置き換えて下さい。

バージョンが確認できたら、こちらの g++ が実行されるように設定します。
以下のコマンドを実行して下さい。

```bash
% ln -s /opt/homebrew/bin/g++-12 /opt/homebrew/bin/g++
% ln -s /opt/homebrew/bin/gcc-12 /opt/homebrew/bin/gcc

% touch ~/.zshrc
% open ~/.zshrc
```

出てきたファイルの末尾（元々何もないなら1行目）に以下を追加して下さい。
```bash
export PATH=/opt/homebrew/bin:$PATH
```
ファイルを保存して閉じたら、以下のコマンドを実行して下さい。
```bash
% source ~/.zshrc
```

これで完了したはずです。
`which gcc` と実行した時に、`/opt/homebrew/bin/gcc` と表示されたら成功です。
ひとまずお疲れ様でした。

# 3. VSCodeのインストール
エディタの Visual Studio Code を以下のサイトからインストールします。

https://azure.microsoft.com/ja-jp/products/visual-studio-code

スタートアップ画面は適当にしておいて、日本語と C/C++ の拡張機能は入れておきましょう。
横の5つ並んでるアイコンの一番下のやつからできます。

# 4. VSCodeの設定
ここからまた長いです。ぴえん
## ショートカットの設定
キーボードショートカットを設定して、F5でコンパイルと実行が一度にできるようにします。

まずは `Ctrl + Shift + P` でコマンドパレットを開いて `key` と入力し、`基本設定：キーボードショートカットを開く（JSON）` を選択します。

すると `keybindings.json` が開くはずです。
そのファイルに以下のように書き込んで保存しましょう。

```keybindings.json
[
    {
        "key": "F5",
        "command": "workbench.action.terminal.sendSequence",
        "args": {
            "text": "cd ${fileDirname} && g++ -std=gnu++17 ${file} \n ./a.out \n"
        }
    }
]
```

適当な C++ コードを作って保存し、下のターミナルタブを開き、F5 を押して実行されたら成功です。

## bits/stdc++.h を VSCode に認識させる
以上で実行はできるようになったのですが、このままだと VSCode が bits/stdc++.h を認識していないのでずっと警告を出してきます。これを解消します。

以下のように実行して下さい。
```bash
# bits/stdc++/h を探します
% cd /opt/homebrew 
% find . -name "stdc++.h"
#　<ここに文字列が表示されるはずです>

# 浅い位置に持ってきます
% mkdir ./include/bits
% cp <上の文字列> ./include/bits
```
これでターミナルでの準備ができました。

VSCode に移り、先ほどと同じように `Ctrl + Shift + P` でコマンドパレットを開きます。
`c edit`と入力し、`C/C++: 構成の編集(JSON)` を選択して下さい。

出てきたファイルを以下のようにします。
やることとしては
- includePath の所に `"/opt/homebrew/include/**"` を追加（上の行の `,` も忘れずに！）
- compilerPath を `"/opt/homebrew/bin/g++"` に変更
- intelliSenseMode を `"macos-gcc-arm64"` に変更

となっています。

```c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**",
                "/opt/homebrew/include/**"
            ],
            "defines": [],
            "macFrameworkPath": [
                "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
            ],
            "compilerPath": "/opt/homebrew/bin/g++",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "macos-gcc-arm64"
        }
    ],
    "version": 4
}
```
保存し、VSCode を再起動しましょう。
VSCode が bits/stdc++.h がないと言わなくなったらOKです。

## その他の設定
これで終わりです。（この作業はなくても支障はそんなにないです。デバッガを使えるようにするためのものです。）
横の5つ並んでいるアイコンの下から2番目のものを選択します。
`launch.json ファイルを作成します。`というところをクリックし、上の方を選択したら、以下をコピペして下さい。

```launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/a.out",
            "args": [],
            "stopAtEntry": true,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "logging": {
                "trace": true,
                "traceResponse": true,
                "engineLogging": true
            }
        }
    ]
}
```
右上のアイコンのうち ▷ のようなものを選択し、`g++-12アクティブファイルの...` というものを選びましょう。

これで終わりです。お疲れ様でした。

# 終わりに
なんか長くなってしまいましたが、一応これで普通に競プロをする時には不自由がない環境が構築できたはずです。
M1 や M2 の Mac での環境構築記事はまだそんなに多くなく、それより前の Mac とは仕様が異なるところもあり、（g++ の入っている場所など）私も思っていたより時間がかかりました。
環境構築で詰まっているどなたかのお役に立てたら幸いです。


# 参考にしたサイト
https://chigusa-web.com/blog/homebrew/

https://persimmonblog.com/guide-for-setting-up-environment-for-m1mac/#gcc%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E7%B7%A8

https://ossyaritoori.hatenablog.com/entry/2019/11/17/VSCode%E3%81%A7%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%81%8B%E3%82%89%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A#keybindingsjson%E3%82%92%E9%96%8B%E3%81%8F

https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6#51-stdch%E3%81%AE%E6%BA%96%E5%82%99

https://qiita.com/hayapo/items/21032ae726ed15b11563#intellisense%E3%81%ABbitsstdch%E3%82%92%E8%AA%8D%E8%AD%98%E3%81%95%E3%81%9B%E3%82%8B

https://qiita.com/tom_sapiens/items/c4c4b7de2201272a94db#tasksjson%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B