オフライン環境で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になっていることを確認し、

```c
#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!
```
が出力されれば成功です。
お疲れ様でした。