複数バージョンGCCインストールとその切り替えmoduleコマンド

GCCを複数バージョンインストールして、moduleコマンドで切り替えて使う方法です。

CentOS8.2で確認しました。

GCCのキットのダウンロードは、GNU GCCのサイトからダウンロードしてください。

ミラーサイトをみればダウンロードできると思います。

インストールの方法は、GCCのサイトをみてください。

ここでは、/home/gccにキットをダウンロードして解凍したところから始めます。

できるだけrootでオペレーションせず、sudoコマンド使いましょう。www

[root@apple gcc]#
[root@apple gcc]# pwd
/home/gcc
[root@apple gcc]#
[root@apple gcc]#
[root@apple gcc]# ls
gcc-10.2.0 gcc-10.2.0.tar gcc-7.5.0 gcc-7.5.0.tar gcc-8.4.0 gcc-8.4.0.tar gcc-9.3.0 gcc-9.3.0.tar
[root@apple gcc]#
[root@apple gcc]# ls -al
合計 2519332
drwxr-xr-x 6 root root 160 9月 14 12:25 .
drwxr-xr-x. 5 root root 41 9月 14 10:56 ..
drwxr-xr-x 36 hoge users 4096 7月 23 15:50 gcc-10.2.0
-rw-r–r– 1 root root 775669760 9月 14 12:18 gcc-10.2.0.tar
drwxr-xr-x 37 16446 ftp 4096 11月 14 2019 gcc-7.5.0
-rw-r–r– 1 root root 618895360 9月 14 12:14 gcc-7.5.0.tar
drwxr-xr-x 36 hoge hoge 4096 3月 4 2020 gcc-8.4.0
-rw-r–r– 1 root root 566599680 9月 14 12:16 gcc-8.4.0.tar
drwxr-xr-x 36 hoge hoge 4096 3月 12 2020 gcc-9.3.0
-rw-r–r– 1 root root 618608640 9月 14 12:17 gcc-9.3.0.tar
[root@apple gcc]#

キットを/usr/local/srcへ移してください。

[root@apple gcc]#
[root@apple gcc]# ls /usr/local/src
[root@apple gcc]# mv gcc-7.5.0 /usr/local/src/
[root@apple gcc]# mv gcc-8.4.0 /usr/local/src/
[root@apple gcc]# mv gcc-9.3.0 /usr/local/src/
[root@apple gcc]# mv gcc-10.2.0 /usr/local/src/
[root@apple gcc]#
[root@apple gcc]# gcc -v
組み込み spec を使用しています。
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
ターゲット: x86_64-redhat-linux
configure 設定: ../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
スレッドモデル: posix
gcc バージョン 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC)
[root@apple gcc]#
[root@apple gcc]#

インストール用のディレクトリを作成します。

今回は、/usr/local/gccの下にバージョンのディレクトリを作成し、そこにインストールします。
[root@apple gcc]# cd /usr/local
[root@apple local]# mkdir gcc
[root@apple local]# cd gcc
[root@apple gcc]# pwd
/usr/local/gcc
[root@apple gcc]# mkdir 7.5.0
[root@apple gcc]#
[root@apple gcc]# ls /usr/local
bin cuda cuda-11.0 etc games gcc include lib lib64 libexec sbin share src
[root@apple gcc]# ls -l /usr/local/src
合計 16
drwxr-xr-x 36 hoge users 4096 7月 23 15:50 gcc-10.2.0
drwxr-xr-x 37 16446 ftp 4096 11月 14 2019 gcc-7.5.0
drwxr-xr-x 36 hoge hoge 4096 3月 4 2020 gcc-8.4.0
drwxr-xr-x 36 hoge hoge 4096 3月 12 2020 gcc-9.3.0
[root@apple gcc]#

今回は、GCCのビルドをローカルユーザhoge で実行しますのでその準備をします。

全てのバージョンのキットに実施します。

