linux安裝gcc-shell腳本

GCC是GUN Compiler Collection的簡稱,除了編譯程序以外,它還含其餘相關工具,它能把易於人類使用的高級語言編寫的源代碼構建成計算機可以直接執行的二進制代碼。GCC是Linux平臺下最經常使用的編譯程序,它是Linux平臺編譯器的事實標準。同時,在Linux平臺下的嵌入式開發領域,GCC也是用得最廣泛的一種編譯器。GCC之因此被普遍採用,是由於它能支持各類不一樣的目標體系結構。例如,它既支持基於宿主的開發(簡單講就是要爲某平臺編譯程序,就在該平臺上編譯),也支持交叉編譯(即在A平臺上編譯的程序是供平臺B使用的)。目前,GCC支持的體系結構有四十餘種,常見的有X86系列、Arm、PowerPC等。同時,GCC還能運行在不一樣的操做系統上,如Linux、Solaris、Windows等。html

除了上面講的以外,GCC除了支持C語言,還支持多種其餘語言,例如C++、Ada、Java、Objective-C、FORTRAN、Pascal、go等。c++

基本上不少應用在編譯安裝時須要使用到gcc,通常使用的版本不是很高因此經過快捷安裝命令便可:shell

yum install -y gcc-c++

但有的應用編譯時須要更高版本的gcc,這個時候基本上只能經過編譯安裝,而gcc編譯安裝很是麻煩,須要幾個指定版本的依賴組件才能編譯安裝成功,爲方便安裝特地編寫了一個安裝shell腳本,經過腳原本無人安裝,固然安裝編譯過程仍是有點長的,腳本暫只支持以CentOS系統(系統版本5~7有測試過)來安裝(其它系統須要調整下快速安裝組件命令 yum 和對應的安裝包名)api

#!/bin/bash
#  官網 https://gcc.gnu.org/
#
# 下載地址 (鏡像)
# https://gcc.gnu.org/mirrors.html
#
# 依賴說明
# https://gcc.gnu.org/install/prerequisites.html
#
#  命令參數
#  $1 指定安裝版本,若是不傳則獲取最新版本號,爲 new 時安裝最新版本
#

#GCC version number
GCC_VERSION=$1
# GCC安裝基目錄
INSTALL_BASE="/usr/local/gcc/"
# 必需的庫基目錄
INSTALL_PACKAGE_BASE="/usr/local/"
# gcc 編譯配置
GCC_CONFIGURE_WITH=''
# 鏡像地址,若是地址不可用可去 https://gcc.gnu.org/mirrors.html 找合適的地址
MIRRORS_URL="https://bigsearcher.com/mirrors/gcc/"

# 判斷默認鏡像是否好用
if [ -z "`curl --connect-timeout 20 -I -X HEAD $MIRRORS_URL/releases/ 2>&1| grep '200 OK'`" ];then
    # 獲取最快的鏡像地址
    MIRRORS_URLS=`curl https://gcc.gnu.org/mirrors.html 2>&1 | grep -P 'http(s)?://([\w\-]+\.)+\w+/(\w+/)?gcc/' -o| uniq`
    MIRRORS_URL=''
    MIRRORS_HOST_PING_TIME=''
    for LINE in `echo -e $MIRRORS_URLS`
    do
        MIRRORS_HOST=`echo $LINE|grep -P 'http(s)?://([\w\-]+\.)+\w+/' -o|grep -P '([\w\-]+\.)+\w+' -o`
        PING_TIME=`ping -c 1 -W 10 $MIRRORS_HOST|grep -P 'time=\d+' -o|grep -P '\d+' -o`
        if [ -n "$PING_TIME" ] && [ -n "`curl --connect-timeout 20 -I -X HEAD $LINE/releases/ 2>&1| grep '200 OK'`" ];then
            if [ "$PING_TIME" -lt 150 ];then
                MIRRORS_URL=$LINE
                break
            fi
            MIRRORS_HOST_PING_TIME="$MIRRORS_HOST_PING_TIME$PING_TIME,$LINE\n"
        fi
    done
    if [ -z "$MIRRORS_URL" ];then
        MIRRORS_URL=`echo -e "$MIRRORS_HOST_PING_TIME"|grep -P '^\d+'|sort -n -t ',' -k 1|head -n 1|grep -P 'http.*$' -o`
    fi
    if [ -z "$MIRRORS_URL" ];then
        echo '沒有找到可用的鏡像下載地址'
        exit
    fi
