Upgrading GCC/ru

Данный документ проведет пользователя через процесс обновления GCC.

Введение
Эта статья о апгрейде GCC. Даунгрейд GCC может привести к нежелательным побочным эффектам. Обратитесь к разделу устранения проблем по поводу часто возникающих проблем.

Следующий раздел быстро введет вас в процесс обновления GCC (и того, как просто его сделать). Если вы хотите прочитать длинное объяснение причин, стоящих за обновлением GCC, продолжайте читать Объяснение обновления GCC.

Short version
Если вы обновляете GCC, то вам вообще не нужно ничего делать, кроме смены версии компилятора и пересборки libtool:

If you upgrade GCC from a version earlier than 3.4.0 (for the 3.x series) or 4.1, you will need to run revdep-rebuild as well:

Проверьте текущую версию и удалите старую версию

Вот и все. Наслаждайтесь новым компилятором!

Введение
GCC upgrading has always been mystified, with suggestions ranging from "You do not need to do anything" up to "You will need to rebuild your entire system twice". Most of this FUD comes from the confusion surrounding ABI incompatibility. But first a quick pointer towards libtool.

libtool и fix_libtool_files.sh
Более старые версии GCC на Gentoo требовали запуска специальной команды, называемой. Некоторое время назад, выполнение данной команды было встроено в сам процесс установки пакета (через toolchain eclass), поэтому пользователям больше не нужно делать это самим.

The reason we need to rebuild libtool after the upgrade of gcc versions is because of its main purpose: libtool is a toolset that aggregates platform-specific code in a generic interface, allowing applications to build against shared libraries without needing to deal with the platform specific aspects of shared libraries. To fulfill its function properly, the libtool script uses various library locations that have hard-coded gcc version information in them.

ABI changes
An ABI, or Application Binary Interface, is a set of conventions used by all tools that deal with binary representation of programs, including compilers, assemblers, linkers and language runtime support (source: GCC Binary Compatibility). When the ABI used for binary applications and libraries is changed, you will risk getting linker errors or malfunctioning programs unless you rebuild all libraries that use C++ code. Yes, C++, since most incompatibilities occur within the C++ ABI. This is also why we use the revdep-rebuild command against the library.

So why is this only needed up to GCC 3.4.0/4.1? That's because from that version onward, GCC uses a forward compatible ABI, which removes the need for rebuilding applications and libraries. Of course, guarantees can never be given indefinitely, but when an incompatibility occurs again, we'll definitely document it here. In that case, the version of the library will probably be increased.

Rebuilding everything
Некоторые люди клянутся, что нужно пересобрать все пакеты на их системе при выходе новой версии GCC. Конечно, в этом нет смысла, так как многие приложения не используют GCC для процесса сборки и установки, и на них вообще не распространяется это изменение.

Это, однако, не означает, что они полностью неправы: новые версии GCC часто предлагают более хорошую поддержку набора инструкций процессора, а это может повлиять на производительность приложений в лучшую сторону. Хотя, чаще всего, данное улучшение очень маленькое, в некоторых случаях (особенно для приложений, сильно использующих процессор) это может привести к существенному улучшению.

There are also known cases where packages need to be built with the same compiler. Although these packages are usually bumped by Gentoo simultaneously (so that they are always built with the same GCC version) cherry-picking re-installs on these packages might prove to be troublesome. The various packages are a nice example on this matter.

libstdc++.so.6: version `GLIBCXX_3.4.15' not found
В процессе обновлений вы можете встретить ошибку, похожую на следующую:

Это означает, что вы пытаетесь собрать пакет более старой версией GCC, чем собирались библиотеки, от которых зависит пакет. Помните, мы говорили, что C++ ABI обратно совместим? Это так, но означает только, что для сборки приложений и линковки библиотек могут использоваться более новые (или те же самые) версии GCC (по сравнению с версией GCC, использованной для сборки этих библиотек).

Для пересоборки всех зависящих от libstdc++ пакетов можно выполнить следующий bash-скрипт.

Какие пакеты определенно нужно пересобрать?
В следующей таблице приведены пакеты, которые нужно пересобрать, если они установлены, и причины этой необходимости.