[root@apple gcc]# chown hoge:hoge /usr/local/src/gcc-10.2.0/
[root@apple gcc]# ls -l /usr/local/src
合計 16
drwxr-xr-x 36 hoge hoge 4096 7月 23 15:50 gcc-10.2.0
drwxr-xr-x 37 16446 ftp 4096 11月 14 2019 gcc-7.5.0
drwxr-xr-x 36 hoge hoge 4096 3月 4 2020 gcc-8.4.0
drwxr-xr-x 36 hoge hoge 4096 3月 12 2020 gcc-9.3.0
[root@apple gcc]# chown hoge:hoge /usr/local/src/gcc-7.5.0
[root@apple gcc]#
[root@apple gcc]# ls -l /usr/local/src
合計 16
drwxr-xr-x 36 hoge hoge 4096 7月 23 15:50 gcc-10.2.0
drwxr-xr-x 37 hoge hoge 4096 11月 14 2019 gcc-7.5.0
drwxr-xr-x 36 hoge hoge 4096 3月 4 2020 gcc-8.4.0
drwxr-xr-x 36 hoge hoge 4096 3月 12 2020 gcc-9.3.0
[root@apple gcc]#

GCCのコンパイル作業をします。

ここからローカルユーザで作業しています。

gcc-7.5.0の処理しか記載していませんが、全てのバージョンで同じ事を行います。

[hoge@apple ~]$ cd /usr/local/src
[hoge@apple src]$ ls
gcc-10.2.0 gcc-7.5.0 gcc-8.4.0 gcc-9.3.0
[hoge@apple src]$ cd gcc-7.5.0
[hoge@apple gcc-7.5.0]$ ls
ABOUT-NLS ChangeLog.jit Makefile.in config.guess fixincludes libada libffi libitm libstdc++-v3 ltoptions.m4 mkinstalldirs
COPYING ChangeLog.tree-ssa Makefile.tpl config.rpath gcc libatomic libgcc libmpx libtool-ldflags ltsugar.m4 move-if-change
COPYING.LIB INSTALL NEWS config.sub gnattools libbacktrace libgfortran libobjc libtool.m4 ltversion.m4 symlink-tree
COPYING.RUNTIME LAST_UPDATED README configure gotools libcc1 libgo liboffloadmic libvtv lt~obsolete.m4 ylwrap
COPYING3 MAINTAINERS compile configure.ac include libcilkrts libgomp libquadmath ltgcc.m4 maintainer-scripts zlib
COPYING3.LIB MD5SUMS config contrib install-sh libcpp libhsail-rt libsanitizer ltmain.sh missing
ChangeLog Makefile.def config-ml.in depcomp intl libdecnumber libiberty libssp lto-plugin mkdep
[hoge@apple gcc-7.5.0]$
[hoge@apple gcc-7.5.0]$ ls ./contrib/
ChangeLog compareSumTests3 filter_params.pl make-obstacks-texi.pl repro_fail
ChangeLog.jit compare_tests gcc.doxy make_sunver.pl test_installed
ChangeLog.tree-ssa compare_two_ftime_report_sets gcc_build mark_spam.py test_recheck
analyze_brprob.py config-list.mk gcc_update mklog test_summary
analyze_brprob_spec.py dg-cmp-results.sh gen_autofdo_event.py paranoia.cc testsuite-management/
check_GNU_style.sh dg-extract-results.py gennews patch_tester.sh texi2pod.pl
check_makefile_deps.sh dg-extract-results.sh gimple.vim prepare_patch.sh uninclude
check_warning_flags.sh dglib.pm gthr_supp_vxw_5x.c prerequisites.md5 update-copyright.py
clang-format download_prerequisites header-tools/ prerequisites.sha512 vimrc
compare-all-tests filter_gcc_for_doxygen index-prop reghunt/ warn_summary
compare-debug filter_knr2ansi.pl jit-coverage-report.py regression/
[hoge@apple gcc-7.5.0]$ ls ./contrib/d
dg-cmp-results.sh dg-extract-results.py dg-extract-results.sh dglib.pm download_prerequisites
[hoge@apple gcc-7.5.0]$
[hoge@apple gcc-7.5.0]$ ./contrib/download_prerequisites ←必要なもののダウンロード
2020-09-14 13:06:31 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840] -> “./gmp-6.1.0.tar.bz2” [1]
2020-09-14 13:06:35 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284] -> “./mpfr-3.1.4.tar.bz2” [1]
2020-09-14 13:06:39 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925] -> “./mpc-1.0.3.tar.gz” [1]
2020-09-14 13:06:43 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.16.1.tar.bz2 [1626446] -> “./isl-0.16.1.tar.bz2” [1]
gmp-6.1.0.tar.bz2: 完了
mpfr-3.1.4.tar.bz2: 完了
mpc-1.0.3.tar.gz: 完了
isl-0.16.1.tar.bz2: 完了
All prerequisites downloaded successfully.
[hoge@apple gcc-7.5.0]$
[hoge@apple gcc-7.5.0]$
[hoge@apple gcc-7.5.0]$ mkdir build ←ビルド作業様のディレクトリ作成
[hoge@apple gcc-7.5.0]$ cd build
[hoge@apple build]$
[hoge@apple build]$
[hoge@apple build]$ pwd
/usr/local/src/gcc-7.5.0/build
[hoge@apple build]$
[hoge@apple build]$
[hoge@apple build]$ ../configure –enable-language=c,c++,fortran –prefix=/usr/local/gcc/7.5.0 –disable-multilib ←コンフィグ作業開始

