我的做法是:
-
下载 GCC 的源代码和众多支持包。说明在 GCC 源代码的 gcc-4.x.y/INSTALL/index.html 文件中,或在 http://gcc.gnu.org/install/ 在线。
使用脚本将 GCC 的源代码和支持库提取到一个目录中,创建对象目录,然后运行构建。
这是我用于 GCC 4.8.2 的脚本:
GCC_VER=gcc-4.8.2
tar -xf ${GCC_VER}.tar.bz2 || exit 1
(
cd ${GCC_VER} || exit
cat <<EOF |
cloog 0.18.0 tar.gz
gmp 5.1.3 tar.xz
isl 0.11.1 tar.bz2
mpc 1.0.1 tar.gz
mpfr 3.1.2 tar.xz
EOF
while read file vrsn extn
do
(
set -x
tar -xf "../$file-$vrsn.$extn" &&
ln -s "$file-$vrsn" "$file"
)
done
)
mkdir ${GCC_VER}-obj
cd ${GCC_VER}-obj
../${GCC_VER}/configure --prefix=$HOME/gcc/gcc-4.8.2
make -j8 bootstrap
完成后,也运行安装。然后将$HOME/gcc/gcc-4.8.2/bin(您在--prefix 中指定的名称加上/bin)添加到/usr/bin 之前的PATH。
对于一台配备 5400 rpm 旋转磁盘的不错的 MacBook Pro,编译所有内容需要一两个小时(使用 make 的 -j8 选项),并且在编译时需要数 GB 的磁盘空间。这样做时 SSD 很好(肯定更快)!
GCC 4.9.0 于 2014 年 4 月 22 日发布。我使用基本相同的过程安装了它,但使用了 CLooG 0.18.1 和 ISL 0.12.2(需要更新)和 GMP 5.1.3(和 6.0.0a)、MPC 1.0.2(或 1.0.1)和 MPFR Mac OS X 10.9.2 Mavericks 和 Ubuntu 12.04 衍生版本上的 3.1.2。请注意gmp-6.0.0a.tar.xz 提取到目录gmp-6.0.0(不是您可能期望的gmp-6.0.0a)。
在 2014 年和 2017 年 9 月 27 日之间,我构建了 GCC 版本 4.9.0、4.9.1、5.1.0、5.2.0、5.3.0、6.1.0、6.2.0、6.3.0、 7.1.0,在 macOS Sierra (10.12) 上为 GCC 7.2.0 显示的构建脚本只有微小的变化。辅助库的版本经常变化。
macOS Sierra 和 High Sierra
在 2017 年 8 月 14 日,我使用上述脚本的一个小变体在 macOS Sierra 10.12 上构建 GCC 7.2.0(使用 XCode 8 作为引导编译器)。一个变化是似乎不再需要 CLoG(我停止在 GCC 6.2.0 中添加它)。这是我当前的脚本:
#!/bin/bash
#export DYLD_LIBRARY_PATH=$(clnpath $(dirname $(dirname $(which g++)))/lib:$DYLD_LIBRARY_PATH)
unset DYLD_LIBRARY_PATH
TAR=/opt/gnu/bin/tar
VER_NUM=7.2.0
GCC_VER=gcc-${VER_NUM}
TGT_BASE=/opt/gcc
TGT_DIR=${TGT_BASE}/v${VER_NUM}
CC=/usr/bin/clang
CXX=/usr/bin/clang++
extract() {
echo "Extract $1"
$TAR -xf $1
}
if [ ! -d "$GCC_VER" ]
then extract ${GCC_VER}.tar.xz || exit 1
fi
(
cd ${GCC_VER} || exit
nbncl <<EOF |
gmp 6.1.2 tar.lz
isl 0.16.1 tar.bz2
mpc 1.0.3 tar.gz
mpfr 3.1.5 tar.xz
EOF
while read file vrsn extn
do
tarfile="../$file-$vrsn.$extn"
if [ ! -f "$tarfile" ]
then echo "Cannot find $tarfile" >&2; exit 1;
fi
if [ ! -d "$file-$vrsn" ]
then
(
set -x
extract "$tarfile" &&
ln -s "$file-$vrsn" "$file"
) || exit 1
fi
done
)
if [ $? = 0 ]
then
mkdir ${GCC_VER}-obj
cd ${GCC_VER}-obj
../${GCC_VER}/configure --prefix="${TGT_DIR}" \
CC="${CC}" \
CXX="${CXX}"
make -j8 bootstrap
fi
确保您的 tar 版本支持所有 4 种不同的压缩文件格式(.lz、.gz、.xz、.bz2),但是因为标准 Mac 版本的 tar 可以为我做到这一点,它可能也适合你。
在 2017 年 9 月 27 日,我未能使用与 Sierra 10.12 上相同的脚本在 macOS High Sierra 10.13(使用 XCode 9 作为引导编译器)上构建 GCC 7.2.0。直接错误是缺少标头<stack>;我需要追踪我的 XCode 9 安装是否正确——或者更准确地说,为什么它不正确,因为 <stack> 是 standard header in C++98 之后的版本。可能有一个简单的解决方法;我只是还没有花时间去追它。 (是的,我已经多次运行xcode-select --install;由于网络故障,我不得不多次运行它的事实可能是问题的一部分。)(我在 2017 年成功编译了 GCC 7.2.0 -12-02;我不记得需要什么体操(如果有的话)才能让它发挥作用。)
时间过去了;版本号增加。但是,基本配方对我来说适用于更新版本的 GCC。我有 7.3.0(2018 年 1 月 2 日安装)、8.1.0(2018 年 5 月 2 日安装)、8.2.0(2018 年 7 月 26 日安装)、8.3.0(2019 年 3 月 1 日安装)和现在 9.1.0(今天安装,2019-05-03)。这些版本中的每一个都是在当时的当前版本的 macOS 上构建和安装的,使用当前版本的 XCode 进行引导阶段(因此在构建 GCC 9.1.0 时使用 macOS 10.14.4 Mojave 和 XCode 10.2.1)