タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

AmazonLinux2にgcc6をインストール(標準のgcc7と共存させる)

まとめ

  • AmazonLinux2 標準の gcc は 7.x
  • gcc 6.x を使いたいが汚したくない
  • Environment modules で使いたいものだけ使う

事の起こり

事情によりHyper Estraierをインストールする必要があったのですが、通常通りに make すると QDBM が Segmentation fault して動きませんでした。

[root@ip-10-0-1-37 hyperestraier-1.4.13]# make check rm -rf casket casket- LD_LIBRARY_PATH=.:/lib:/usr/lib:/usr/local/lib:/root/lib:/usr/local/lib::/usr/local/lib ./estcmd create -tr -xl -attr '@uri' seq -attr '@title' str \ -attr '@author' str -attr '@mdate' num -attr '@size' num casket ./estcmd: INFO: status: name=casket dnum=0 wnum=0 fsiz=19924864 crnum=0 csiz=0 dknum=0 make: ** [check] Segmentation fault

[root@ip-10-0-1-37 qdbm-1.8.78]# make check (snip) rm -rf casket* LD_LIBRARY_PATH=.:/lib:/usr/lib:/usr/local/lib:/root/lib:/usr/local/lib ./odtest write casket 500 50 5000 name=casket dnum=500 wnum=50 pnum=5000 ibnum=-1 idnum=-1 cbnum=-1 csiz=-1

.make: *** [check] Segmentation fault

いろいろ情報をあさっていると、似た報告がありました。どうやら gcc 7 だと発生し、 gcc 6 なら発生しないようです。

estcmd built with gcc-7.2.0 caused segfault. I sent mails to the author, but I couldn't get a reply.

http://linuxplayers.g1.xrea.com/mozc-ut2.html

AmazonLInux2 の gcc

gcc version 7.3.1 20180712 (Red Hat 7.3.1-6) (GCC)

このgccは維持しながら、必要なときに gcc 6 を使えるようにしたい。

Environment modules

Environment modules が使えそうです。

参考 Environment modules事始め

Environment modules のインストール

$ sudo yum install environment-modules

gcc6 のインストール

yum install autogen

wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-6.5.0/gcc-6.5.0.tar.gz -O /tmp/gcc-6.5.0.tar.gz tar xvf /tmp/gcc-6.5.0.tar.gz -C /usr/local/src cd /usr/local/src/gcc-6.5.0 ./contrib/download_prerequisites mkdir build && cd build ../configure --enable-languages=c,c++ --prefix=/usr/local/gcc-6.5.0 --disable-bootstrap --disable-multilib make && make check && make install

ソースディレクトリ内で configure しない理由 https://gcc.gnu.org/wiki/FAQ#configure

gcc6 を Environment modules で使うための設定

$ vi /etc/modulefiles/gcc-6.5.0
#%Module 1.0
#
#  gcc-6.5.0 module for use with 'environment-modules' package:
#

set GCChome /usr/local/gcc-6.5.0

prepend-path    PATH             $GCChome/bin
prepend-path    INCLUDE        $GCChome/include
prepend-path    LD_LIBRARY_PATH $GCChome/lib
prepend-path    MANPATH        $GCChome/man

使い方

モジュール一覧

$ module avail

----------------------- /usr/share/Modules/modulefiles ------------------------
dot         module-git  module-info modules     null        use.own

------------------------------ /etc/modulefiles -------------------------------
gcc-6.5.0

モジュールを使う

$ module add gcc-6.5.0
$ gcc --version
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/gcc-6.5.0/libexec/gcc/x86_64-pc-linux-gnu/6.5.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --enable-languages=c,c++ --prefix=/usr/local/gcc-6.5.0 --disable-bootstrap --disable-multilib
Thread model: posix
gcc version 6.5.0 (GCC)

使い終わったらアンロード

$ module unload gcc-6.5.0
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/7/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,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 --enable-libmpx --enable-libsanitizer --enable-gnu-indirect-function --enable-libcilkrts --enable-libatomic --enable-libquadmath --enable-libitm --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 7.3.1 20180712 (Red Hat 7.3.1-6) (GCC)