Gentoon GCC:n päivitysohje
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
# gcc-config i686-pc-linux-gnu-4.1.1
# env-update && source /etc/profile
# /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.4.6
# 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.
|
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
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# 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
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.3.6
# 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
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# 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
|
Tämän sivun sisältö ja suomennos kuuluvat
Creative Commons - Nimi mainittava-Sama lisenssi 2.5 -lisenssin alle.
Sivun sisältöä koskee myös
Gentoo Name and
Logo Usage Guidelines.
|