主なオプションを記載しておきます。

–enable-languages=lang1,lang2,…

特定のコンパイラのサブセットとそのランタイムライブラリのみをビルドするように指定します。

現在、以下のいずれかを使用できます: all, default, ada, c, c++, d, fortran, go, jit, lto, objc, obj-c++。

詳しくはGCCのサイトを参照してください。

–disable-multilib

異なるターゲットバリアントや呼び出し規約などをサポートする複数のターゲットライブラリをビルドしないように指定します。デフォルトでは、定義済みのライブラリのセットをビルドします。

ターゲットによっては、どのマルチライブラリをビルドするかをより細かく制御することができます。

–disable-bootstrap

ネイティブビルドの場合、デフォルトの設定では、’make’ が起動されたときにコンパイラの 3 段階のブートストラップを行い、GCC が正しくコンパイルできるかどうかをテストします。このプロセスを無効にしたい場合は –disable-bootstrap で設定します。

checking build system type… x86_64-pc-linux-gnu
checking host system type… x86_64-pc-linux-gnu
checking target system type… x86_64-pc-linux-gnu
checking for a BSD-compatible install… /usr/bin/install -c
checking whether ln works… yes
checking whether ln -s works… yes
checking for a sed that does not truncate output… /usr/bin/sed


checking where to find the target ranlib… host tool
checking where to find the target readelf… host tool
checking where to find the target strip… host tool
checking where to find the target windres… host tool
checking where to find the target windmc… host tool
checking whether to enable maintainer-specific portions of Makefiles… no
configure: creating ./config.status
config.status: creating Makefile
[hoge@apple build]$
[hoge@apple build]$
[hoge@apple build]$ make ←make実行
make[1]: ディレクトリ ‘/usr/local/src/gcc-7.5.0/build’ に入ります
Configuring in ./fixincludes
configure: loading cache ./config.cache
checking build system type… (cached) x86_64-pc-linux-gnu
checking host system type… (cached) x86_64-pc-linux-gnu
checking target system type… (cached) x86_64-pc-linux-gnu
checking for x86_64-pc-linux-gnu-gcc… (cached) gcc
checking for C compiler default output file name… a.out
checking whether the C compiler works… yes
checking whether we are cross compiling… no
:
libtool: link: ranlib .libs/libatomic.a
libtool: link: ( cd “.libs” && rm -f “libatomic.la” && ln -s “../libatomic.la” “libatomic.la” )
true DO=all multi-do # make
make[4]: ディレクトリ ‘/usr/local/src/gcc-7.5.0/build/x86_64-pc-linux-gnu/libatomic’ から出ます
make[3]: ディレクトリ ‘/usr/local/src/gcc-7.5.0/build/x86_64-pc-linux-gnu/libatomic’ から出ます
make[2]: ディレクトリ ‘/usr/local/src/gcc-7.5.0/build/x86_64-pc-linux-gnu/libatomic’ から出ます
make[1]: ディレクトリ ‘/usr/local/src/gcc-7.5.0/build’ から出ます
[hoge@apple build]$

[hoge@apple build]$ su –

[root@apple build]# cd /usr/local/src/gcc-7.5.0/build

