()

Qiita Articles

公開記事のミラー・バックアップ

計算環境・Linux

オフライン環境のユーザーローカルにgcc-14.3.0を導入する

Qiita公開: · 元記事更新:
バックアップ取得:

筆者自身のQiita記事を転載しています。内容は取得時点の記録です。Qiitaの元記事 · 原文Markdownを保存

この記事の目次

gccはC言語、C++言語、Fortran言語などの複数言語のコンパイラ群の総称である。

もともとは「GNU C Compiler」の略だったが、今は「GNU Compiler Collection」の意味で使われている。

Red Hat Enterprise Linux などの長期サポートを意図した保守的なシステムでは、組み込みで利用できる gcc のバージョンは古い場合が多く、Pythonなどのパッケージ(特にC拡張を含むもの)を導入する際にgccが古すぎてコンパイルに失敗することがある。そのような場合、組み込みのgccとは別に、ユーザーローカルにバージョンの新しいgccをビルドする必要がある。


ここではgcc-4.8.5の環境で、ユーザーローカルにオフラインでgcc-14.3.0を入れる手順をまとめる。

2025年6月時点における最新のリリースはgcc-14.3.0である。
Cf. https://gcc.gnu.org/pub/gcc/releases/

大まかな手順は以下の通り。所要時間(待ち時間)が長いため、計画的に実施したい。

  1. 依存ライブラリのインストール(1時間程度)
  2. 中間バージョンのgccのインストール(1~4時間)
  3. 目的のバージョンのgccのインストール(1~4時間)

gcc-4.8.5を使って一気にgcc-14.3.0を導入しようとすると、バージョンがかけ離れているためコンパイルに失敗することがある。そこで、中間バージョンを経由する必要がある。

また、gccのコンパイルには依存ライブラリ(GMP、MPFR、MPC)が別途必要となるため、初めにインストールする必要がある。


【参考】ライブラリ不足時のエラー
gcc-6.5.0の場合
configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
their locations.  Source code for these libraries can be found at
their respective hosting sites as well as at
ftp://gcc.gnu.org/pub/gcc/infrastructure/.  See also
http://gcc.gnu.org/install/prerequisites.html for additional info.  If
you obtained GMP, MPFR and/or MPC from a vendor distribution package,
make sure that you have installed both the libraries and the header
files.  They may be located in separate packages.

①依存ライブラリのインストール

MPFRはGMPに依存しており、MPCはGMPとMPFRの両方に依存しているため、

GMP → MPFR → MPC

の順でインストールする。

ライブラリが不足していると ./configure の時点で

configure: error: MPFR version >= 4.1.0 required

などと怒られる。

ソースコードは以下のページからダウンロードできる。以下の3つが必要最低限のライブラリである。

https://gcc.gnu.org/pub/gcc/infrastructure/

  • gmp-6.2.1.tar.bz2
  • mpfr-4.1.0.tar.bz2
  • mpc-1.2.1.tar.gz

オンライン環境であれば
wget https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.2.1.tar.bz2
などとして取得できる。

ここではさらに以下のものも追加でダウンロードしておく。これらは必ずしも要る訳ではないが、islに関してはgccの性能を上げることができるので、ついでに入れておく。

  • gettext-0.22.tar.gz
  • isl-0.24.tar.bz2
  • mpich-3.2.tar.gz
  • opencoarrays-1.9.0.tar.gz

【参考】依存パッケージについて

最低限必要なライブラリは以下の通り。

  • GMP(GNU Multiple Precision arithmetic library):
    多倍長整数演算ライブラリ
  • MPFR(Multiple Precision Floating-Point Reliable Library):
    多倍長浮動小数点演算ライブラリ
  • MPC(Multiple Precision Complex Library):
    多倍長複素数演算ライブラリ

今回は追加で以下のものも利用する。

  • MPICH:
    並列計算用の標準的なMPI(Message Passing Interface)ライブラリ
  • opencoarrays:
    FortranのCo-array機能(分散メモリ並列化)を利用可能にするためのライブラリ
  • isl (integer set library):
    GCCなどのループ最適化で使われる、多面体モデルに基づく整数集合操作ライブラリ
  • gettext:
    ソフトウェアの多言語対応(国際化/i18n)を実現するための文字列翻訳ライブラリ

取得したすべてのソースコードを目的のサーバーにアップロードする。
ここでは$HOME/tmp/にソースコードを置き、$HOME/usr/local/に展開することにする。

