我做的方式是:
下载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
)添加到您的PATH路径之前,位于
/usr/bin
之前。
使用一个速度为5400 rpm的良好MacBook Pro,在编译全部内容时需要一两个小时(使用
-j8
选项进行
make
),并且在编译过程中需要多个千兆字节的磁盘空间。在这种情况下,SSD很好用(肯定更快)!
GCC 4.9.0发布于2014年4月22日。我使用基本相同的过程安装了它,但需要更新CLooG 0.18.1和ISL 0.12.2,并在Mac OS X 10.9.2 Mavericks和Ubuntu 12.04派生版上安装了GMP 5.1.3(和6.0.0a)、MPC 1.0.2(或1.0.1)和MPFR 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作为引导编译器)。有一个变化是似乎不再需要CLooG(我在GCC 6.2.0中停止添加它)。这是我的当前脚本:
#!/bin/bash
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日,我尝试构建GCC 7.2.0在macOS High Sierra 10.13上(使用XCode 9作为引导编译器),但与在Sierra 10.12上使用的相同脚本失败了。直接的错误是缺少头文件<stack>
;我需要找出我的XCode 9安装是否正确 - 或更准确地说,为什么不正确,因为<stack>
是C++98以来的标准头文件。可能有一个简单的解决方案;我只是还没有花时间去追寻它。(是的,我已经多次运行了xcode-select --install
;由于网络故障,我不得不多次运行它,这可能是问题的一部分。)(我成功地编译了GCC 7.2.0在2017年12月2日;我不记得需要进行任何体操才能使其工作。)
时间流逝,版本号不断增加。然而,这个基本的方法对于我来说在更近期的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年5月3日)。每个版本都是在当前macOS版本上使用当前的XCode进行引导阶段构建和安装的(因此,在构建GCC 9.1.0时使用macOS 10.14.4 Mojave和XCode 10.2.1)。
port -b install gcc48 -universal; port select --set gcc mp-gcc48
,并且想从源代码进行编译,但是这并没有起作用,并且你也没有提供错误日志或失败的配置选项。你是否意识到构建工具链可能会出现多少问题?你需要更加具体地说明你遇到的错误。 - Brett Hale