Сборка GCC на OS X 10.11

Сборка GCC (последняя версия) на OS X 10.11.1 здесь, с помощью командной строки:

../gccx/configure --with-gmp="/opt/local" --with-mpfr="/opt/local" \
    --with-mpc="/opt/local" --with-libiconv-prefix="/opt/local" --with-pkgversion="GCCX" \
    --program-transform-name='s/^gcc$/gccx/; s/^g++$/g++x/' --enable-languages=c

Точно следовал инструкциям по сборке и получил эту ошибку:

g++ -std=gnu++98   -g  -DIN_GCC    -fno-strict-aliasing
-fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wno-format -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fno-common  -DHAVE_CONFIG_H -DGENERATOR_FILE -fno-PIE -Wl,-no_pie   -o build/genmatch \
        build/genmatch.o ../build-x86_64-apple-darwin15.0.0/libcpp/libcpp.a build/errors.o build/vec.o build/hash-table.o ../build-x86_64-apple-darwin15.0.0/libiberty/libiberty.a Undefined symbols for architecture x86_64:  "_iconv", referenced from:
     convert_using_iconv(void*, unsigned char const*, unsigned long, _cpp_strbuf*) in libcpp.a(charset.o)
    (maybe you meant: __Z14cpp_init_iconvP10cpp_reader, __cpp_destroy_iconv )  "_iconv_close", referenced from:
     __cpp_destroy_iconv in libcpp.a(charset.o)
     __cpp_convert_input in libcpp.a(charset.o)  "_iconv_open", referenced from:
     init_iconv_desc(cpp_reader*, char const*, char const*) in libcpp.a(charset.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[3]: *** [build/genmatch] Error 1 make[2]: *** [all-stage1-gcc] Error 2 make[1]: *** [stage1-bubble] Error 2 make:
*** [all] Error 2

(Полный журнал доступен по адресу https://gist.github.com/3cb5d044533e657f4add.)

После исследования gcc/Makefile оказалось, что переменная BUILD_CPPLIB не включает $(LIBICONV), так как во время ошибки она находится в начальной загрузке stage1. Соответствующему разделу предшествует

# For stage1 and when cross-compiling use the build libcpp which is
# built with NLS disabled.  For stage2+ use the host library and
# its dependencies.

Тем не менее, ясно, что сборка stage1 build/genmatch ссылается на libcpp, которая использует символы из libiconv. Значит, что-то здесь не так.

Как я могу это исправить?


person Noldorin    schedule 22.11.2015    source источник
comment
Есть ли особая причина, по которой вам нужно построить его с нуля? Если нет, то вы можете просто установить последнюю версию gcc, например. Доморощенное пиво ?   -  person Paul R    schedule 23.11.2015
comment
Я пытаюсь взломать его.   -  person Noldorin    schedule 23.11.2015
comment
ОК - в таком случае удачи!   -  person Paul R    schedule 23.11.2015
comment
Ха, точно. Я смотрел на формулу доморощенного раньше, и кажется, что основное отличие состоит в том, что моя сборка использует систему компилятора clang для начальной загрузки.   -  person Noldorin    schedule 23.11.2015
comment
Вы можете увидеть мою последнюю методику, о которой сообщалось, по адресу Установка GNU GCC на Mac. С тех пор я собрал и установил GCC 5.2.0 на Mac OS X 10.11, используя аналогичную технику, но с немного обновленными версиями библиотек. OTOH, мне пришлось избегать использования самых последних версий GMP (6.0.0a не работала; 5.1.3 была хорошей) и ISL (0.14 была в порядке, а 0.15 — нет). Я по-прежнему использую исходный код для Cloog, GMP, ISL, MPC, MPFR в исходном каталоге GCC. В последнее время мне не удалось добиться успеха с теми, кто находится за пределами исходного каталога GCC.   -  person Jonathan Leffler    schedule 23.11.2015
comment
@JonathanLeffler Спасибо за эту ссылку. Там есть дельный совет!   -  person Noldorin    schedule 23.11.2015
comment
Иногда у меня возникали проблемы с некоторыми awk скриптами в исходниках GCC. Мне пришлось взломать его / их, чтобы заставить его работать нормально. У меня где-то есть кое-какая информация — думаю, она должна быть на другой моей машине, на которой до сих пор работает Yosemite вместо El Capitan. Кричите, если вам нужен мой последний скрипт компиляции или другая помощь — смотрите мой профиль, если это лучше сделать вне SO.   -  person Jonathan Leffler    schedule 23.11.2015
comment
@JonathanLeffler Подойдет. Оцените предложение о помощи. Я попробую некоторые из ваших предложений и свяжусь с вами, если возникнут проблемы.   -  person Noldorin    schedule 23.11.2015
comment
@JonathanLeffler Боюсь, пока не повезло. Используете ли вы IRC? Вам на почту? Что бы ни работало лучше всего. Как вы говорите, это, вероятно, лучше всего сделать вне SO.   -  person Noldorin    schedule 23.11.2015
comment
Электронная почта — см. мой профиль.   -  person Jonathan Leffler    schedule 23.11.2015


Ответы (3)


Обсуждение

Сборка 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
comment
Спасибо, что разместили это здесь, Джонатан. Я считаю, что это довольно полно, но позвольте мне упомянуть две вещи: 1) использование последних пакетов MacPorts для gmp, mpfr, mpc, isl, libiconv, казалось, работает достаточно хорошо для меня, хотя сборка из исходного кода, возможно, более надежна, 2) я необходимо сначала деактивировать/удалить пакет libunwind-headers на MacPorts, чтобы он не мешал сборке. - person Noldorin; 26.11.2015
comment
Отличный ответ. Я собирал версии gcc на своем Mac, и у меня было несколько подобных проблем. У меня есть еще несколько предложений, которые не будут хорошо работать в качестве комментариев к этому ответу, поэтому я собираюсь добавить второй ответ, хотя он не будет очень хорошим или полным. Это может быть хорошей темой для вики-ответа сообщества. (Но я недостаточно знаю о них, чтобы начать.) - person Steve Summit; 04.03.2016
comment
Помимо того, что Cloog вообще не используется и используются последние версии ISL и GMP, приведенные здесь рекомендации — это то, что я использовал для установки GCC 7.2.0 на macOS Sierra 10.12.5 — и, похоже, это работает нормально для меня. Я также использовал их для промежуточных версий GCC в промежуточных версиях macOS и Mac OS X. При запуске кода C++ мне все еще нужно установить DYLD_LIBRARY_PATH, чтобы выбрать стандартную библиотеку C++ GCC. - person Jonathan Leffler; 25.08.2017