fi

if [ -z $1 ] || [[ $1 == "new" ]]; then
    echo "gcc version is empty!"
    echo "獲取最新穩定版本號 ...";
    GCC_VERSION=`curl $MIRRORS_URL/releases/ 2>&1| grep -P 'gcc-\d+\.\d+\.\d+' -o|tail -n 1|grep -P '\d+\.\d+\.\d+' -o`
    if [ -z "$GCC_VERSION" ];then
        echo "獲取版失敗!";
        exit
    fi
    if [ -z $1 ]; then
        echo $GCC_VERSION
        exit
    fi
fi
if [ -e "$INSTALL_BASE$GCC_VERSION/bin/gcc" ];then
    echo "gcc-$GCC_VERSION already install!"
    exit
fi

OLD_PATH=`pwd`
if [[ "$0" =~ '/' ]]; then
    cd "`echo "$0" | grep -P '(/?[^/]+/)+' -o`"
    CURRENT_PATH=`pwd`
    cd $OLD_PATH
else
    CURRENT_PATH=$OLD_PATH
fi

if [ ! -d "gcc" ];then
    mkdir gcc
fi
cd gcc
if [ ! -e "gcc-$GCC_VERSION.tar.gz" ]; then
    #download
    echo "download gcc-$GCC_VERSION.tar.gz";
    wget $MIRRORS_URL/releases/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.gz 2>&1
fi
if [ ! -d "gcc-$GCC_VERSION" ]; then
    #decompression
    echo "decompression gcc-$GCC_VERSION.tar.gz";
    tar -zxf gcc-$GCC_VERSION.tar.gz
fi
if [ ! -d "gcc-$GCC_VERSION" ]; then
    echo "gcc-$GCC_VERSION dir is not exists"
    exit
fi

echo "install dependence"

yum install -y gcc-c++ bzip2 ntpdate m4
# 時間不一樣步容易形成配置死循環
ntpdate -u ntp.api.bz
# apt-get install -y g++

# while 循環使用的是管道,會開啓子進程,沒法修改外部的變量

PACKAGE_LISTS=`cat gcc-$GCC_VERSION/contrib/download_prerequisites| grep -P '\-\d+\.\d+(\.\d+)?\.tar'`
for LINE in `echo -e $PACKAGE_LISTS`
do
    PACKAGE_VERSION_FILE=`echo $LINE|grep -P '\w+\-\d+\.\d+(\.\d+)?\.tar\.(bz2|gz)' -o`
    PACKAGE=`echo $PACKAGE_VERSION_FILE|grep -P '^\w+' -o`
    PACKAGE_VERSION_DIR=`echo $PACKAGE_VERSION_FILE|grep -P '\w+\-\d+\.\d+(\.\d+)?' -o`
    PACKAGE_VERSION=`echo $PACKAGE_VERSION_DIR|grep -P '\d+\.\d+(\.\d+)?' -o`
    PACKAGE_CONFIGURE_WITH=$GCC_CONFIGURE_WITH
    GCC_CONFIGURE_WITH="$PACKAGE_CONFIGURE_WITH --with-$PACKAGE=$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION"
    echo "install $PACKAGE_VERSION_DIR"
    if [ -d "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION" ]; then
        echo "$PACKAGE_VERSION_DIR already install";
        continue;
    fi
    if [ ! -e "$PACKAGE_VERSION_FILE" ]; then
        #download package
        echo "download $PACKAGE_VERSION_FILE";
        wget $MIRRORS_URL/infrastructure/$PACKAGE_VERSION_FILE 2>&1
    fi
    if [ ! -d "$PACKAGE_VERSION_DIR" ]; then
        #decompression
        echo "decompression $PACKAGE_VERSION_FILE";
        if [ -n "`echo $PACKAGE_VERSION_FILE|grep -P '\.gz$'`" ];then
            tar -zxf $PACKAGE_VERSION_FILE
        else
            tar -xf $PACKAGE_VERSION_FILE
        fi
    fi
    if [ ! -d "$PACKAGE_VERSION_DIR" ]; then
        echo "$PACKAGE_VERSION_DIR dir is not exists"
        exit
    fi
    cd $PACKAGE_VERSION_DIR
    if [[ "$PACKAGE" == "isl" ]];then
        PACKAGE_CONFIGURE_WITH=' --with-gmp-prefix='`echo $PACKAGE_CONFIGURE_WITH|grep -P "[^=]+gmp/\d+\.\d+\.\d+" -o`
    fi
    echo "./configure --prefix=$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION$PACKAGE_CONFIGURE_WITH"
    ./configure --prefix=$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION$PACKAGE_CONFIGURE_WITH 2>&1
    make 2>&1
    make install 2>&1
    if [ ! -d "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION" ] || [ -z "`ls $INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION`" ];then
        echo "$PACKAGE-$PACKAGE_VERSION install fail!"
        exit
    fi
    if [[ "$PACKAGE" == "isl" ]];then
        echo "mv lib/*.py file"
        # 清除py文件,這些文件會影響共享的動態連接庫ldconfig命令執行失敗
        for PY_FILE in `find $INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION/lib/ -name "*.py"`
        do
            if [ -n "$PY_FILE" ] && [ -e "$PY_FILE" ];then
                echo "mv $PY_FILE $INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION"
                mv $PY_FILE $INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION
            fi
        done
    fi
    # 共享的動態連接庫,加載配置
    if [ -d "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION/lib" ] && [ -z "`cat /etc/ld.so.conf|grep "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION"`" ];then
        echo "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION/lib" >> /etc/ld.so.conf
        ldconfig
    fi
    cd ../