[root@apple build]# make install
make[1]: ディレクトリ ‘/usr/local/src/gcc-7.5.0/build’ に入ります
/bin/sh ../mkinstalldirs /usr/local/gcc/7.5.0 /usr/local/gcc/7.5.0
make[2]: ディレクトリ ‘/usr/local/src/gcc-7.5.0/build/fixincludes’ に入ります
rm -rf /usr/local/gcc/7.5.0/libexec/gcc/x86_64-pc-linux-gnu/7.5.0/install-tools
/bin/sh ../../fixincludes/../mkinstalldirs /usr/local/gcc/7.5.0/libexec/gcc/x86_64-pc-linux-gnu/7.5.0/install-tools
:
make[4]: ディレクトリ ‘/usr/local/src/gcc-7.5.0/build/x86_64-pc-linux-gnu/libatomic’ から出ます
make[3]: ディレクトリ ‘/usr/local/src/gcc-7.5.0/build/x86_64-pc-linux-gnu/libatomic’ から出ます
make[2]: ディレクトリ ‘/usr/local/src/gcc-7.5.0/build/x86_64-pc-linux-gnu/libatomic’ から出ます
make[1]: ディレクトリ ‘/usr/local/src/gcc-7.5.0/build’ から出ます
[root@apple build]#
[root@apple build]# ls -l /usr/local/gcc/7.5.0
合計 8
drwxr-xr-x 2 root root 4096 9月 15 08:12 bin
drwxr-xr-x 3 root root 17 9月 15 08:12 include
drwxr-xr-x 3 root root 17 9月 15 08:11 lib
drwxr-xr-x 2 root root 4096 9月 15 08:12 lib64
drwxr-xr-x 3 root root 17 9月 15 08:11 libexec
drwxr-xr-x 6 root root 60 9月 15 08:12 share
[root@apple build]#

ビルド作業は、全てのバージョンで行ってください。

以上でGCCのインストールは終了です。

次は、moduleコマンドの設定です。

moduleコマンドは、environment-modulesパッケージをインストールすれば使える様になります。
ただし、設定ファイルを用意してやる必要がありますので参照してください。

[root@apple Modules]# ls -l /etc/modulefiles/gcc
合計 16
-rw-r–r– 1 root root 408 9月 15 08:55 10.2.0
-rw-r–r– 1 root root 402 9月 15 08:37 7.5.0
-rw-r–r– 1 root root 401 9月 15 08:52 8.4.0
-rw-r–r– 1 root root 401 9月 15 08:54 9.3.0
[root@apple Modules]#
[root@apple Modules]# cat /etc/modulefiles/gcc/7.5.0
#%Module1.0
##
## gcc
##
# GCC 7.5.0
proc ModulesHelp { } {
puts stderr “GCC 7.5.0 gcc g++ and gfortran\n”
}

module-whatis “GCC 7.5.0 Install Path /usr/local/gcc/7.5.0”

conflict gcc
prepend-path PATH /usr/local/gcc/7.5.0/bin
prepend-path LD_LIBRARY_PATH /usr/local/gcc/7.5.0/lib64
prepend-path MANPATH /usr/local/gcc/7.5.0/share/man

[root@apple Modules]#
[root@apple Modules]# cat /etc/modulefiles/gcc/8.4.0
#%Module1.0
##
## gcc
##
# GCC 8.4.0
proc ModulesHelp { } {
puts stderr “GCC 8.4.0 gcc g++ and gfortran\n”
}

module-whatis “GCC 8.4.0 Install Path /usr/local/gcc/8.4.0”

conflict gcc
prepend-path PATH /usr/local/gcc/8.4.0/bin
prepend-path LD_LIBRARY_PATH /usr/local/gcc/8.4.0/lib64
prepend-path MANPATH /usr/local/gcc/8.4.0/share/man
[root@apple Modules]#
[root@apple Modules]# cat /etc/modulefiles/gcc/9.3.0
#%Module1.0
##
## gcc
##
# GCC 9.3.0
proc ModulesHelp { } {
puts stderr “GCC 9.3.0 gcc g++ and gfortran\n”
}

module-whatis “GCC 9.3.0 Install Path /usr/local/gcc/9.3.0”

conflict gcc
prepend-path PATH /usr/local/gcc/9.3.0/bin
prepend-path LD_LIBRARY_PATH /usr/local/gcc/9.3.0/lib64
prepend-path MANPATH /usr/local/gcc/9.3.0/share/man
[root@apple Modules]#
[root@apple Modules]# cat /etc/modulefiles/gcc/10.2.0
#%Module1.0
##
## gcc
##
# GCC 10.2.0
proc ModulesHelp { } {
puts stderr “GCC 10.2.0 gcc g++ and gfortran\n”
}

