CentOS 8で様々なバージョンのGCCをビルドしてみた

## はじめに

色々頑張りましたが、
[CentOS8へCentOS7のcompat-gcc-44-4.4.7をインストール - Qiita](https://qiita.com/tukiyo3/items/78c1b9351d3cd855847b)で問題が解決しました。

また、標準のGCC8.2.1でも以下のいずれかを指定することでruby以外うまく行きました。

```sh
CXXFLAGS="-std=gnu++98"

CXXFLAGS="-std=gnu++03"

CXXFLAGS="-std=c++98"
```

* メモ：言語規格のデフォルト指定が GCC5 から変わった
    * https://gcc.gnu.org/gcc-5/changes.html
    * GCC 4.xまで : `-std=gnu89`
    * GCC 5から : `-std=gnu11`

![スクリーンショット_2019-10-30_12-32-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/7ec43bd6-882f-e70e-9282-0cdb00c0bd22.png)

* [C++ - Wikipedia](https://ja.wikipedia.org/wiki/C%2B%2B)によると C++98 のマイナーアップデートが C++03 の様子。その次の大きなメジャーアップデートが C++11/14/17
* [処理系 - cpprefjp C++日本語リファレンス](https://cpprefjp.github.io/implementation.html) によると、 GCC 6.1以降は、C++14がデフォルトとなる
* [GCC拡張の無効化 (と、それにまつわる細かい話) - 簡潔なQ](https://qnighy.hatenablog.com/entry/2015/09/26/192104) によると、C標準と、GNU独自の矛盾する拡張機能がある様子。

以下メモ


## ビルド結果

[rpm作りました。](https://github.com/tukiyo/centos8-gcc/releases/tag/official-gcc8.2.1)使うときは

```sh
yum groupinstall -y -q "Development Tools"

export CC=/opt/gcc-6.5.0/bin/gcc
export CXX=/opt/gcc-6.5.0/bin/g++

yum remove -y gcc c++

update-alternatives \
 --install /usr/bin/gcc gcc /opt/gcc-6.5.0/bin/gcc 20 \
 --slave   /usr/bin/g++ g++ /opt/gcc-6.5.0/bin/g++
```

で hello.c がコンパイル成功。

```c:hello.c
#include <stdio.h>

int main(void)
{
	printf("hello, world\n");
	return 0;
}
```


CentOS8標準のGCC8.2.1でビルドした結果

| GCC | ビルド | compiler |
|:--|:--:|:--:|
| 4.3.6 | x | 8.2.1 |
| 4.4.7 | x | 8.2.1 |
| 4.5.4 | x | 8.2.1 |
| 4.9.4 | x | 8.2.1 |
| 5.5.0 | x | 8.2.1 |
| 6.5.0 | o | 8.2.1 |
| 7.4.0 | o | 8.2.1 |
| 8.3.0 | o | 8.2.1 |
| 9.2.0 | o | 8.2.1 |


CentOS8でビルドした GCC 6.5.0 を使ってビルドした結果

| GCC | ビルド | compiler |
|:--|:--:|:--:|
| 4.9.4 | x | 6.5.0 |
| 5.5.0 | x | 6.5.0 |

CentOS7でビルドした GCC 4.4.7 を使ってビルドした結果

| GCC | ビルド | compiler |
|:--|:--:|:--:|
| 3.4.6 | x | 4.4.7 |
| 4.4.7 | x | 4.4.7 |
| 5.5.0 | x | 4.4.7 |
| 6.5.0 | x | 4.4.7 |

```sh:環境(CentOS8.0.1905)
[root@82876b25c48b src]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --disable-libmpx --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 8.2.1 20180905 (Red Hat 8.2.1-3) (GCC) 
```

```Dockerfile:Dockerfile.centos8
FROM centos:centos8

RUN yum groupinstall -y -q "Development Tools" && yum clean all
WORKDIR /usr/local/src/
RUN yum install -y gmp-devel mpfr-devel ncurses-devel wget wget zlib-devel


#----------
# fpm
#----------
RUN yum -y install ruby ruby-devel ruby-libs rubygems rpm-build \
 && gem install fpm --no-rdoc --no-ri

#----------
# gcc 6.5.0
#----------
COPY ./files.centos8/gcc-6.5.0.tar.gz gcc-6.5.0.tar.gz 
RUN tar xzf gcc-6.5.0.tar.gz 
WORKDIR /usr/local/src/gcc-6.5.0/
RUN ./contrib/download_prerequisites

# --disable-bootstrap
RUN ./configure \
 --prefix=/opt/gcc-6.5.0 \
 --with-bugurl=http://bugzilla.redhat.com/bugzilla \
 --enable-bootstrap \
 --enable-shared \
 --enable-threads=posix \
 --enable-checking=release \
 --with-system-zlib \
 --enable-__cxa_atexit \
 --disable-libunwind-exceptions \
 --enable-gnu-unique-object \
 --enable-languages=c,c++ \
 --disable-dssi \
 --enable-libgcj-multifile \
 --with-ppl \
 --with-cloog \
 --with-tune=generic \
 --disable-multilib \
 --build=x86_64-redhat-linux

RUN make -s
RUN make install

RUN fpm -s dir \
  -v 6.5.0 \
  -t rpm \
  -n opt-gcc-6.5.0 \
  -p opt-gcc-6.5.0.el8.x86_64.rpm \
  -C /opt/gcc-6.5.0 \
  --prefix /opt/gcc-6.5.0 \
  -a x86_64 \
  .

#-------------
# alternatives
#-------------
RUN yum remove -y gcc gcc-c++ \
 && update-alternatives \
 --install /usr/bin/gcc gcc /opt/gcc-6.5.0/bin/gcc 20 \
 --slave   /usr/bin/g++ g++ /opt/gcc-6.5.0/bin/g++
ENV CC=/opt/gcc-6.5.0/bin/gcc
ENV CXX=/opt/gcc-6.5.0/bin/g++
```

## 失敗 ( GCC 8.2.1 )

### GCC 4.3.6

![4.3.6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/c8a129c9-fea7-364b-007b-05bf1cedea88.png)


### GCC 4.4.7

* http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.4.7/

```sh
# configure: error: Building GCC requires GMP 4.1+ and MPFR 2.3.2+.

yum install -y \
  gmp-devel mpfr-devel
```

```sh:4.4.7
./configure \
 --enable-languages=c,c++ \
 --prefix=/opt/gcc-4.4.7 \
 --disable-bootstrap \
 --disable-multilib
```

```sh:
export CXXFLAGS="-std=c++0x"

make -s
```

![4.4.7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/0cdabc2d-b5e9-b587-f104-6a6279377d19.png)


### GCC 4.5.4

```sh
# ./contrib/download_prerequisites が無いため、 GCC 4.6.4 の中から持ってくる。

./contrib/download_prerequisites

./configure \
 --enable-languages=c,c++ \
 --prefix=/opt/gcc \
 --disable-bootstrap \
 --disable-multilib
```

![err.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/89dc2aac-0894-095b-134f-d7005d7b29bf.png)


### GCC 4.9.4

![4.9.4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/8cc36e90-794b-97cd-6efa-f6ad35dbc1a8.png)


### GCC 5.5.0

![5.5.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/eca0b8c0-7ca6-44d7-ebef-b87dd6e698d4.png)

## 成功 ( GCC 8.2.1 )

### GCC 6.5.0

```sh:6.5.0
./contrib/download_prerequisites

./configure \
 --enable-languages=c,c++ \
 --prefix=/opt/gcc \
 --disable-bootstrap \
 --disable-multilib

make -s
make install
```

![6.5.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/bf0725bc-591d-f998-97ea-6185e19b3a06.png)

![6.5.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/85ff3456-b051-2724-ddb6-d14d75aac1fd.png)


### GCC 7.4.0

![7.4.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/2a60a0e3-2955-4241-3303-af938286ae70.png)
![7.4.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/06fa7df4-fa96-a539-f4cd-a366f78e29d6.png)

### GCC 8.3.0

![8.3.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/d60ff2fa-de57-da90-c43a-553497fa3e7d.png)
![8.3.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/91aa3705-e7ed-6993-bcca-f603ac553ecf.png)


### GCC 9.2.0

![9.2.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/8696ba53-02e1-8c5f-9220-485a7905a9df.png)
![9.2.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/fee4cb38-2867-5a41-da29-5380502a5109.png)


## 失敗 ( GCC 6.5.0 )

### GCC 4.9.4

![gccerror.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/caeb7bed-f4b6-c088-9bf0-a4727adb564e.png)

### GCC 5.5.0

![550.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/ab3772d7-eb69-a5d3-f0e1-cba0cfc44272.png)


## その他

### testgen

* [testgen](https://ist.ksc.kwansei.ac.jp/~ishiura/pub/testgen/)を使ってテストするのも良いかも
* [GCC 4.5.1をビルドする - syohex’s diary](http://syohex.hatenablog.com/entry/20110122/1295678868)

```sh:使用方法
yum install -y dejagnu

tar xf testgen20070902.tar.bz2

cd testgen20070902

# tgen.confのデータ長の情報を編集. longを 8byteにする
./bin/tgen.pl ./template/*.tt

cd testsuite
# 時間がかかる
./RUNTEST
```

### testgen2

* [testgen2](https://ist.ksc.kwansei.ac.jp/%7Eishiura/pub/testgen2/index.html)

```sh
sudo yum install -y perl-Time-HiRes

unzip testgen20070902.zip
cd testgen20070902

perl bin/tgen.pl --config=config/tgen.cnf template/*.tt
cd testsuite/
# 時間がかかる
./runtest.pl
```

![スクリーンショット_2019-10-08_13-54-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/5b008a3b-7e30-3594-276d-ee57e26f28e8.png)
<img width="732" alt="スクリーンショット 2019-10-10 17.44.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/d56a969b-e347-1429-c242-a004b089c653.png">


### mysql 4.0.30

```sh
export CXXFLAGS="-std=c++98"
```

でビルド成功した。