Macbookの競プロ環境構築メモ

Arm Mac (M1 ~ M3など) で競技プログラミング用のC++環境構築を行うためのメモです。
Macbook Air M2(2022)　Mac OS 14.2 + Visual Studio Code を用いています。

:::note info
Macだと、以下を行っても実行時に  
`fatal error: assert.h: No such file or directory`
といったエラーが出ることがあります。

これは `glibc` というライブラリがBrewのgccには含まれておらず、MacのCommand Line Tool でインストールされるためです。XCodeを再インストールすると直ります。[参考記事](https://github.com/orgs/Homebrew/discussions/3822)
:::
# 0. 必要なもの

まず、パッケージ管理ソフトの `homebrew` が必要です。
Launchpadから「ターミナル」アプリを開いて、出てきた画面に以下のコマンドをコピペしましょう。

```bash
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
インストール途中に「ダウンロードを続行するにはEnter」みたいなメッセージが出るので、Enterを押してあげます。

次に、Visual Studio Code そのものをインストールします。

https://code.visualstudio.com/

上のリンクから「Download for MacOS」をクリックし、ダウンロードしたdmgファイルを開きます。あとは指示に従えばインストールが完了します。

# 1. GCCを通す
MacbookでGCCを呼ぶと、なぜかClangが呼ばれることが知られています。これを回避するためにHomebrew経由でGCCをインストールし、シンボリックリンクを貼って真のGCCが呼ばれるようにします。
これは競プロに関係なくやっておいた方がよいです（インストール中にGCCを呼ぶソフトウェアすべてが不安定になるため）

手順は以下の記事を参考にしています。
    https://qiita.com/cubinglover/items/5b4d05ca0f77c60f1d79

まず、ターミナルで brew を用いて gcc をインストールします。

```bash
% brew install gcc
```

インストールが終わったら以下のコマンドを打ってみます。

```bash
% gcc -v
```

すると、以下のようなメッセージが表示されるはずです。

```
% gcc -v
Apple clang version 15.0.0 (clang-1500.0.40.1)
Target: arm64-apple-darwin24.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
```

このように、gccをインストールしたはずがgccではなくclangが呼び出されます。これを回避するために、シンボリックリンクを通します。まずはバージョンを調べます。
```bash
% brew list gcc
```

を打つと、`.../gcc/14.2.0/...` のような文字列が並んでいるはずです。この場合、バージョン14です。

次のコマンドを打ちます。 `gcc-` と `g++-` のあとの数字がバージョンなので、バージョン14でない場合は、 `gcc-15`, `gcc-16` などに変えてください。

```
% ln -s /opt/homebrew/bin/g++-14 /usr/local/bin/g++
% ln -s /opt/homebrew/bin/gcc-14 /usr/local/bin/gcc
```

これを打って、再度 `gcc -v` します。
このとき、 `gcc version 14.2.0 (Homebrew GCC 14.2.0) ` というような表示が出たら成功です。`Apple Clang Version...` という表示が出たら、シェルのキャッシュが悪さをしている可能性があります。`rehash` (csh系やzshなど)、`hash -r` (bashなど) でキャッシュをクリアしてから再度 `gcc-v` を実行してみましょう。相変わらず `Apple Clang Version...` という表示が出たら、おそらくgccのインストールに失敗しています。遡ってエラーを確認しましょう。



# 2. Atcoder Library を入れる
https://github.com/atcoder/ac-library からダウンロードします。
これを使う時、実行ファイルのあるディレクトリに置いてコンパイルオプションを付けて読み込ませるか、includeフォルダに入れて読み込ませるかの2つ方法があります。前者だとCode Runner（後述）やlaunch.json, tasks.jsonの設定を変える必要があって面倒なので、直接includeフォルダに入れます。
`gcc -v` を打つとgccのあるフォルダ（`/opt/homebrew/opt/gcc/`など）を教えてくれるので、他のヘッダファイルと同じ場所に置きます。

なお、自分の環境では `/opt/homebrew/Cellar/gcc/14.2.0/include/c++/14` でした。

# 3. 拡張機能 Code Runner の設定をする
Code Runnerはワンクリックでコンパイル + 実行をやってくれる拡張機能です。デフォルトだと単にgccを呼ぶだけなので、必要に応じてコンパイルオプションを書き足します。普段つけているのは、`-O2` （最適化レベルを上げる）と `-Wall` （すべての警告を表示）です。
実際にAtcoder上で実行されるコマンドは https://atcoder.jp/contests/APG4b/rules?lang=ja に書かれていますが、ここにも`-O2` が付いているので`-O2`は付けて問題ないです。むしろ、これがないとAHC等で、本来間に合うコードなのに手元だと間に合わない、ということが置きてしまいます。

# 4. デバッガの設定をする
CodeLLDBの拡張機能を入れ、`tasks.json`と`launch.json`を編集しておきます。
```tasks.json
{
    // tasks.json 形式の詳細についての資料は、
    // https://go.microsoft.com/fwlink/?LinkId=733558 をご覧ください
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "c_build",
            "command": "gcc",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build"
        },
        {
            "type": "cppbuild",
            "label": "cpp_build",
            "command": "/usr/local/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-O2",
                "-Wall",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build",
            "detail": "コンパイラ: /usr/local/bin/g++"
        }
    ]
}
```

```launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "c_debug",
            "type": "lldb",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "cwd": "${fileDirname}",
            "preLaunchTask": "c_build"
        },
        {
            "name": "cpp_debug",
            "type": "lldb",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "cwd": "${fileDirname}",
            "preLaunchTask": "cpp_build",
        }
    ],
    "setupCommands": [
        {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
        }
    ]
}
```

# 5. その他の拡張機能を入れる

完全に好みですが、自分はこのあたりを入れています。

Better C++ Syntax(https://marketplace.visualstudio.com/items?itemName=jeff-hykin.better-cpp-syntax)
Clang Format（https://marketplace.visualstudio.com/items?itemName=xaver.clang-format）
C/C++ Extension Pack　（https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools-extension-pack）

また、online-judge-tools と Atcoder-cli を入れておくと便利です。Windowsと違い、WSLを使わずに直接インストールできるのも嬉しいです。
https://qiita.com/Adaachill/items/3d4ddad56c5c2cc372cd