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

  Martin Matuska

   <mm@FreeBSD.org>

   Izdanie: 43126

   Avtorskie prava (c) 2009 The FreeBSD Documentation Project

   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)>>.

   2013-11-07 gabor.
   Annotaciya

   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.

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

   Soderzhanie

   1. Predislovie

   2. Podgotovka

   3. Nastrojka portov na ispol'zovanie trebuemoj versii GCC

   4. Vliyanie na proizvoditel'nost' ispolnyaemyh fajlov

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}.

  Primechanie:

   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

  Primechanie:

   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.

  Preduprezhdenie:

   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.
