  Ispol'zovanie bolee novyh versij GCC i binutils c kollekciej portov
                                FreeBSD

  Martin Matuska

   <mm@FreeBSD.org>

   Copyright (c) 2009 The FreeBSD Documentation Project

   $FreeBSD: doc/ru_RU.KOI8-R/articles/custom-gcc/article.sgml,v 1.2
   2010/02/19 17:03:52 gabor Exp $

   FreeBSD `eto zaregistrirovannaya torgovaya marka FreeBSD
   Foundation.

   Mnogie iz oboznachenij, ispol'zuemye proizvoditelyami i prodavcami
   dlya oboznacheniya svoih produktov, zayavlyayutsya v kachestve
   torgovyh marok. Kogda takie oboznacheniya poyavlyayutsya v `etom
   dokumente, i Proektu FreeBSD izvestno o torgovoj marke, k
   oboznacheniyu dobavlyaetsya znak ''(TM)'' ili ''(R)''.

   V `etoj stat'e opisano, kak ispol'zovat' bolee novye versii
   kompilyatorov GCC i nabora utilit binutils iz kollekcii portov
   FreeBSD. Zdes' takzhe obsuzhdayutsya specializirovannye
   konfiguracii GCC.

     --------------------------------------------------------------

1. Predislovie

   Kompilyator, postavlyaemyj s FreeBSD 8.0, -- `eto GCC versii
   4.2.1. V bazovuyu sistemu FreeBSD vklyucheny binutils versii 2.15.
   `Eto dovol'no-taki starye versii, i v nih, mezhdu prochim,
   otsutstvuet podderzhka novyh instrukcij CPU, takih kak SSSE3,
   SSE4.1, SSE4.2 i t.p. Vvidu licenzionnyh ogranichenij, novye
   versii `etih prilozhenij ne budut vklyucheny v bazovuyu sistemu. K
   schast'yu, est' vozmozhnost' ispol'zovat' bolee novuyu versiyu
   kompilyatora GCC (naprimer, versiyu 4.4) ustanoviv ego iz
   kollekcii portov FreeBSD.

     --------------------------------------------------------------

