Photo by Jf Brou on Unsplash

因為對系統一直沒有太大興趣,當年從 FreeBSD 跳到 CentOS 後,就停在 6 版,沒有繼續跟上 7+ 版本。

這次因為要玩 headless CMSGhostStrapi,需要 node v12,就又遇到 CentOS 上 gcc / glibc 版本過舊,而且無法透過 yum 更新上去的問題。

用 Google 東翻翻西找找,看到的可行解大約有兩種:

  1. 安裝 devtoolset-* , 其中 -* 對應 gcc 版本,例如 devtoolset-6 就是 gcc 6;目前 6 版 已結束支援,78 版還有在維護。但我遇到兩個問題,一是無法細選各種工具的版本,就是簡單暴力直上,二是我試了但對 node 不起作用⋯(也可能是我方法錯誤)。
  2. 單獨安裝,沒什麼好說的,就是一個個安裝編譯上去,我是用這個方式搞定。

升級馬拉松

先說明,整個升級會需要編譯和更新不少軟體;其中光 gcc 就要跑一小時以上,而且會佔掉 4.5G 左右的容量,開始前最好先確定主機有足夠空間,以免弄到一半卡住,變成進退兩難的情況。

至於升級要升到什麼版本,一開始我也覺得越高越好,直到 膝蓋中了一箭 意識到版本過高只是逼迫升級更多的相依套件。以下是針對 安裝執行 node v12 的環境版本,有需要可以再自己斟酌替換。

升級 gcc

// 建立更新用的目錄
$ mkdir /tmp/upgrade
$ cd /tmp/upgrade

// 下載 gcc 5.2
$ wget https://ftp.gnu.org/gnu/gcc/gcc-5.2.0/gcc-5.2.0.tar.gz
$ tar zxvf gcc-5.2.0.tar.gz
$ cd gcc-5.2.0

// 直接透過 download script 下載相依套件
$ ./contrib/download_prerequisites

// 建立編譯用目錄
$ mkdir build
$ cd build
$ ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

// 開工,會跑超過一小時
$ make

// 安裝
$ make install

系統原本的 gcc 在 /usr/bin ,新版本的 gcc 裝在 /usr/local/bin 下。為避免之後還是需要用到 gcc 4 做一些舊編譯,用 ln 掛上新版就好。

$ cd /usr/bin
$ mv gcc gcc4
$ mv g++ g++4

$ ln -s /usr/local/bin/gcc gcc
$ ln -s /usr/local/bin/g++ g++

如果不想這麼麻煩,或是擔心後面有路徑錯誤問題,直接裝在 /usr/bin 下也是可以:

$ ../configure --prefix=/usr --enable-checking=release --enable-languages=c,c++ --disable-multilib

跑一下 gcc -v ,應該會顯示 gcc version 5.2.0 (GCC)

升級 binutils

$ cd /tmp/upgrade

// 下載
$ wget https://ftp.gnu.org/gnu/binutils/binutils-2.34.tar.gz
$ tar zxvf binutils-2.34.tar.gz
$ cd binutils-2.34

// 配置和編譯
$ ./configure  --prefix=/usr
$ make
$ make install

如果遇到需要 makeinfo 的錯誤訊息:

/tmp/upgrade/binutils-2.34/missing: line 81: makeinfo:命令找不到
WARNING: 'makeinfo' is missing on your system.
                      ⋯

先跑一下

$ yum install -y texinfo

升級 autoconf / automake

$ cd /tmp/upgrade
$ wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.gz
$ tar zxvf autoconf-2.68.tar.gz
$ cd autoconf-2.68

$ ./configure --prefix=/usr
$ make && make install
$ cd /tmp/upgrade
$ wget https://ftp.gnu.org/gnu/automake/automake-1.14.1.tar.gz
$ tar zxvf automake-1.14.1.tar.gz
$ cd automake-1.14.1

$ ./configure --prefix=/usr
$ make && make install

升級 glibc

$ cd /tmp/upgrade

// 下載 glibc
$ wget https://ftp.gnu.org/gnu/glibc/glibc-2.20.tar.gz
$ tar zxvf glibc-2.20.tar.gz
$ cd glibc-2.20

// 建立編譯用目錄
$ mkdir build
$ cd build
$ ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

// 編譯(大概要跑個 15 分鐘)/ 安裝
$ make
$ make install

確認 Node 環境

升級到這邊就告一段落了,重新用 n 跑一次 node/12.10.0 ,會發現還有錯誤訊息:

這是因為共享函式庫沒有更新到的關係,我們先看一下,

$ cd /usr/lib64/
$ ls -al | grep libstdc

會得到:

手動把 libstdc++.so.6 連結起來就好。

$ cp /usr/local/lib64/libstdc++.so.6.0.21 ./
$ unlink libstdc++.so.6
$ ln -s libstdc++.so.6.0.21 libstdc++.so.6

重新跑一次 node -v ,可以正常顯示版本沒有再出現錯誤訊息了。