Fortran
GCC
gfortran

オフライン環境でgcc 8.3.0をソースからビルドする

以下のような状況でgcc 8.3.0をソースからビルドしました。


状況


  1. インターネット接続なし

  2. root権限なし

  3. デフォルトのgccのバージョンが低い(gcc-4.8.5)

  4. Linux

昨今は情報漏洩等の関連でインターネット接続なしの計算機で機械学習等を行うことも多いと聞きます。

また、そのような場合にはroot権限がないこともあるでしょう。

また、gccのバージョンが4.xだったり古い場合もあるでしょう。

一方、新しいバージョンのgccが必要なことも多いと思います。

このような環境のもと


  1. gccの最新版(8.3)をオフライン環境でroot権限なしでソースからビルド
    ということを行いました。

参考:

http://buko106.hatenablog.jp/entry/2017/08/09/232356


gccのインストール


ソースコードの取得

まず、インターネットに接続できるマシンを用意します。

ここではMacを用いています。

gcc-8.3.0をどこかのミラーサイトからダウンロードします。

wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-8.3.0/gcc-8.3.0.tar.gz

次に、gccが必要とするものをダウンロードします。

そのバージョンのgccが必要とするものは、gccを解凍した中に

contrib/download_prerequisites

に書いてありますので、テキストファイルで開くと見つかります。

8.3.0では

gmp='gmp-6.1.0.tar.bz2'

mpfr='mpfr-3.1.4.tar.bz2'
mpc='mpc-1.0.3.tar.gz'
isl='isl-0.18.tar.bz2'

とあります。

別のgccのバージョンではgccを解凍して中身を見て確認しましょう。

上に挙げられた四つをダウンロードします。

wget https://ftp.gnu.org/gnu/gmp/gmp-6.1.0.tar.bz2

wget https://ftp.gnu.org/gnu/mpfr/mpfr-3.1.4.tar.bz2
wget https://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz
wget https://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2

ここでダウンロードした5つのファイルを、何らかの方法で対象とするオフラインのマシンにコピーします。


依存関連ソフトウエアのインストール

これからは全て対象とするオフラインマシン上で行います。OSはLinuxであるとします。

まず、ホームディレクトリ上に

mkdir src

と新しいディレクトリを作り、そこに5つのファイルをコピーします。

また、gccその他のインストール先として、

mkdir mygcc

というディレクトリを作っておきましょう。名前はなんでも構いません。

ファイルをコピーしましたら、srcディレクトリに移動し、

tar -xvf gmp-6.1.0.tar.bz2

tar -xvf mpfr-3.1.4.tar.bz2
tar -xvf mpc-1.0.3.tar.gz
tar -xvf isl-0.18.tar.bz2

と四つのファイルを解凍します。


gmp

まずgmpをインストールします。

cd gmp-6.1.0/

として、

./configure --prefix=$HOME/mygcc --enable-cxx

make
make check
make install
cd ..


mpfr

次にmpfrをインストールします。

cd mpfr-3.1.4/

./configure --prefix=$HOME/mygcc --with-gmp=$HOME/mygcc
make -s -j4
make -s check
make install
cd ..


mpc

次にmpcをインストールします。

cd mpc-1.0.3/

./configure --prefix=$HOME/mygcc --with-gmp=$HOME/mygcc --with-mpfr=$HOME/mygcc
make -s -j4
make check -s -j4
make install
cd ..


isl

最後に、islをインストールします。

cd isl-0.18/

./configure --prefix=$HOME/mygcc --with-gmp-prefix=$HOME/mygcc
make -j4
make check
make install
cd ..


gccのビルド

次は、gccをビルドします。

まず、解凍し、移動します。

tar -xvf gcc-8.3.0.tar.gz

cd ./gcc-8.3.0/

次に、ビルド用のディレクトリを作ります。

mkdir build

cd build

gccをビルドするにはいくつかの環境変数をリセットしておかないといけないようです。また、islを呼ぶためにLD_LIBRARY_PATHが必要です。

したがって、makeは

../configure --disable-multilib --enable-languages=c,c++,fortran --prefix=$HOME/mygcc --with-gmp=$HOME/mygcc --with-mpc=$HOME/mygcc --with-mpfr=$HOME/mygcc --with-isl=$HOME/mygcc

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE
LD_LIBRARY_PATH=$HOME/mygcc/lib make -j4
make install

のようになります。j4の4は並列処理の数ですので、計算機のCPUコアの数にしておくとより早く終わります。

かなり時間がかかりますので、makeを始めたら放っておきましょう。

なお、このmakeではgfortranもコンパイルしています。

インストールが終わったら、~/.bashrc

export PATH=$HOME/mygcc/bin:$PATH

export LD_LIBRARY_PATH=$HOME/mygcc/lib64:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$HOME/mygcc/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=$HOME/mygcc/lib64:$LIBRARY_PATH
export LIBRARY_PATH=$HOME/mygcc/lib:$LIBRARY_PATH

と追記しておきましょう。これでloginし直すかsource ~/.bashrc

使えるようになります。

gcc -v

でバージョンを確認して、8.3.0になっていることを確認し、

#include <stdio.h>


int main(int argc, char *args[])
{
printf("Hello, world!\n");
return 0;
}

というファイルをhello.cと保存して、

gcc -o hello hello.c

./hello

を行なって、

Hello, world!

が出力されれば成功です。

お疲れ様でした。