Руководство Gentoo Linux по обновлению GCC
1.
Введение
Обновление GCC
Зачем нужно обновлять? Ну, GCC довольно похож на любой другой пакет
в вашей системе, но чуточку более важен. GCC следует обновлять всякий
раз, когда в новой версии исправляются какие-нибудь раздражающие вас ошибки,
добавляется новые нужные функции, или если вы хотите держать свою систему
обновленной. Если ни один из этих случаев к вам не относится, обновление
можно спокойно откладывать, пока ваша версия GCC поддерживается разработчиками
Gentoo.
Если вы устанавливаете новую версию GCC, система не переключается на ее
использование автоматически. Вам необходимо явно запросить изменение,
потому что в процессе перехода может потребоваться несколько дополнительных
шагов. Если вы решите не переключаться, система Portage продолжит использовать
более старую версию компилятора, пока вы не передумаете или пока не удалите
старый компилятор из своей системы.
В этом руководстве описываются необходимые шаги, нужные для полноценного
обновления компилятора, используемого вашей системой Gentoo. Отдельный раздел
посвящен переходу с GCC 3.3 на 3.4 или более
новые версии и проблемам с libstdc++. Другой частный раздел
предназначен пользователям, впервые устанавливающим
Gentoo из архива третьей стадии (stage3), после выхода новой
версии GCC.
Примечание:
Необходимо заметить, что обновление с GCC-3.4 до GCC-4.0 или более нового
не требует существенных изменений от пользователя, так как GCC-3.4 и GCC-4.0
используют одинаковый двоичный прикладной интерфейс (ABI). Все что нужно, это
использовать gcc-config, чтобы выбрать желаемый компилятор.
|
2.
Общие указания по обновлению
Введение
Важно:
Если вы ищете подробные указания по обновлению с GCC-3.3 на GCC-3.4 или более
новый, обратитесь к соответствующему
разделу.
|
Важно:
Если вы ищете подробные указания по обновлению GCC на вновь установленных
системах, обратитесь к соответствующему
разделу.
|
Вообще говоря, переход на версии с исправленными ошибками (bugfix
release), как с 3.3.5 на 3.3.6, должен быть довольно безопасен: надо только
установить новую версию, переключиться на нее и пересобрать единственный
затрагиваемый пакет — libtool. Однако, при некоторых обновлениях
GCC нарушается двоичная совместимость, в таких случаях может потребоваться
пересборка не только затрагиваемых пакетов, но и даже всего системного набора
и пакетов, необходимых для компиляции.
Говоря о необходимости ручного переключения на новую версию компилятора, мы
сказали, что оно не происходит автоматически. Тем не менее, есть одно
исключение — переход на версию с исправленными ошибками (как с 3.3.5
на 3.3.6), если не используется режим «multislot», позволяющий
обеим версиям сосуществовать в одной системе. По умолчанию этот режим выключен,
ведь большинству пользователей он ничего не даcт.
Листинг 2.1: Обновление GCC |
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# emerge --oneshot -av libtool
|
Теперь пересоберите набор программ для компиляции, затем world, используя новый
компилятор.
Листинг 2.2: Пересборка системы |
# emerge -eav system
# emerge -eav world
|
Теперь можно без опасений удалить старую версию GCC. Если вы чувствуете такую
необходимость, введите следующую команду (как обычно, вместо
=sys-devel/gcc-3.3* укажите версию, которую собираетесь удалить):
Листинг 2.3: Удаление более старой версии GCC |
# emerge -aC =sys-devel/gcc-3.3*
|
3.
Переход с GCC-3.3 на 3.4 или более новый
Введение
Переход с GCC-3.3 на 3.4 или более новую версию не так гладок, ведь между
этими версиями изменился двоичный прикладной интерфейс C++ (ABI). Также
придется позаботиться о существующей проблеме с библиотекой libstdc++.
Варианты
Важно:
Если вы обновляете GCC на машине SPARC, вам придется выбрать путь
полной пересборки системы
из-за некоторых внутренних
изменений двоичного
интерфейса (ABI) GCC в области передачи параметров функций.
|
У вас есть два варианта обновления системы. Первый способ быстрее и
требует использования программы revdep-rebuild из пакета
gentoolkit, а во втором
вся система пересобирается с нуля, чтобы задействовать новые возможности GCC.
Ваше дело, какой из способов выбрать. В большинстве случаев первого способа
достаточно.
Использование revdep-rebuild
Если вы выбрали этот способ, нужно сначала установить gentoolkit,
если вы еще этого не сделали. Затем обновите GCC и переключите систему на новый
компилятор. Также пересоберите пакет libtool, чтобы обеспечить
пригодность программ для компиляции.
Листинг 3.1: Установка gentoolkit и обновление GCC |
# emerge -an gentoolkit
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# emerge --oneshot -av libtool
|
Теперь посмотрите, какие пакеты собирается пересобирать revdep-rebuild.
Затем запустите revdep-rebuild на собственно пересборку. Это займет некоторое
время, так что потерпите.
Листинг 3.2: Использование revdep-rebuild |
# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5
|
Примечание:
Возможно, у вас появятся проблемы с несуществующими версиями пакетов
из-за того, что они устарели или замаскированы. В этом случае можно
при запуске revdep-rebuild указать параметр --package-names.
Это заставит пакеты пересобираться, основываясь на именах пакетов, вместо
точного имени и версии.
|
Для обеспечения совместимости с более старыми двоичными приложениями C++ и
любыми пакетами, которые revdep-rebuild мог пропустить, надо установить пакет
sys-libs/libstdc++-v3 до того, как удалять GCC 3.3 из своей системы.
Листинг 3.3: Установка libstdc++-v3 и удаление GCC |
# emerge --oneshot sys-libs/libstdc++-v3
# emerge -aC =sys-devel/gcc-3.3*
|
Использование emerge -e
Этот гораздо более медленный способ пересобирает всю систему, гарантируя, что
все пересобирается новым компилятором, и, таким образом, он безопаснее. Сперва
потребуется обновить GCC и libtool, и переключить систему на новый компилятор.
Листинг 3.4: Обновление GCC |
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# emerge --oneshot -av libtool
|
Для обеспечения совместимости с более старыми двоичными приложениями C++, надо
установить в систему пакет sys-libs/libstdc++-v3.
Листинг 3.5: Установка libstdc++-v3 |
# emerge --oneshot sys-libs/libstdc++-v3
|
Теперь займемся пересборкой сначала пакетов system, а затем world. Это займет
очень длительное время, зависящее от количества установленных пакетов: ведь
будут пересобираться все средства компиляции и поддерживающие системные
файлы, а затем каждый пакет, находящийся в вашей системе. Это необходимо,
чтобы все пакеты были гарантированно скомпилированы уже с новыми средствами
компиляции, включая сами эти средства.
Листинг 3.6: Пересборка system и world |
# emerge -e system
# emerge -e world
|
Теперь можно удалить старые версии GCC, не вызывая проблем:
Листинг 3.7: Очистка |
# emerge -aC =sys-devel/gcc-3.3*
|
4.
Обновление GCC на новой установке
Введение
Обновление GCC в системе после установки из архива третьей стадии (stage3)
— дело простое. Отсутствие изобилия установленных программ, которые
ссылаются на старую версию GCC — это преимущество пользователей,
только что установивших систему. В следующем примере показывается обновление
с GCC-3.3 на 3.4 или более новые версии. При обновлении с других версий GCC
будут кое-какие отличия. Например, имена библиотек, используемые ниже для
revdep-rebuild, относятся к версии GCC 3.3, также, как и необходимость
установки libstdc++-v3.
Пока пользователь не внес каких-либо изменений в систему, для получения
системы с новой версией GCC нужно всего несколько шагов. Также, как и
при обновлении с GCC-3.3 до 3.4, у пользователя есть две возможности.
Но, в отличие от обновления с GCC-3.3 до 3.4, здесь обновление проще,
так как различий между способами меньше. Первый способ быстрее, и задействует
программу revdep-rebuild из пакета gentoolkit, подобно
вышеописанной процедуре обновления. Использование revdep-rebuild
предполагает пересборку только тех пакетов, которые действительно ссылаются на
библиотеки GCC, тогда как при втором
способе система полностью перекомпилируется с новой версией GCC, что
занимает намного больше времени. Второй способ никогда не потребуется, и описан
только для полноты картины.
Приведенные первые шаги одинаковы для обоих способов, и должны делаться в любом
случае.
Листинг 4.1: Обновление GCC |
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# emerge --oneshot -av libtool
|
Для обеспечения совместимости с более старыми двоичными приложениями C++, надо
установить в систему пакет sys-libs/libstdc++-v3.
Листинг 4.2: Установка libstdc++-v3 |
# emerge --oneshot sys-libs/libstdc++-v3
|
Использование revdep-rebuild
Этот способ требует, чтобы вы сначала установили пакет gentoolkit, если
это еще не сделано. Затем запустите программу revdep-rebuild, чтобы
просканировать установленные пакеты, найти и пересобрать нужные.
Листинг 4.3: Установка gentoolkit и запуск revdep-rebuild |
# emerge -an gentoolkit
# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5
|
Примечание:
Возможно, у вас появятся проблемы с несуществующими версиями пакетов
из-за того, что они устарели или замаскированы. В этом случае можно
при запуске revdep-rebuild указать параметр --package-names.
Это заставит пакеты пересобираться, основываясь на именах пакетов, вместо
точного имени и версии.
|
Использование emerge -e
Этот способ, будучи гораздо медленнее, пересобирает всю систему, гарантируя,
что все пересобрано новым компилятором. Это необязательно, но допустимо,
если вы также изменяете переменную среды CFLAGS или другие переменные
make.conf, которые влияют на компиляцию системы.
Так как эти действия выполняются сразу после первоначальной установки, не
потребуется перекомпилировать world, как мы поступили бы для обновления
компилятора в ранее установленной системе. Однако, для пущей уверенности в том,
что обновлены все пакеты, можно запустить обновление цели world
вместо system.
Листинг 4.4: Пересборка system |
# emerge -e system
|
Очистка
Теперь можно удалить старые версии GCC, не вызывая проблем. Выражение
ВАША-НОВАЯ-ВЕРСИЯ-GCC замените номером версии, на которую вы перешли:
Листинг 4.5: Очистка |
# emerge -aC "<sys-devel/gcc-ВАША-НОВАЯ-ВЕРСИЯ-GCC"
|
5.
Обычные грабли
Важно на время обновления отключить distcc. Смешение версий компилятора
на разных узлах вызовет проблемы при сборке. Это не относится к
ccache, так как объекты кэша будут в любом случае сделаны недействительными.
Всегда используйте одну и ту же версию GCC для своего ядра и дополнительных
модулей ядра. Как только вы пересоберете world с новым GCC, внешние модули
(например, app-emulation/qemu-softmmu) не смогут загрузиться. Пожалуйста,
чтобы это исправить, пересоберите свое ядро новой версией GCC.
Если вы обновляете GCC на машине SPARC, обязательно еще раз запустите silo
-f после пересборки world, чтобы избежать возможных проблем.
Распространенные сообщения об ошибках
Если ваша система жалуется на что-то вроде libtool: link:
`/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/libstdc++.la' is not a valid
libtool archive, запустите /sbin/fix_libtool_files.sh 3.3.6
(замените «3.3.6» на номер версии из сообщения об ошибке).
Если вы увидели error: /usr/bin/gcc-config: line 632:
/etc/env.d/gcc/i686-pc-linux-gnu-3.3.5: No such file or directory,
тогда попробуйте удалить
/etc/env.d/gcc/config-i686-pc-linux-gnu и снова запустить
gcc-config, следом указав source /etc/profile. Делайте это
только тогда, когда у вас не настроены никакие кросс-компиляторы.
Если при emerge -e system или emerge -e world
не собирается пакет, выполнение можно продолжить командой
emerge --resume. Если ошибка появляется снова и снова,
пропустите пакет, указав emerge --resume --skipfirst.
Не запускайте параллельно другие экземпляры emerge, чтобы не потерять
информацию, нужную для возобновления.
Если во время обновления компиляторв встретится ошибка spec failure:
unrecognized spec option, попробуйте откатиться на свой компилятор по
умолчанию, убрать переменную GCC_SPECS и снова обновить компилятор:
Листинг 5.1: Восстановление первичной настройки компилятора |
# gcc-config 1
# source /etc/profile
# unset GCC_SPECS
# emerge -uav gcc
|
Текст этого документа распространяется на условиях лицензии
Creative Commons
- Attribution / Share Alike.
|