Gentoo Logo

Gentoon GCC:n päivitysohje

Sisällysluettelo:

1.  Johdanto

GCC:n päivitys

Vaikka GCC on sinänsä kuin mikä tahansa muukin paketti koneella, se on käytännössä järjestelmän kannalta muita kriittisempi. GCC kannattaa päivittää vain kun uusi versio sisältää päivityksiä bugeihin, jotka päivitettävällä koneella ovat merkityksellisiä, kun tarpeellisia uusia toimintoja tulee tai kun järjestelmä täytyy jostain syystä pitää aivan ajanatasaisena. Muutoin GCC:n päivitys on turvallista ja kannattavaa lykätä tuonnemmaksi niin kauan kuin käytössä oleva GCC on Gentoon tukema versio.

Jos GCC:stä asennetaan kokonaan uusi pääversio, kuten päivityksessä 3.3.6:sta 3.4.5:een, järjestelmää ei siirretä automaattisesti. Tälläinen muutos pitää vahvistaa erikseen tekemällä tiettyjä asioita, jotka varmistavat kunnollisen päivitysprosessin. Jos tätä muutosta ei vahvisteta, Portage käyttää vanhempaa versiota GCC:stä kunnes muutos vahvistetaan tai vanha kääntäjä poistetaan. Pienemmät versiomuutokset toteututetaan automaattisesti, kuten vaikkapa päivitys 3.4.5:stä 3.4.6:een.

Tämä ohje auttaa suorittamaan päivityksen Gentoo-järjestelmään. Ohjeessa on kokonaan erillinen kappale päivitykseen versiosta 3.3 versioon 3.4 ja ongelmiin libstdc++:n kanssa. Toinen kappale on omistettu ensiasennukselle Gentoo-järjestelmään stage3-paketista uuden GCC-versiojulkaisun kanssa.

Varoitus: On tärkeää huomata, että päivityksessä versioon 4.1 tai uudempaan versioista 3.3 tai 3.4 tulee seurata yleistä päivitysohjetta , koska ABIt eroavat.

2.  Yleinen päivitysohje

Johdanto

Tärkeää: Jos olet päivittämässä 3.3:sta 3.4:ään, seuraa ohjetta erillisessä 3.3:sta 3.4:ään päivityskappaleessa.

Tärkeää: Jos olet asentamassa GCC:tä uuteen Gentoo-asennukseen, seuraa ohjetta uuden asennuksen päivityskappaleessa.

Yleisesti bugikorjauspäivitykset, kuten 3.3.5:stä 3.3.6:een, ovat melko turvallisia suorittaa asentamalla emergellä uusi versio ja asentamalla uudelleen vain libtool. Kuitenkin jotkin GCC-päivitykset särkevät binäärien yhteensopivuuden. Tälläisissä tapauksissa joudutaan asentamaan uudelleen kaikki liittyvät paketit (tai jopa koko työkaluohjelmisto ja järjestelmä).

Uuden version asentaminen ei tee muutosta järjestelmään automaattisesti, paitsi kun kyseessä on bugikorjauspäivitys, jollei käytössä ole multislot-ominaisuus, joka aiheuttaa myös näiden versioiden yhteisasennuksen samaan järjestelmään. Multislot on oletusarvoisesti pois päältä, sillä useimmat eivät tarvitse sitä.

Koodilistaus 2.1: GCC:n päivitys

# emerge -uav gcc

(Korvaa ”i686-pc-linux-gnu-4.1.1” päivityksen GCC-versiolla
ja käytössä olevalla CHOSTilla:)
# gcc-config i686-pc-linux-gnu-4.1.1
# env-update && source /etc/profile

Jos päivitys on versiosta 3 versioon 4, pitää fix_libtool_files.sh
ajaa käsin
(Korvaa $CHOST /etc/make.confin CHOST-asetuksella)
(Korvaa <gcc-version> uuden GCC:n versiolla)
# /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.4.6

(libtoolin päivitys)
# emerge --oneshot -av libtool