module-whatis “GCC 10.2.0 Install Path /usr/local/gcc/10.2.0”

conflict gcc
prepend-path PATH /usr/local/gcc/10.2.0/bin
prepend-path LD_LIBRARY_PATH /usr/local/gcc/10.2.0/lib64
prepend-path MANPATH /usr/local/gcc/10.2.0/share/man
[root@apple Modules]#
[root@apple Modules]#

[hoge@apple ~]$ module avail
———————————————————————— /usr/share/Modules/modulefiles ————————————————————————-
dot module-git module-info modules null use.own

——————————————————————————- /etc/modulefiles ——————————————————————————–
gcc/7.5.0 gcc/8.4.0 gcc/9.3.0 gcc/10.2.0
[hoge@apple ~]$
[hoge@apple ~]$ module load gcc/7.5.0 ←gcc 7.5.0を使います。
[hoge@apple ~]$
[hoge@apple ~]$ gcc -v
組み込み spec を使用しています。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/gcc/7.5.0/libexec/gcc/x86_64-pc-linux-gnu/7.5.0/lto-wrapper
ターゲット: x86_64-pc-linux-gnu
configure 設定: ../configure –enable-language=c,c++,fortran –prefix=/usr/local/gcc/7.5.0 –disable-multilib
スレッドモデル: posix
gcc バージョン 7.5.0 (GCC)
[hoge@apple ~]$
[hoge@apple ~]$ gfortran -v
組み込み spec を使用しています。
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/local/gcc/7.5.0/libexec/gcc/x86_64-pc-linux-gnu/7.5.0/lto-wrapper
ターゲット: x86_64-pc-linux-gnu
configure 設定: ../configure –enable-language=c,c++,fortran –prefix=/usr/local/gcc/7.5.0 –disable-multilib
スレッドモデル: posix
gcc バージョン 7.5.0 (GCC)
[hoge@apple ~]$
[hoge@apple ~]$ gcc sample.c ←サンプルプログラムは適当に持ってきてください。
[hoge@apple ~]$ ./a.out
1つ目の整数: a = 1
2つ目の整数: b = 2
a + b = 3
a – b = -1
[hoge@apple ~]$ gfortran sample.f90 ←サンプルプログラムは適当に持ってきてください。
[hoge@apple ~]$ ./a.out
Hello, world 2 !
This is also OK
This is a continuation line
This is another way to print out
[hoge@apple ~]$
[hoge@apple ~]$
[hoge@apple ~]$ module unload gcc/7.5.0 ←gcc 7.5.0の使用をやめます。
[hoge@apple ~]$ module load gcc/8.4.0 ←gcc 8.4.0を使います。
[hoge@apple ~]$
[hoge@apple ~]$ gcc -v
組み込み spec を使用しています。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/gcc/8.4.0/libexec/gcc/x86_64-pc-linux-gnu/8.4.0/lto-wrapper
ターゲット: x86_64-pc-linux-gnu
configure 設定: ../configure –enable-languages=c,c++,fortran –prefix=/usr/local/gcc/8.4.0 –disable-multilib
スレッドモデル: posix
gcc バージョン 8.4.0 (GCC)
[hoge@apple ~]$
[hoge@apple ~]$ gfortran -v
組み込み spec を使用しています。
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/local/gcc/8.4.0/libexec/gcc/x86_64-pc-linux-gnu/8.4.0/lto-wrapper
ターゲット: x86_64-pc-linux-gnu
configure 設定: ../configure –enable-languages=c,c++,fortran –prefix=/usr/local/gcc/8.4.0 –disable-multilib
スレッドモデル: posix
gcc バージョン 8.4.0 (GCC)
[hoge@apple ~]$
[hoge@apple ~]$ gcc sample.c
[hoge@apple ~]$ ./a.out
1つ目の整数: a = 2
2つ目の整数: b = 4
a + b = 6
a – b = -2
[hoge@apple ~]$
[hoge@apple ~]$ gfortran sample.f90
[hoge@apple ~]$ ./a.out
Hello, world 2 !
This is also OK
This is a continuation line
This is another way to print out
[hoge@apple ~]$
[hoge@apple ~]$ module unload gcc/8.4.0 ←gcc 8.4.0の使用をやめます。
[hoge@apple ~]$