Обсуждение
Сборка GCC в Mac OS X иногда сопряжена с трудностями. У меня были различные проблемы с различными версиями GCC и различными версиями Mac OS X на протяжении многих лет. Вы можете увидеть более раннее объяснение того, что я сделал в Установка GCC в Mac OS X — для сборки GCC 4.8.x на Mavericks 10.9.x (или, возможно, Mountain Lion 10.8.x); он также сообщает об успешном создании GCC 4.9.0 на Mavericks 10.9.x, но о неудаче на Yosemite 10.10.x.
Это обновленный рецепт сборки GCC 5.2.0 на Mac OS X 10.11.1 El Capitan. Он начинается с XCode 7.1.1 — я не знаю, какие другие версии XCode подходят.
Обратите внимание, что El Capitan имеет функцию SIP (защита целостности системы), которой не было в Yosemite и более ранних версиях. Это означает, что вы больше не можете создавать произвольные каталоги под /usr
. Раньше я устанавливал в /usr/gcc/vX.Y.Z
; это больше не разрешено в Эль-Капитане. Таким образом, одно важное изменение заключается в том, что теперь я устанавливаю в /opt/gcc/v.X.Y.Z
.
Я обнаружил, что установка DYLD_LIBRARY_PATH проблематична, особенно на El Capitan. В большом разрыве с прошлым я теперь вообще не устанавливаю это. Обратите внимание, что скрипты отключили его. Также обратите внимание, что сценарий явно устанавливает для компиляторов фазы 1 CC и CXX значения /usr/bin/clang
и /usr/bin/clang++
соответственно (компиляторы XCode). Текущие версии GCC требуют способного компилятора C++ вместо (или наряду с) компилятора C.
У меня иногда были проблемы с libiconv
, но на данный момент я избегал их, не устанавливая свою собственную версию. Точно так же у меня иногда возникали проблемы с некоторыми awk-скриптами в исходниках GCC. Мне пришлось взломать его / их, чтобы заставить его работать нормально. Тем не менее, с релизной копией исходного кода 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
.
Компиляция GCC 5.2.0 в Mac OS X 10.11.1 с XCode 7.1.1
Мне пришлось работать с более ранними версиями как GMP (5.1.3 вместо 6.0.0a), так и ISL (0.14 вместо 0.15). Обе сборки для более поздних версий вызвали у меня проблемы.
Обратите внимание, что я поместил код библиотеки для GMP, MPC, MPFR, ISL и Cloog (см. GCC pre- реквизиты) в исходном каталоге GCC, чтобы GCC создавал свои собственные версии этих библиотек. Я обнаружил, что это самый простой способ убедиться, что GCC правильно находит эти библиотеки.
Целевой каталог: /opt/gcc/v5.2.0
Время сборки составило около 2 часов 15 минут на 17-дюймовом MacBook Pro (начало 2011 г.) с процессором Intel Core i7 с тактовой частотой 2,3 ГГц, с 16 ГБ основной памяти DDR3 1333 МГц и жестким диском на 750 ГБ, 5400 об/мин. Исходный код занимает около 850 МБ; дерево сборки заканчивается примерно на 4,6 ГБ — вам нужно много места на диске Установленный код заканчивается примерно на 420 МБ.
Используемый скрипт — 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
Скрипт nbncl
— непустые строки без комментариев
#!/usr/bin/env perl
#
# Non-blank, non-comment lines only
use warnings;
use strict;
while (<>)
{
chomp;
s/\s+$//;
s/\s*#.*$//;
print "$_\n" unless /^$/;
}
person
Jonathan Leffler
schedule
26.11.2015
awk
скриптами в исходниках GCC. Мне пришлось взломать его / их, чтобы заставить его работать нормально. У меня где-то есть кое-какая информация — думаю, она должна быть на другой моей машине, на которой до сих пор работает Yosemite вместо El Capitan. Кричите, если вам нужен мой последний скрипт компиляции или другая помощь — смотрите мой профиль, если это лучше сделать вне SO. - person Jonathan Leffler   schedule 23.11.2015