Päivityksen toimivuuden tarkistamiseksi täytyy kääntää työkaluohjelmisto ja world uudella kääntäjällä.

Koodilistaus 2.2: Järjestelmän päivitys

# emerge -eav system
# emerge -eav world

Vanhan GCC-version poisto tässä vaiheessa on jo turvallista. Jos se on tarpeen, sen voi tehdä komennolla (korvaa versionumero haluamallasi):

Koodilistaus 2.3: Vanhan GCC:n poisto

# emerge -aC =sys-devel/gcc-3.4*

Tärkeää: GCC 4.1 ei toimi versiota 2.4.34 pienempien Linuxien kääntämiseen. Jos käytät vanhaa ydintä, älä poista vanhaa GCC:tä.

Tärkeää: Jos päivitys on versiosta 3.3, pitää suorittaa emerge --oneshot sys-libs/libstdc++-v3, että vanhat binäärit toimivat.

3.  Päivitys GCC 3.3:sta 3.4:ään

Johdanto

Päivitys 3.3:sta 3.4:ään ei ole helppo, koska C++ ABI on muuttunut versioiden välillä. Myös libstc++-kirjastossa on ongelmia.

Vaihtoehdot

Tärkeää: Jos päivitys on 3.4:stä 4.1:een, seuraa yleisiä päivitysohjeita.

Tärkeää: Jos käytössä on SPARC, pitää koko järjestelmä kääntää uudestaan ABI-muutosten takia.

Päivitys 3.3:sta 3.4:ään on mahdollista suorittaa kahdella tavalla: ensimmäinen tapa on nopeampi, ja käyttää revdep-rebuild-työkalua gentoolkitistä, kun taas toinen tapa vaatii koko järjestelmän uudelleenasennuksen, niin että se käyttää uuden GCC:n ominaisuuksia. Kumpikin tapa on yhtä toimiva, mutta yleensä ensimmäinen riittää.

Päivitettäessä 3.3:sta 4.1:een ei voi käyttää revdep-rebuildia, vaan pitää kääntää koko järjestelmä uudelleen.

Revdep-rebuildin käyttö

Ensin pitää asentaa gentoolkit, jos sitä ei vielä ole. Sitten voi päivittä GCC:n ja vaihtaa uuteen kääntäjään. Myös libtool käännetään uusiksi, että varmistutaan järjestelmän yhtenäisyydestä.

Koodilistaus 3.1: Gentoolkitin asennus ja GCC:n kääntö

# emerge -an gentoolkit
# emerge -uav gcc
(Korvaa ”i686-pc-linux-gnu-3.4.5” GCC:n versiolla ja järjestelmän
CHOSTilla:)
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile

(libtoolin uudelleenasennus)
# emerge --oneshot -av libtool

Seuraavaksi katsotaan mitkä paketit revdep-rebuild haluaa asentaa uudelleen ja käännetään ne. Tässä vaiheessa saattaa vierähtää tovi.

Koodilistaus 3.2: Revdep-rebuildin käyttö

# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5

Huomaa: Joskus saattaa tulla ongelmia puuttuvien versioiden kanssa, jos ne ovat vanhentuneet tai peitetty. Tässä tapauksessa pitää käyttää valitsinta --package-names. Tällöin paketit päivitetään vain nimen perusteella, eikä tarkan versioinnin.

Yhteensopivuus vanhojen C++-sovellusten ja muiden revdep-rebuildin missaamien pakettien kanssa saadaan toimimaan asentamalla sys-libs/libstdc++-v3 ennen GCC 3.3:n poistoa.

Koodilistaus 3.3: Libstdc++-v3:n korjailu

# emerge --oneshot sys-libs/libstdc++-v3
# emerge -aC =sys-devel/gcc-3.3*

Täysi uudelleenasennus emerge -e:llä

Tässä päivitystavassa koko järjestelmä asennetaan uusiksi uudella kääntäjällä. Tämä on turvallisempaa, koska järjestelmä on sen jälkeen varmasti yhtenäinen. Ensiksi pitää päivittää GCC ja libtool, ja sitten siirtyä uuteen kääntäjään.