done

cd gcc-$GCC_VERSION
echo "install gcc"
make clean 2>&1
# 64位系統須要禁用multilib
if [ -n "`uname -a|grep -P 'el\d+\.x\d+_\d+' -o|grep x86_64 -o`" ]; then
    GCC_CONFIGURE_WITH=$GCC_CONFIGURE_WITH' --disable-multilib'
fi

# 新版須要下載配置文件
if [ ! -e "./configure" ] && [ -e "./contrib/download_prerequisites" ];then
    ./contrib/download_prerequisites
     mkdir gcc-make-tmp
     cd gcc-make-tmp
    echo "../configure --prefix=$INSTALL_BASE$GCC_VERSION$GCC_CONFIGURE_WITH"
    ../configure --prefix=$INSTALL_BASE$GCC_VERSION$GCC_CONFIGURE_WITH 2>&1
else
    echo "./configure --prefix=$INSTALL_BASE$GCC_VERSION$GCC_CONFIGURE_WITH"
    ./configure --prefix=$INSTALL_BASE$GCC_VERSION$GCC_CONFIGURE_WITH 2>&1
fi

HTREAD_NUM=`lscpu |grep Thread|grep -P '\d+$' -o`
make -j $HTREAD_NUM 2>&1
make install 2>&1

# check install status
if [ ! -d "$INSTALL_BASE$GCC_VERSION" ] || [ -z "`ls $INSTALL_BASE$GCC_VERSION`" ]; then
    echo "[error] install gcc-$GCC_VERSION fail!";
else
    echo "$INSTALL_BASE$GCC_VERSION/lib64" >> /etc/ld.so.conf
    echo "mv lib64/*.py file"
    # 清除py文件,這些文件會影響共享的動態連接庫ldconfig命令執行失敗
    for PY_FILE in `find $INSTALL_BASE$GCC_VERSION/lib64/ -name "*.py"`
    do
        if [ -n "$PY_FILE" ] && [ -e "$PY_FILE" ];then
            echo "mv $PY_FILE $INSTALL_BASE$GCC_VERSION"
            mv $PY_FILE $INSTALL_BASE$GCC_VERSION
        fi
    done
    ldconfig
    echo 'export PATH=$PATH:'"$INSTALL_BASE$GCC_VERSION/bin" >> /etc/profile
    source /etc/profile
    yum remove -y gcc-c++
    echo "install gcc-$GCC_VERSION success!";
fi


使用方法:bash

在root帳號下,建立一個.sh後綴的shell腳本文件,好比:gcc-install.sh 並把上面安裝代碼寫入保存。curl

執行安裝命令ide

bash gcc-install.sh new

若是系統的依賴過少致使安裝不成功,則須要增長對應的依賴包(這裏只以測試系統爲例依賴包可能安裝不是很充足),安裝目錄能夠在安裝腳本中去配置修改,安裝成功後會提示安裝成功文案。工具

相關文章
相關標籤/搜索