一般讨论;一般交流
在 Mac OS X 上构建 GCC 的过程有时会充满麻烦。多年来,我在使用不同版本的 GCC 和不同版本的 Mac OS X 时遇到过各种问题。你可以看到我之前所做的解释在 Mac OS X 上安装 GCC— 用于在 Mavericks 10.9.x(或可能是 Mountain Lion 10.8.x)上构建 GCC 4.8.x;它还报告在 Mavericks 10.9.x 上成功构建 GCC 4.9.0,但在 Yosemite 10.10.x 上失败。
这是在 Mac OS X 10.11.1 El Capitan 上构建 GCC 5.2.0 的更新配方。
它开始使用 XCode 7.1.1 — 我不知道哪些其他版本的 XCode 还可以。
注意埃尔卡皮坦具有 Yosemite 及早期版本中没有的功能 SIP(系统完整性保护)。这意味着您不能在下创建任意目录/usr
不再有。我曾经安装在/usr/gcc/vX.Y.Z
; El Capitan 不再允许这样做。因此,一项重大变化是我现在安装在/opt/gcc/v.X.Y.Z
.
我发现设置 DYLD_LIBRARY_PATH 是有问题的——尤其是在 El Capitan 上。与过去的重大突破是,我现在根本不设置它。请注意,脚本已取消设置它。另请注意,该脚本显式将第 1 阶段编译器 CC 和 CXX 设置为/usr/bin/clang
and /usr/bin/clang++
分别(XCode 编译器)。当前版本的 GCC 需要功能强大的 C++ 编译器,而不是(或同时)C 编译器。
我偶尔会遇到问题libiconv
,但目前我通过没有安装我自己的版本来逃避它们。同样,我偶尔也会遇到 GCC 源代码中的某些 awk 脚本的问题。我必须破解它/它们才能让它正常工作。然而,通过 GCC 5.2.0 源代码的发布副本,我似乎能够直接开箱即用地进行构建。
如果您只有一个磁盘分区,那么下一点并不重要。如果您有多个磁盘,请确保目标目录不存在或确保其名称正是您想要的。在工作机器上(不是 Mac,而是 Linux 机器等),我仍然使用/usr/gcc/vX.Y.Z
作为“官方”安装位置,但该软件最终会出现在某个有足够空间的任意文件系统中,例如/work4/gcc
,最终有一个符号链接/usr/gcc/vX.Y.Z
到达/work4/gcc/vX.Y.Z
。然而,至关重要的是/work4/gcc/vX.Y.Z
在编译 GCC 时不存在,因为它将通过以下方式解析名称realpath()或其等价物并嵌入/work4/gcc/vX.Y.Z
进入二进制文件,而不是中性名称/usr/gcc/vX.Y.Z
。这限制了安装的便携性;它移动到的任何其他机器都必须有一个目录/work4/gcc/vX.Y.Z
,即使您要求将其安装在/usr/gcc/vX.Y.Z
.
使用 XCode 7.1.1 在 Mac OS X 10.11.1 上编译 GCC 5.2.0
我必须使用 GMP(5.1.3 而不是 6.0.0a)和 ISL(0.14 而不是 0.15)的降级版本。后续版本的构建都给我带来了麻烦。
请注意,我放置了 GMP、MPC、MPFR、ISL 和 Cloog 的库代码(请参阅海湾合作委员会先决条件)在 GCC 源目录中,以便 GCC 构建这些库自己的版本。我发现这是确保 GCC 正确找到这些库的最简单方法。
目标目录:/opt/gcc/v5.2.0
在运行 Intel Core i7、2.3 GHz、16 GiB 1333 MHz DDR3 主内存和 750 GB 5400 rpm 硬盘驱动器的 17" MacBook Pro(2011 年初)上,构建时间约为 2 小时 15 分钟。源代码占用约 850 MiB;构建树最终约为 4.6 GiB — 您需要足够的磁盘空间。安装的代码最终约为 420 MiB。
使用的脚本——extract-gcc-5.2.0.sh
#!/bin/bash
unset DYLD_LIBRARY_PATH
TAR=tar
VER_NUM=5.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.bz2 || exit 1
fi
(
cd ${GCC_VER} || exit
nbncl <<EOF |
cloog 0.18.1 tar.gz
gmp 5.1.3 tar.xz
# gmp 6.0.0 tar.lz
isl 0.14 tar.bz2
# isl 0.15 tar.bz2
mpc 1.0.3 tar.gz
mpfr 3.1.3 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
Script nbncl
— 非空白、非注释行
#!/usr/bin/env perl
#
# Non-blank, non-comment lines only
use warnings;
use strict;
while (<>)
{
chomp;
s/\s+$//;
s/\s*#.*$//;
print "$_\n" unless /^$/;
}