2. Podgotovka

  2.1. Ustanovka binutils iz portov

   CHtoby zadejstvovat' vse novye funkcional'nye vozmozhnosti
   poslednej versii GCC, zhelatel'na ustanovka naibolee novoj versii
   binutils. `Eto ne yavlyaetsya obyazatel'nym, no bez obnovleniya
   binutils vy ne poluchite podderzhku novyh instrukcij CPU.

   Dlya togo, chtob ustanovit' naibolee novuyu versiyu binutils
   ispol'zuya kollekciyu portov FreeBSD, vypolnite sleduyuschuyu
   komandu:

 # cd /usr/ports/devel/binutils && make install

     --------------------------------------------------------------

  2.2. Ustanovka GCC iz portov

   V kollekcii portov FreeBSD mozhno najti neskol'ko novyh versij
   GCC. V nashem primere my ustanavlivaem stabil'nuyu versiyu 4.4.
   Odnako, vozmozhno ustanovit' predyduschuyu ili bolee novuyu
   (razvivayuschuyusya) versiyu (naprimer: lang/gcc43 ili
   lang/gcc45).

   Dlya ustanovki odnogo iz vysheupomyanutyh portov GCC, naberite
   sleduyuschuyu komandu:

 # cd /usr/ports/lang/gcc44 && make install

     --------------------------------------------------------------

3. Nastrojka portov na ispol'zovanie trebuemoj versii GCC

   Dlya ispol'zovaniya trebuemoj versii GCC, ustanovlennoj iz
   kollekcii portov FreeBSD, trebuetsya dopolnitel'naya konfiguraciya
   sistemy.

     --------------------------------------------------------------

  3.1. Izmeneniya v make.conf

   Dobav'te sleduyuschie stroki v /etc/make.conf (ili isprav'te
   suschestvuyuschie):

 .if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc44)
 CC=gcc44
 CXX=g++44
 CPP=cpp44
 .endif

   V kachestve al'ternativy, mozhno ustanovit' vruchnuyu peremennye
   okruzheniya ${CC} i ${CPP}.

     Zamechanie: Primery, privedionnye vyshe, sdelany dlya GCC versii
     4.4. Dlya togo, chtoby ispol'zovat' gcc43, zamenite "gcc44" na
     "gcc43" i "4.4" na "4.3" i t.p.

     --------------------------------------------------------------

  3.2. Ispravleniya v libmap.conf

   Mnogie ustanovlennye iz portov prilozheniya i biblioteki
   skomponovany s libgcc_s ili libstdc++. V bazovuyu sistemu uzhe
   vklyucheny `eti biblioteki, no ot bolee staroj versii GCC (versii
   4.2.1). CHtoby predostavit' rltd (i ldd) pravil'nye versii,
   dobav'te sleduyuschie zapisi k /etc/libmap.conf (ili izmenite
   suschestvuyuschie):

 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

     Zamechanie: Primer vyshe priveden dlya GCC versii 4.4. Esli vy
     ispol'zuete gcc43, zamenite "gcc44" na "gcc43" i t.d. Sleduet
     otmetit', chto vse vysheupomyanutye biblioteki obratno
     sovmestimy s bibliotekami, postavlyaemymi s bazovoj sistemoj.

     Vnimanie: Nekotorye C++ programmy mogut perestat' rabotat', esli
     otsutstvuet korrektnaya komponovka `etih bibliotek. Esli
     nevozmozhno skomponovat' ih vse, rekomenduetsya sdelat' `eto po
     krajnej mere dlya libstdc++.so.

     --------------------------------------------------------------

  3.3. Special'nye ustanovki CFLAGS dlya kollekcii portov

   Dlya portov, ne podderzhivayuschih special'nye ustanovki CFLAGS,
   isprav'te /etc/make.conf soglasno sleduyuschemu primeru:

 .if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc44)
 CC=gcc44
 CXX=g++44
 CPP=cpp44
 CFLAGS+=-mssse3
 .endif

   Vozmozhno zamenit' polnost'yu CFLAGS i/ili opredelit' CPUTYPE. My
   rekomenduem ustanavlivat' CPUTYPE tak kak vo mnogih portah flagi
   optimizacii vybirayutsya, baziruyas' na znachenii `etoj
   peremennoj.

     --------------------------------------------------------------

  3.4. Isklyuchenie portov, kotorye ne sobirayutsya s novoj versiej GCC

   Dlya togo, chtoby isklyuchit' porty, kotorye ne sobirayutsya so
   special'noj versiej GCC, isprav'te /etc/make.conf soglasno
   sleduyuschemu primeru:

 .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

   Primer, privedionnyj vyshe, otmenyaet prinuditel'noe ispol'zovanie
   gcc 4.4 dlya portov net/openldap*. Takzhe vozmozhno ukazat'
   bol'she portov v odnoj stroke:

 .if empty(.CURDIR:M/usr/ports/net/openldap*) && empty(.CURDIR:M/usr/ports/xxx/yyy) && ...

     --------------------------------------------------------------

4. Vliyanie na proizvoditel'nost' ispolnyaemyh fajlov

   Ispol'zovanie GCC versii 4.4 s razreshennym naborom instrukcij
   SSSE3 (esli oni podderzhivayutsya CPU) mozhet dat' do 10%
   uvelicheniya srednej proizvoditel'nosti ispolnyaemyh fajlov. V
   nekotoryh testah prirost proizvoditel'nosti prevyshal 20%
   (naprimer, v obrabotke mul'timedijnyh dannyh).

   V tablice, razmeschennoj na
   http://people.freebsd.org/~mm/benchmarks/perlbench/, pokazano
   sravnenie GCC v nastoyaschee vremya vklyuchennogo v bazu FreeBSD,
   GCC versii 4.3 i GCC versii 4.4 s razlichnymi kombinaciyami
   CFLAGS. Dlya sravnenij proizvoditel'nosti ispol'zovalsya testovyj
   paket perlbench.

     --------------------------------------------------------------

            `Etot, i drugie dokumenty, mogut byt' skachany s
                ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

  Po voprosam, svyazannym s FreeBSD, prochitajte dokumentaciyu prezhde
                 chem pisat' v <questions@FreeBSD.org>.
         Po voprosam, svyazannym s `etoj dokumentaciej, pishite
                           <doc@FreeBSD.org>.
  Po voprosam, svyazannym s russkim perevodom dokumentacii, pishite v
                    rassylku <frdp@FreeBSD.org.ua>.
  Informaciya po podpiske na `etu rassylku nahoditsya na sajte proekta
                               perevoda.