ソースコードのアップロード先およびインストール先は任意だが、今後のことを考えれば多少は手間でも系統的に整理できていた方がよい。

makeは必要に応じて並列して効率化を図る。例えば、4並列の場合はmake -j4とすればよい。

さらに作業を加速したい場合、ビルドツリーの依存関係が存在しなければ、バックグラウンド処理にするなどしてパッケージを独立にインストールしてもよい。あるいは、複数のsshセッションを立ち上げて並行してインストールするのでもよい。(同じライブラリでない限り、基本的にはファイル名の衝突などは起こらないようになっている)

インストールのための一連のコマンド
# ソースコードをアップロードしたディレクトリへ移動
cd $HOME/tmp/

# gmpを最初にインストールする
tar xf gmp-6.2.1.tar.bz2
cd gmp-6.2.1
./configure --prefix="$HOME/usr/local/"
make
make install
cd ..

# この段階で .bashrc などに以下の行を追加して $HOME/usr/local/ にパスを通しておく
# export PATH=$HOME/usr/local/bin:$PATH
# export CPATH=$HOME/usr/local/include:$CPATH
# export LD_LIBRARY_PATH=$HOME/usr/local/lib:$HOME/usr/local/lib64:$LD_LIBRARY_PATH

# gmpの後にインストールする
tar xf mpfr-4.1.0.tar.bz2
cd mpfr-4.1.0
./configure --prefix="$HOME/usr/local/" --with-gmp="$HOME/usr/local/"
make
make install
cd ..

# gmpとmpfrの後にインストールする
tar xf mpc-1.2.1.tar.gz
cd mpc-1.2.1
./configure --prefix="$HOME/usr/local/" --with-gmp="$HOME/usr/local/" --with-mpfr="$HOME/usr/local/"
make
make install

### これ以降のライブラリはオプション

# mpichは gfortran/gcc が優先される状態でインストールする
# このときFortran用MPIラッパーもインストールするフラグを立てておく
tar xf mpich-3.2.tar.gz
cd mpich-3.2
./configure --prefix="$HOME/usr/local/" CC=gcc CXX=g++ FC=gfortran F77=gfortran
make
make install

# gmpの後にインストールする
tar xf isl-0.24.tar.bz2
cd isl-0.24
./configure --prefix="$HOME/usr/local/"
make
make install

tar xf gettext-0.22.tar.gz
cd gettext-0.22
./configure --prefix="$HOME/usr/local/"
make
make install

# mpichの後にインストールする (gcc-5.1以降が必須なので中間バージョンへのアップグレード後に実施する)
tar xf opencoarrays-1.9.0.tar.gz
cd opencoarrays-1.9.0
./configure --prefix="$HOME/usr/local/" CC=gcc CXX=g++ FC=gfortran F77=gfortran
make
make install

gettextライブラリに加えてさらにlibiconvライブラリをインストールしても良いが、glibcのiconv互換機能で十分なのでここでは省略する。

依存ライブラリを$HOME/usr/local/配下の個別ディレクトリにインストールした場合は、例えば以下のようにパスを通しておく。

# GMP
export LD_LIBRARY_PATH="$HOME/usr/local/gmp-6.2.1/lib:$LD_LIBRARY_PATH"
export CPATH="$HOME/usr/local/gmp-6.2.1/include:$CPATH"
export LIBRARY_PATH="$HOME/usr/local/gmp-6.2.1/lib:$LIBRARY_PATH"

# MPFR
export LD_LIBRARY_PATH="$HOME/usr/local/mpfr-4.2.1/lib:$LD_LIBRARY_PATH"
export CPATH="$HOME/usr/local/mpfr-4.2.1/include:$CPATH"
export LIBRARY_PATH="$HOME/usr/local/mpfr-4.2.1/lib:$LIBRARY_PATH"

# MPC
export LD_LIBRARY_PATH="$HOME/usr/local/mpc-1.3.1/lib:$LD_LIBRARY_PATH"
export CPATH="$HOME/usr/local/mpc-1.3.1/include:$CPATH"
export LIBRARY_PATH="$HOME/usr/local/mpc-1.3.1/lib:$LIBRARY_PATH"

