Linux 脚本自动化编译安装gcc-9.2.0(地狱难度???)
不得不说编译安装一次gcc-9.2.0需要的时间非常长,使用单线程,四核CPU跑了5个小时,因此强烈建议睡觉前安装,别的时间不要安装,人和机器都想崩溃。
首先,我的机器为四核的4g内存的机器,系统为centos7.0,内核版本为3.10版本。
那,不用说,都知道gcc是c语言的编译器,为什么要升级高版本呢?centos7自带的gcc版本一般为4.8.5版本,但是象mysql -8.0以上的版本编译安装需要高版本gcc,好像需求是至少gcc5.3吧。或者node.js这样的等等各种高版本软件需要高版本的gcc支持(mysql8.0据说比5.7速度快很多哦,诱惑有点大)。
编译升级gcc高版本之前,需要了解一下需要6个依赖,这6个依赖需要一一处理好,(下载都是走的清华云,国内速度快)
wget http://mirror.hust.edu.cn/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.gz 这个是要编译的主程序
wget http://mirror.hust.edu.cn/gnu/m4/m4-1.4.18.tar.gz 这个是第一个依赖,但没有关联依赖,正常编译安装完就行
wget http://mirror.hust.edu.cn/gnu/automake/automake-1.15.1.tar.gz 这个据说是特定版本,别的版本不好使。别的版本没敢试,正常的编译安装不可以通过,使用如下命令修改Makefile 文件即可,命令如下:
sed -i '/$(update_mans) automake/d' /usr/local/src/automake-1.15.1/Makefile
sed -i '/automake-$(APIVERSION).1:/a $(update_mans) automake-$(APIVERSION) --no-discard-stderr' /usr/local/src/automake-1.15.1/Makefile
具体的详情 请看我下面的脚本源码。
wget http://mirror.hust.edu.cn/gnu/gmp/gmp-6.1.0.tar.bz2 只是gcc的依赖,不建议手动安装(下面会说自动)
wget http://mirror.hust.edu.cn/gnu/mpfr/mpfr-3.1.4.tar.bz2 这个依赖m4好像,不建议手动安装
wget http://mirror.hust.edu.cn/gnu/mpc/mpc-1.0.3.tar.gz 这个依赖 gmp和mpfr,具体忘了,不建议手动安装(有自动安装的方法)
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 这个下载是外网,国内不好找,1.6兆大小,勉强可以接受
也不建议手动安装(有自动安装的方法)
不过有一个好消息,可以使用gcc-9.2.0的configure脚本处理上述的最后四个依赖,也就是gmp,mpfr,mpc,isl这四个使用configure脚本安装了,不用操心依赖了。但需要使用gcc源安装包内的download_prerequisites这个脚本文件处理下载以及软链接的问题,以使configure脚本自动编译。
那么,问题来了,国外的网站速度太慢并经常报错,(长城的问题,都懂得),怎么办?换成国内的清华云的地址即可。在下面的我的脚本源码内会处理这个问题。
素质三连正常完成后,将旧版gcc隐藏,使用新版gcc-9.2.0,使用gcc -v 命令查询,如显示gcc -9.2.0,那么就是安装成功了!!
新版替换旧版的方法有两种,一种是你连我,我连你的手动链接方法。
一种方法是使用alternative命令自动切换新旧版本。我选择使用自动切换的方法。
#!/bin/bash
#auther zsk_john
yum install -y -q autoconf apr apr-devel apr-util apr-util-devel \
bison bzip2-devel cpp fontconfig-devel freetype-devel gcc gcc-c++ compat-dapl \
compat-db-headers compat-db47 compat-gcc-44 compat-gcc-44-c++ compat-glibc \
compat-glibc-headers compat-libcap1 compat-libf2c-34 compat-libgfortran-41 \
compat-libtiff3 compat-openldap ncurses-devel bzip2
wget http://mirror.hust.edu.cn/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.gz
tar -zxf `find / -name gcc-9.2.0.tar.gz` -C /usr/local/src/
wget http://mirror.hust.edu.cn/gnu/m4/m4-1.4.18.tar.gz
tar -zxf `find / -name m4-1.4.18.tar.gz` -C /usr/local/src/
cd /usr/local/src/m4-1.4.18 && ./configure --prefix=/usr/local/m4 && make && make install
wget http://mirror.hust.edu.cn/gnu/automake/automake-1.15.1.tar.gz
tar -zxf `find / -name automake-1.15.1.tar.gz` -C /usr/local/src/
cd /usr/local/src/automake-1.15.1/ && ./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.15.1
sed -i '/$(update_mans) automake/d' /usr/local/src/automake-1.15.1/Makefile
sed -i '/automake-$(APIVERSION).1:/a $(update_mans) automake-$(APIVERSION) --no-discard-stderr' /usr/local/src/automake-1.15.1/Makefile
make && make install
cd /usr/local/src/gcc-9.2.0/ && cp /usr/local/src/gcc-9.2.0/contrib/download_prerequisites /root/
wget -O /usr/local/src/gcc-9.2.0/gmp-6.1.0.tar.bz2 http://mirror.hust.edu.cn/gnu/gmp/gmp-6.1.0.tar.bz2
tar -jxf `find / -name gmp-6.1.0.tar.bz2` -C /usr/local/src/gcc-9.2.0/
wget -O /usr/local/src/gcc-9.2.0/mpfr-3.1.4.tar.bz2 http://mirror.hust.edu.cn/gnu/mpfr/mpfr-3.1.4.tar.bz2
tar -jxf `find / -name mpfr-3.1.4.tar.bz2` -C /usr/local/src/gcc-9.2.0/
wget -O /usr/local/src/gcc-9.2.0/mpc-1.0.3.tar.gz http://mirror.hust.edu.cn/gnu/mpc/mpc-1.0.3.tar.gz
tar -zxf `find / -name mpc-1.0.3.tar.gz` -C /usr/local/src/gcc-9.2.0/
wget -O /usr/local/src/gcc-9.2.0/isl-0.18.tar.bz2 ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2
#rm -rf /usr/local/src/gcc-9.2.0/isl-0.18.tar.bz2
#cp `find / -name isl-0.18.tar.bz2` /usr/local/src/gcc-9.2.0/
cp /root/download_prerequisites /usr/local/src/gcc-9.2.0/contrib/download_prerequisites
sed -i -e'58,62d' -e '35d' /usr/local/src/gcc-9.2.0/contrib/download_prerequisitescd /usr/local/src/gcc-9.2.0/ && /usr/local/src/gcc-9.2.0/contrib/download_prerequisites
rm -rf /usr/local/src/gcc-9.2.0/build
mkdir /usr/local/src/gcc-9.2.0/build && cd /usr/local/src/gcc-9.2.0/build
../configure -enable-checking=release -enable-languages=c,c++,objc,obj-c++,fortran -disable-multilib --prefix=/usr/local/gcc
make -j $(nproc) && make install
mv /usr/bin/gcc /usr/bin/gcc-4.8.5 && mv /usr/bin/g++ /usr/bin/g++-4.8.5
mv /usr/local/gcc/bin/gcc /usr/local/bin/gcc-9.2.0
mv /usr/local/gcc/bin/g++ /usr/local/bin/g++-9.2.0
alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8.5 10 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8.5
alternatives --install /usr/bin/gcc gcc /usr/local/bin/gcc-9.2.0 20 --slave /usr/bin/g++ g++ /usr/local/bin/g++-9.2.0
alternatives --config gcc
脚本大体分为四个部分,第一块是初始化编译环境,第二块是初始化编译两个依赖包,第三块是正式编译,第四块是新版gcc代替旧版gcc