Koodilistaus 3.4: GCC:n päivitys

# emerge -uav gcc
Korvaa ”i686-pc-linux-gnu-3.4.5” GCC:n versiolla ja käytetyn
järjestelmän CHOSTilla:)
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile

Jos päivitys on versiosta 3 versioon 4, pitää fix_libtool_files.sh
ajaa käsin
(Korvaa $CHOST /etc/make.confin CHOST-asetuksella)
(Korvaa <gcc-version> uuden GCC:n versiolla)
# /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.3.6

(libtoolin uudelleenasennus)
# emerge --oneshot -av libtool

Yhteensopivuus vanhempien C++-sovellusten kanssa saadaan asentamalla järjestelmään sys-libs/libstdc++-v3.

Koodilistaus 3.5: Libcstc++-v3:n asennus

# emerge --oneshot sys-libs/libstdc++-v3

Seuraavaksi asennetaan system ja sitten world. Tässä voi kestää hyvinkin pitkään, riippuen järjestelmän paketin määrästä, sillä kaikki pitää kääntää uudelleen työkaluohjelmisto mukaan lukien. Tämä on tarpeellista, jotta varmistutaan järjestelmän kaikkien pakettien olevan samalla kääntäjällä tehdyt.

Koodilistaus 3.6: Järjestelmän uudelleenkääntäminen

# emerge -e system
# emerge -e world

Myös vanhat GCC:t voi nyt poistaa:

Koodilistaus 3.7: Siivoaminen

# emerge -aC =sys-devel/gcc-3.3*

4.  GCC:n päivitys ensiasennuksessa

Johdanto

GCC:n päivitys uuden asennuksen yhteydessä stage3:sta on helppoa. Uudessa järjestelmässä ei esimerkiksi ole suurta määrää uudelleenasennettavia vanhaan GCC:n versioon linkitettynä. Seuraava esimerkki on 3.3:n päivityksestä 3.4:ään. Siinä on joitain eroavaisuuksia yleisiin päivityksiin, esimerkiksi kirjastonimet revdep-rebuildissa ovat GCC 3.3 -kohtaisia, kuten koko libstdc++-v3.

Jos järjestelmää ei ole mukautettu vielä, päivitys on hyvin nopea. Kuten 3.3:n yleisessä päivityksessä 3.4:ään, tässäkin on kaksi tapaa. Kuitenkin toisin kuin yleisessä päivityksessä, erot ovat pienempiä ensimmäinen tapa on nopeampi ja käyttää revdep-rebuildia gentoolkit-paketista. Revdep-rebuild kääntää vanhan GCC:n kirjastoihin linkitetyt paketit uudelleen, kun taas toisessa tavassa koko järjestelmä käännetään uusiksi. Tämä toinen tapa ei uudessa asennuksessa ole tarpeen, ja on kerrottu täällä vain symmetrian vuoksi.

Seuraavat askelet ovat päivitystavoille yhteiset:

Koodilistaus 4.1: GCC:n päivitykset

# emerge -uav gcc
(Korvaa kohdan ”i686-pc-linux-gnu-3.4.5” GCC-versio ja CHOST
päivitetyn järjestelmän arvoilla)
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile

(libtoolin uudelleenasennus)
# emerge --oneshot -av libtool

Yhteensopivuus vanhojen C++-sovellusten kanssa saavutetaan asentamalla järjestelmään sys-libs/libstdc++-v3.

Koodilistaus 4.2: Libstdc++-v3:n asennus

# emerge --oneshot sys-libs/libstdc++-v3

Revdep-rebuildin käyttö

Ensin pitää asentaa gentoolkit, jos sitä ei vielä ole. Sitten katsotaan mitkä paketit revdep-rebuild haluaa asentaa uudelleen ja käännetään ne. Tässä vaiheessa saattaa vierähtää tovi.

Koodilistaus 4.3: Revdep-rebuildin käyttö