Во-первых, см. очень полный ответ Джонатана Леффлера. У меня есть еще несколько предложений здесь.

Процесс конфигурации и сборки gcc должен найти собственные заголовочные файлы вашей системы и библиотеки времени выполнения C. Более новые версии Xcode на основе clang скрывают их довольно глубоко, а более старые версии gcc, похоже, не знают, как их найти. Чтобы вообще собрать gcc 4.6, мне пришлось создать эти символические ссылки:

ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include /usr
ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib/dylib1.10.5.o /usr/local/lib
ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib/crt1.10.5.o /usr/local/lib
ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib/bundle1.o /usr/local/lib

Ваш пробег, вероятно, будет немного отличаться: обратите внимание, что эти пути под /Applications/Xcode.app/Contents имеют различные номера версий, которые, вероятно, будут отличаться в вашей системе.

(Если, как описывает Джонатан, новейшие версии MacOS не позволяют вам помещать что-либо в /usr, вам, возможно, придется вместо этого создать символическую ссылку /usr/include в /usr/local/include, и я подозреваю, что это тоже сработает.)

Кроме того, это упоминается в другом месте, но это необычное требование, и его легко упустить: не пытайтесь собрать gcc в его собственном исходном дереве. Всегда создавайте каталог сборки, который является параллельным сестринским, а не дочерним по отношению к каталогу, в который вы распаковали исходники gcc. То есть не делайте следующее:

tar xzf gcc-x.y.z.tar.bz2
cd gcc-x.y.z       # WRONG
mkdir build
cd build
../configure       # WRONG
make

Вместо этого сделайте следующее:

tar xzf gcc-x.y.z.tar.bz2
mkdir build
cd build
../gcc-x.y.z/configure
make

Я знаю, что это противоречит здравому смыслу, и многие другие пакеты работают иначе, но это определенно работает для gcc, и это рекомендуемый способ.

Еще один момент: если вы обнаружите, что ваша сборка дает сбой из-за того, что вы неправильно ее настроили, так что вам нужно перезапустить configure с другими параметрами, безопаснее удалить весь каталог сборки и начать с нуля. Система настройки и сборки иногда, но, кажется, не на 100% надежно, обнаруживает, что в этом случае может потребоваться перестроение. (Согласен, удалять и начинать заново — это неприятно, но опять же, в долгосрочной перспективе это действительно может сэкономить время.)

Наконец, если вы пытаетесь создать кросс-компилятор, см. дополнительные предложения и комментарии по адресу установить gcc 4.6.1 на OS X 10.11 .

person Steve Summit    schedule 04.03.2016

Что бы это ни стоило, у MacPorts есть порты для всех последних версий, которые должны быть достаточно простыми для всех (кто умеет программировать!), Кто не хочет устанавливать MacPorts, но предпочитает устанавливать различные зависимости, упомянутые здесь, каким-то другим способом.

Слегка подправленная персональная версия порта для gcc 6.3.0: https://github.com/RJVB/macstrop/blob/master/lang/gcc6/Portfile

Причина, по которой я упоминаю об этом (и публикую этот ответ), заключается в том, что эта измененная версия показывает, как заставить G++ использовать libc++ вместо libstdc++. Это прерогатива возможности использовать G++ в качестве реальной замены clang++, которую можно использовать, не беспокоясь о несовместимости среды выполнения C++. Этот патч позволил мне использовать g++ для сборки кода KDE (KF5) и запускать его для Qt5 и фреймворков KF5, созданных с различными версиями компилятора clang. (Файлы исправлений находятся в .../gcc6/files .)

Некоторое объяснение, которое может помочь в интерпретации кода Tcl связанного файла:

Игнорируйте все, что относится к $subport == "libgcc".

Как видите, вам нужны gmp, mpc, mpfr и isl (остальные зависимости не должны представлять интереса, если вы устанавливаете самостоятельно).

Выражения configure.args создают список аргументов для скрипта configure, configure.env и build.env добавляют переменные среды для команд configure и build (make). Многие из параметров настройки здесь предназначены для обеспечения того, чтобы сборка использовала зависимости от MacPorts, но они, вероятно, также потребуются, если вы хотите или должны использовать местоположение, не контролируемое SIP и не включенное в стандартные определения PATH (компилятор по-прежнему должен работать при вызове через процесс, который сбрасывает путь).

Конфигурация и сборка выполняются в каталоге сборки, который находится рядом с исходным каталогом, что позволяет очень легко начать заново или просто очистить, не выбрасывая исходники. После этапа настройки сборка выполняется с помощью «make bootstrap-lean», что по-прежнему создает около 1,7 ГБ данных в этом каталоге сборки.

person RJVB    schedule 13.05.2017