【備忘録】M1 MacでGCC環境を構築する


まえがき

10月から研究室に配属されるのですが、ドライ解析の研究室であるため近頃シェルスクリプトやターミナル管理の勉強など夏休みに細々とやっていました。

同時に基礎的なプログラミング文法程度は必須でかつバイオインフォ系の解析ソフトウェアではpythonやC++が多く使われているため、基本だけでも抑えておこうと最近atcoderの入門教材で勉強して、付属の問題やコンテストのA問題を解いていたところ、友人から「ojt (online-judge-tool)使うと便利だよ」との啓示を受けたので、Mac内に環境を構築しようと思い至りました。

atcoder(というかおそらく競プロ界隈)では諸々の理由でbits/stdc++.hを記述することでC++の標準ライブラリを一気に使えるようにしています。(この記事が詳しいです)

Macには標準でClangというコンパイラが入っていますが、先述したヘッダファイルはClangでは使えずgccを導入しないといけない...という経緯で今回gcc環境を構築しようとなりました。
ただ少々覚えておきたいことがあったので、ここに備忘録として書いておきます。

*他の方の目にも触れるかもしれませんが、構築が終わった後に書いていて作業ログなどを保存していたわけではないので、全部の出力は以下に書き出せていませんごめんなさい。

環境

・MacBook Air (M1 2020)

$ sw_vers
ProductName:    macOS
ProductVersion: 11.6
BuildVersion:   20G165

手順1.brewでgccをインストール

$ brew install gccでインストールされるはず。

手順2.シンボリックリンクの作成

先立ってインストールしたgccですが、これはm1 macの場合/opt/homebrew/bin/にインストールされるはずです。
しかしこの時点で実際にコンパイラがどこにあるかを尋ねてみるとおそらくは

$ which g++
/usr/bin/g++

と返されます。これは先述したmacのClangの場所であり、普通にインストールしてg++ -vとしてもおそらくこのClangのバージョン情報が提示されると思います。

これを避けるためにhomebrew以下にある実行ファイルを指定して、以下のようにシンボリックリンクを作成することでgccを使用することができるはずです。

$ ln -s /opt/homebrew/bin/gcc-{num} /usr/local/bin/gcc

/opt/homebrew/bin/gcc-{num}{num}の部分は自分がbrewでインストールしたgccのバージョンを指定してやってください。

ただこの時、PATHにおいてClangがある/usr/bin/よりも上のシンボリックファイルを置いた/usr/local/binの方が、優先順位が高くなるようにしておくことを忘れないようにしましょう。

$ echo $PATH としたとき、/usr/local/bin:/usr/bin:*のようにシンボリックファイルが存在するディレクトリのパスがClangのそれよりも左側に記載されていれば優先的に実行されます。

逆にClangのあるフォルダパスより右側に記載されている場合、$ g++とコマンドを打った場合にClangのあるディレクトリが先に探索されて実行されるのでそれを避けるという点に留意しておいてください。

手順3.GCCが実行できるか確認

コマンドの場所やバージョンなどを観てみると私の場合以下のようになっていました。
brewで入れたgccが動いていることが確認できます。

$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/opt/homebrew/Cellar/gcc/11.2.0/libexec/gcc/aarch64-apple-darwin20/11.1.0/lto-wrapper
Target: aarch64-apple-darwin20
Configured with: ../configure --prefix=/opt/homebrew/Cellar/gcc/11.2.0 --libdir=/opt/homebrew/Cellar/gcc/11.2.0/lib/gcc/11 --disable-nls --enable-checking=release --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-11 --with-gmp=/opt/homebrew/opt/gmp --with-mpfr=/opt/homebrew/opt/mpfr --with-mpc=/opt/homebrew/opt/libmpc --with-isl=/opt/homebrew/opt/isl --with-zstd=/opt/homebrew/opt/zstd --with-pkgversion='Homebrew GCC 11.2.0' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --build=aarch64-apple-darwin20 --with-system-zlib --disable-multilib --with-native-system-header-dir=/usr/include --with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.1.0 (Homebrew GCC 11.2.0) 

$ which g++
/usr/local/bin/g++

*今回とりあえずバージョン指定などしなかったので私のgccのバージョンは11になっています

以上で大体の流れとしては終わりです。

あとがき

今回構築するにあたり、少し注意しなければいけないと思った点がありました。m1 macではそれ以前のintelチップのmacと異なり、homebrewでインストールしたモノのある場所が/opt/homebrew/bin/になっている1ということ事実は今後も覚えておく必要があると思いました。

(エンジニアじゃないからとかでなく)使うならこういう公式の記述などをちゃんと日夜チェックしておくのも大事だなと個人的に痛感しました。

また、今回構築するにあたりこの記事よりも遥かに丁寧に解説してくださっている記事2があったのでそこを頼りに私も構築しました。本当にありがとうございます。

参考文献