Changing the CHOST variable/ru

Данный документ объясняет, как изменить переменную CHOST на существующей системе.

Введение
Изменение CHOST может доставить много «головной боли» и серьезно испортить вашу систему. Зачем тогда нужно данное руководство?

Существуют ситуации, когда изменение CHOST необходимо. К примеру, вы хотите обновить библиотеку glibc до версии 2.4, которая поддерживает nptl, но в CHOST — i386, что делает использование nptl невозможным. В данном случае у вас не так уж и много возможностей, и изменение CHOST — это одна из них.

Проблемы могут возникнуть, даже если следовать этим инструкциям, так что, пожалуйста, внимательно читайте и очень тщательно выполняйте их. В данном примере мы изменим CHOST с i386 на i686. Если вы делаете другое изменение, то, пожалуйста, скорректируйте команды соответствующим образом.

Собираем пакеты
Сначала отредактируйте файл, изменив значение CHOST на то, которое вам необходимо. Затем пересоберите пакеты в данном порядке:

Проверяем, что всё работает
Пришло время проверить, что настройки  и   в порядке, и никакого «мусора» в  не осталось.

Вывод  и   должен выглядеть следующим образом (может отличаться в зависимости от вашей версии gcc и значения CHOST, здесь gcc 4.1.1 и i686):

Теперь проверим, остались ли указания на старый CHOST в :

Перед удалением файла проверьте файлы с новым CHOST:

Всё выглядит хорошо, так как для  всегда должен быть только один файл в  (например, 05gcc), так что удалим файл с ошибочными указаниями:

Аналогично поступим с файлами : если существует больше одного файла, смотрим, который является устаревшим и удаляем его. Далее, проверьте.

Выглядит отлично, эти два файла и должны быть тут. Пришло время заглянуть в каталог gcc.

Файлы и  в порядке, а  — «мусор», который нужно удалить.

Теперь запустите следующую команду для обновления переменных среды:

Проверим, что всё в порядке:

Если что-то нашлось, значит вы пропустили какие-то файлы. Разберитесь с ними перед тем как продолжить.

Завершение изменений
Теперь нужно пересобрать  и запустить. Убедитесь, что указали правильную версию gcc (текущую выбранную, здесь 4.1.1) и передали вашу старую архитектуру (здесь i386) в качестве аргумента. Замените $CHOST новым значением переменной CHOST, а  вашей версией gcc. Следующий пример подразумевает CHOST=i686.

Если хотите, можете пересобрать все пакеты в системе:

Теперь всё сделано, теоретически. Но нет 100% гарантии, что так и будет. Если вы не пересобирали цель world, то вам нужно перекомпилировать как минимум следующий набор пакетов:

Все пакеты, использующие perl устанавливаются в каталог, связанный с CHOST, а значит, требуют пересборки. Если в системе не установлен, установите сначала.

Если вы обнаружили пакет, который также требует пересборки, то, пожалуйста, дайте знать автору этого документа.

Известные проблемы
При обновлении с gcc 3.3 до 4.1 одновременно с изменением CHOST (и всё же, пожалуйста, не делайте этого), пара пользователей сообщала о «битых» пакетах, которые нуждаются в пересборке, таких как groff и courier:

Error messsage

Это происходит, поскольку процессе обновления CHOST не соответствует CTARGET, из-за чего компилятор выполняет кросс-компиляцию. Как следствие, LDPATH не вносится в, что приводит к ошибке.

Вы можете посмотреть, какие пакеты нуждаются в пересборке после обновления GCC в нашем руководство по обновлению GCC.

В некоторый редких случаях, могут также «сломаться» старые версии python. Это можно исправить, добавив (измените в соответствии с вашим старым CHOST и вашей старой версией gcc) в, запустив   и, затем,. Однако, как вы можете видеть, этих проблем определённо стоит избегать — не изменяйте CHOST и версию gcc одновременно.

Обратная связь
На этом, должно быть, всё. Отзывы (как в случае, если это сработало, так и в случае неудачи или неожиданных проблем) приветствуются: пожалуйста, пишите на e-mail или на форуме в этом треде. Многое в этом руководстве сделано участником vapier, спасибо за помощь!

Благодарности
Мы хотели бы поблагодарить следующих авторов и редакторов за их вклад в это руководство:


 * Wernfried Haas
 * Mike Frysinger
 * Chris White