Copyright © 2009 The FreeBSD Documentation Project
$FreeBSD: head/ru_RU.KOI8-R/articles/custom-gcc/article.xml 39632
2012-10-01 11:56:00Z gabor $
FreeBSD это зарегистрированная торговая марка FreeBSD Foundation.
Многие из обозначений, используемые производителями и продавцами для обозначения своих продуктов, заявляются в качестве торговых марок. Когда такие обозначения появляются в этом документе, и Проекту FreeBSD известно о торговой марке, к обозначению добавляется знак ''™'' или ''®''.
Компилятор, поставляемый с FreeBSD 8.0, — это GCC версии 4.2.1. В базовую систему FreeBSD включены binutils версии 2.15. Это довольно-таки старые версии, и в них, между прочим, отсутствует поддержка новых инструкций CPU, таких как SSSE3, SSE4.1, SSE4.2 и т.п. Ввиду лицензионных ограничений, новые версии этих приложений не будут включены в базовую систему. К счастью, есть возможность использовать более новую версию компилятора GCC (например, версию 4.4) установив его из коллекции портов FreeBSD.
Чтобы задействовать все новые функциональные возможности последней версии GCC, желательна установка наиболее новой версии binutils. Это не является обязательным, но без обновления binutils вы не получите поддержку новых инструкций CPU.
Для того, чтоб установить наиболее новую версию binutils используя коллекцию портов FreeBSD, выполните следующую команду:
# cd /usr/ports/devel/binutils && make install
В коллекции портов FreeBSD можно найти несколько новых версий GCC. В нашем примере мы устанавливаем стабильную версию 4.4. Однако, возможно установить предыдущую или более новую (развивающуюся) версию (например: lang/gcc43 или lang/gcc45).
Для установки одного из вышеупомянутых портов GCC, наберите следующую команду:
# cd /usr/ports/lang/gcc44 && make install
Для использования требуемой версии GCC, установленной из коллекции портов FreeBSD, требуется дополнительная конфигурация системы.
Добавьте следующие строки в /etc/make.conf (или исправьте существующие):
.if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc44) CC=gcc44 CXX=g++44 CPP=cpp44 .endif
В качестве альтернативы, можно установить вручную переменные окружения ${CC} и ${CPP}.
Замечание: Примеры, приведённые выше, сделаны для GCC версии 4.4. Для того, чтобы использовать gcc43, замените "gcc44" на "gcc43" и "4.4" на "4.3" и т.п.
Многие установленные из портов приложения и библиотеки скомпонованы с libgcc_s или libstdc++. В базовую систему уже включены эти библиотеки, но от более старой версии GCC (версии 4.2.1). Чтобы предоставить rltd (и ldd) правильные версии, добавьте следующие записи к /etc/libmap.conf (или измените существующие):
libgcc_s.so.1 gcc44/libgcc_s.so.1 libgomp.so.1 gcc44/libgomp.so.1 libobjc.so.3 gcc44/libobjc.so.2 libssp.so.0 gcc44/libssp.so.0 libstdc++.so.6 gcc44/libstdc++.so.6
Замечание: Пример выше приведен для GCC версии 4.4. Если вы используете gcc43, замените "gcc44" на "gcc43" и т.д. Следует отметить, что все вышеупомянутые библиотеки обратно совместимы с библиотеками, поставляемыми с базовой системой.
Внимание: Некоторые C++ программы могут перестать работать, если отсутствует корректная компоновка этих библиотек. Если невозможно скомпоновать их все, рекомендуется сделать это по крайней мере для libstdc++.so.
Для портов, не поддерживающих специальные установки CFLAGS, исправьте /etc/make.conf согласно следующему примеру:
.if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc44) CC=gcc44 CXX=g++44 CPP=cpp44 CFLAGS+=-mssse3 .endif
Возможно заменить полностью CFLAGS и/или определить CPUTYPE. Мы рекомендуем устанавливать CPUTYPE так как во многих портах флаги оптимизации выбираются, базируясь на значении этой переменной.
Для того, чтобы исключить порты, которые не собираются со специальной версией GCC, исправьте /etc/make.conf согласно следующему примеру:
.if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc44) .if empty(.CURDIR:M/usr/ports/net/openldap*) CC=gcc44 CXX=g++44 CPP=cpp44 .endif .endif
Пример, приведённый выше, отменяет принудительное использование gcc 4.4 для портов net/openldap*. Также возможно указать больше портов в одной строке:
.if empty(.CURDIR:M/usr/ports/net/openldap*) && empty(.CURDIR:M/usr/ports/xxx/yyy) && ...
Использование GCC версии 4.4 с разрешенным набором инструкций SSSE3 (если они поддерживаются CPU) может дать до 10% увеличения средней производительности исполняемых файлов. В некоторых тестах прирост производительности превышал 20% (например, в обработке мультимедийных данных).
В таблице, размещенной на http://people.freebsd.org/~mm/benchmarks/perlbench/, показано сравнение GCC в настоящее время включенного в базу FreeBSD, GCC версии 4.3 и GCC версии 4.4 с различными комбинациями CFLAGS. Для сравнений производительности использовался тестовый пакет perlbench.
Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.