# emerge -an gentoolkit
# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5

Huomaa: Joskus saattaa tulla ongelmia puuttuvien versioiden kanssa, jos ne ovat vanhentuneet tai peitetty. Tässä tapauksessa pitää käyttää valitsinta --package-names. Tällöin paketit päivitetään vain nimen perusteella, eikä tarkan versioinnin.

Koko järjestelmän uudelleenasennus emerge -e:llä

Tässä asennustavassa käännetään koko järjestelmä, jotta varmistutaan uuden järjestelmän yhtenäisyydestä kääntäjän kanssa. Tämä ei ole tarpeellista, mutta voi olla hyödyllistä jos tehdään myös suuria muutoksia CFLAGSeihin tai muihin make.confin muuttujiin, jotka vaikuttavat järjestelmän käännökseen.

Koska tämä tehdään uudelle asennukselle. ei worldia tarvitse kääntää uudestaan kuten vanhassa järjestelmässä. Systemin sijaan voi tosin käyttää worldia.

Koodilistaus 4.4: Järjestelmän uudelleenkääntö

# emerge -e system

Lopettelu

Tässä vaiheessa on turvallista poistaa vanhat GCC:t. Korvaa UUSI-GCC päivitetyllä versioluvulla:

Koodilistaus 4.5: Lopettelu

# emerge -aC "<sys-devel/gcc-UUSI-GCC"

5.  Yleiset ongelmat

Distcc pitää poistaa käytöstä päivityksen ajaksi. Kääntäjien versioiden sekottaminen tuottaa sille ongelmia. Ccachea ei ole tarpeen poistaa, sillä välimuisti poistetaan käytöstä joka tapauksessa.

Ytimen ja sen moduulien pitää aina olla samalla GCC:llä käännettyjä. Kun world on päivitetty GCC:llä, ulkoiset moduulit, kuten app-emulation/qemu-softmmu eivät toimi. Tämä korjaantyy kääntämällä ydin uudella GCC:llä.

Jos päivitetään SPARCia, pitää ajaa silo -f worldin asennuksen jälkeen.

Yleiset virheviestit

Ongelma tyyppiä libtool: link: `/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/libstdc++.la' is not a valid libtool archive, korjaantuu komennolla usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.3.6 (jossa 3.3.6 korvataan virheviestin numeroilla).

Virhe error: /usr/bin/gcc-config: line 632: /etc/env.d/gcc/i686-pc-linux-gnu-3.3.5: No such file or directory, korjaantuu poistamalla /etc/env.d/gcc/config-i686-pc-linux-gnu ja komennolla gcc-config sekä source /etc/profile. Tämä toimii vain jos ei ole asennetuna ristiinkäännösjärjestelmiä.

Jos jokin käännöksistä emerge -e systemissä emerge -e worldissä, hajoaa, voi sitä koettaa uudellen komennolla emerge --resume. Jos tämäkään ei tepsi, voi ongelmallista pakettia yrittää ohittaa komennolla emerge --resume --skipfirst. Tämä toimii vain jos välissä ei ole ajettu emergeä kertaakaan, sillä silloin jatkamistiedot tuhotaan.

Jos virheviesti on spec failure: unrecognized spec option, voi kokeilla vaihtaa takaisin oletuskääntäjään, nollata muuttuja GCC_SPECS ja päivittää uudestaan:

Koodilistaus 5.1: Määritelmien nollaus

# gcc-config 1
# source /etc/profile
# unset GCC_SPECS
# emerge -uav gcc


Tulostettava muoto

Tämä sivu on viimeksi päivitetty 19. heinäkuuta 2008

Tämän tekstin alkukielistä versiota ei enää ylläpidetä

Tiivistelmä: Tässä ohjeessa kerrotaan miten GCC päivitetään Gentoossa.

Wernfried Haas
Tekijä

Jan Kundrát
Tekijä

Mark Loeser
Toimittaja

Joshua Saddler
Toimittaja

Flammie Pirinen
Vastuullinen kääntäjä

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.