# ISL
export LD_LIBRARY_PATH="$HOME/usr/local/isl-0.24/lib:$LD_LIBRARY_PATH"
export CPATH="$HOME/usr/local/isl-0.24/include:$CPATH"
export LIBRARY_PATH="$HOME/usr/local/isl-0.24/lib:$LIBRARY_PATH"

②中間バージョンのgccのインストール

ここではgcc-6.5.0を導入する。システム組み込みのgcc(ここではgcc-4.8.5)でコンパイルできるのであればバージョンは任意。ソースコードは以下のページから取得できる。

https://gcc.gnu.org/pub/gcc/releases/

新旧バージョンが混在することを避けるため、インストール先は $HOME/usr/local/gcc-6.5.0 としている。

インストール
tar xf gcc-6.5.0.tar.gz
cd gcc-6.5.0

./configure --prefix="$HOME/usr/local/gcc-6.5.0" --enable-languages=c,c++,fortran \
  --with-gmp="$HOME/usr/local" --with-mpfr="$HOME/usr/local" \
  --with-mpc="$HOME/usr/local" --with-isl="$HOME/usr/local" \
  --disable-multilib

make           # -j オプションを用いて並列するのが望ましい
make install

makeだけで1時間以上を要するので、実行するタイミングは吟味しておきたい。先ほど同様、makeは他のユーザーに影響しない範囲で並列するのがよい。

参考までに、筆者の環境ではmake -j4に121分、make installに5分を要した。

やむを得ない理由により時間不足で差し迫った状況なのであれば、./configure に --disable-bootstrap を付けてブートストラップモード(コンパイルされた自分自身を用いた再ビルドによる一貫性チェック)を無効にしてもよい。
デフォルトではブートストラップモードが有効となっており、3回目のビルドで得られたgcc(stage3)が最終的な出力となる。正確を期す方法ではあるものの一貫性チェックを行う手間があるため、ビルド時間は非ブートストラップ時の2~3倍となる。

導入先(ここでは$HOME/usr/local/gcc-6.5.0)にパスが通っている場合、gcc --versionとすれば新しいgccが導入出来ていることが確認できる。

gccのバージョン確認
$ gcc --version
gcc (GCC) 6.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

中間バージョンのgcc導入後は環境変数を更新しておく。

環境変数の設定
export CC=$HOME/usr/local/gcc-6.5.0/bin/gcc
export CXX=$HOME/usr/local/gcc-6.5.0/bin/g++
export FC=$HOME/usr/local/gcc-6.5.0/bin/gfortran
export F77=$HOME/usr/local/gcc-6.5.0/bin/gfortran

③目的のバージョンのgccのインストール

最後にgcc-14.3.0を導入する。手順は前段と同じ。ソースコードは先ほどと同じページから取得できる。

https://gcc.gnu.org/pub/gcc/releases/

インストール
tar xf gcc-14.3.0.tar.gz
cd gcc-14.3.0

./configure --prefix="$HOME/usr/local/gcc-14.3.0" --enable-languages=c,c++,fortran \
  --with-gmp="$HOME/usr/local" --with-mpfr="$HOME/usr/local" \
  --with-mpc="$HOME/usr/local" --with-isl="$HOME/usr/local" \
  --disable-multilib

make           # -j オプションを用いて並列するのが望ましい
make install

参考までに、筆者の環境ではmake -j4に181分、make installに5分を要した。

最後に、展開先の $HOME/usr/local/gcc-14.3.0 にパスを通しておく。中間バージョンのgcc導入後は環境変数を更新し、中間バージョンのgccのパスは必ず上書きする。

環境変数の再設定
export PATH=$HOME/usr/local/gcc-14.3.0/bin:$PATH
export CPATH=$HOME/usr/local/gcc-14.3.0/include:$CPATH
export LD_LIBRARY_PATH=$HOME/usr/local/gcc-14.3.0/lib:$HOME/usr/local/gcc-14.3.0/lib64:$LD_LIBRARY_PATH
export CC=$HOME/usr/local/gcc-14.3.0/bin/gcc
export CXX=$HOME/usr/local/gcc-14.3.0/bin/g++
export FC=$HOME/usr/local/gcc-14.3.0/bin/gfortran
export F77=$HOME/usr/local/gcc-14.3.0/bin/gfortran

上手く更新されていれば以下の出力が確認できる。

gccのバージョン確認
$ gcc --version
gcc (GCC) 14.3.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

以上の手順により、オフライン環境のユーザーローカルにgcc-14.3.0を導入することができる。