進捗置き場というわけでもない場所

プログラミングしてる中で見つけたこととか

gcc の HEAD をビルドするときの備忘録

Hyper-V 上の仮想環境を消して WSL2 に移行しようとしたら色々環境構築を忘れていたのでメモ。

Wandbox のビルドスクリプト を非常に参考にしている (というかほぼ丸パクリ)。備忘録なので許して。

環境は Ubuntu on WSL2 だが、apt を適当なパッケージマネージャに置き換えれば他のディストリでも問題ない気がする。

前準備

適当なディレクトリを作って移動する。今回は~/gcc-head/

mkdir gcc-head
cd gcc-head

ソースを持ってくる

github のミラーからsourceディレクトリにソースを持ってくる。 このとき--depth 1をつけると最新コミットだけ持ってくるので clone が速くなる。

git clone --depth 1 https://github.com/gcc-mirror/gcc.git source

必要なもののインストール

gcc にはビルドに必要なツールを一括で入れる方法が用意されている…と思いきや、なぜか flex だけインストールされなかったので追加で apt install する。

cd source
./contrib/download_prerequisites
sudo apt install flex
cd ..

contrib/download_prerequisitesが (名前の通り) 必要なものを一括で入れてくれるものなのだが、最初にcd sourceしておかないと動いてくれないので注意。

終わったらsourceから出ている。

スクリプトを書く

後はほぼビルドするだけなのだが、コマンドが長いので適当なスクリプトファイルに書いてから実行したほうが良いと思う。上記の wandbox のスクリプトを参考にしつつ以下のようなスクリプトを書いてbuilder.shとして保存。

PREFIX="$HOME/bin"

mkdir build
cd build

../source/configure \
  --prefix=$PREFIX \
  --enable-languages=c,c++ \
  --disable-multilib \
  --without-ppl \
  --without-cloog-ppl \
  --enable-checking=release \
  --disable-nls \
  --enable-lto \
  LDFLAGS="-Wl,-rpath,$PREFIX/lib,-rpath,$PREFIX/lib64,-rpath,$PREFIx/lib32"

make -j2
make install

環境変数 PREFIX で指定したディレクトリ以下にインストールされるので/usr/localなりに適当に変えると良さそう。オプションの雑な意味としては以下。gcc のページ を見るとちゃんとした解説があるのでそちらを見たほうが良い。

オプション 説明
--enable-languages=c,c++ C と C++ のみ有効にする
--disable-multilib 64bit 向けのバイナリのみを吐けるようにする *1
--without-ppl PPL という古の幾何計算ライブラリっぽいのを使わなくなる
--without-cloog-ppl ほぼ同上
--enable-checking=release ビルドしたバイナリに余計なデバッグ機能を含めない
--disable-nls 診断メッセージの言語としてアメリカ英語以外を使えなくなる
--enable-lto リンク時の最適化を有効化する
LDFLAGS=... リンク用のディレクトリを指定する。-Wl は以降の , を半角スペースに置換してくれる

インストールする

. builder.sh

としていっぱい待つと$PREFIX/bin以下にバイナリができている。

*1:32bit 環境をターゲットに開発したいならそれ用の libc などを入れておく必要がある