Guida all'aggiornamento di GCC per Gentoo
1.
Introduzione
Aggiornamento di GCC
Benché il suo corretto funzionamento sia critico per il sistema, il
compilatore GCC è un pacchetto come tutti gli altri, e necessita di essere
aggiornato. Fra i motivi che possono richiedere l'aggiornamento di GCC vi
sono: la correzione di bachi che possono interferire con il sistema,
l'aggiunta di nuove funzionalità o semplicemente il desiderio di mantenere
aggiornato il proprio sistema. Se nessuna di queste motivazioni si applica al
proprio caso, si può rimandare tranquillamente l'aggiornamento finché la
propria versione di GCC gode del supporto degli sviluppatori Gentoo.
Se si effettua un aggiornamento significativo di GCC (come il passaggio da
3.3.6 a 3.4.5), il sistema non userà automaticamente la nuova versione.
Poiché potrebbero essere richiesti passaggi aggiuntivi, bisogna effettuare il
passaggio esplicitamente. Se si decide di non passare alla nuova versione,
Portage userà la vecchia finché non si cambia idea, o il vecchio compilatore
non viene rimosso dal sistema. In caso di aggiornamenti di manutenzione (come
per esempio da 3.4.5 a 3.4.6) viene utilizzata automaticamente la nuova
versione.
Questa guida spiega i passi necessari per effettuare un aggiornamento sicuro
del compilatore di un sistema Gentoo. Una sezione specifica è dedicata
all'aggiornamento dal GCC-3.3 alla
versione 3.4 e alle problematiche coinvolgenti libstdc++.
Un'altra sezione è dedicata agli utenti di
una nuova installazione di Gentoo utilizzando un pacchetto dello stage
3 dopo che è stata rilasciata una nuova versione del GCC.
Avvertenza:
Va notato che nell'aggiornare dal GCC-3.4 (o 3.3) al GCC-4.1 o successivo
bisogna seguire le istruzioni per un
aggiornamento generale, in quanto GCC-3.4 e GCC-4.1 hanno interfacce
binarie (ABI) leggermente differenti.
|
2.
Istruzioni per un aggiornamento generale
Introduzione
Importante:
Se si cercano istruzioni specifiche per l'aggiornamento dal GCC-3.3 al
GCC-3.4, si consulti la sezione
apposita.
|
Importante:
Se si cercano istruzioni specifiche per l'aggiornamento del GCC per nuove
installazioni, sezione apposita.
|
In generale, gli aggiornamenti di manutenzione (che eliminano bachi
della precedente versione), come quello dalla versione 3.3.5 alla versione
3.3.6 dovrebbero poter essere fatti in tutta tranquillità, basta installare
la nuova versione, impostare il sistema in modo che la utilizzi e ricompilare
l'unico altro pacchetto coinvolto, libtool. A volte, gli aggiornamenti
di GCC spezzano la compatibilità a livello di codice binario, in tali casi la
ricompilazione dei pacchetti coinvolti (o addirittura della toolchain
[insieme dei programmi necessari per la compilazione dei pacchetti, NdT] o di
tutti i pacchetti di base [il system NdT]) potrebbe rendersi
necessaria.
La norma per cui il nuovo compilatore non viene utilizzato automaticamente ha
una importante eccezione negli aggiornamenti di manutenzione, come quello fra
le versioni 3.3.5 e 3.3.6, a meno di non utilizzare la feature
"multislot", che permette di farli coesistere nello stesso sistema. Questa
feature è normalmente disabilitata, in quanto la maggior parte degli
utenti non ne trarrebbe beneficio.
Codice 2.1: Aggiornamento di GCC |
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-4.1.1
# env-update && source /etc/profile
# /usr/share/gcc-data/$CHOST/<gcc-versione>/fix_libtool_files.sh 3.4.6
# emerge --oneshot -av libtool
|
Per essere certi che il sistema sia in uno stato coerente, bisogna
ricompilare il sistema di base e i pacchetti appartenenti al profilo world
per utilizzare il nuovo compilatore.
Codice 2.2: Ricompilazione del sistema |
# emerge -eav system
# emerge -eav world
|
Ora è possibile rimuovere le vecchie versioni di GCC. Se lo si ritenesse
opportuno, si esegua il comando seguente (sostituendo ovviamente a
=sys-devel/gcc-3.4* la versione che si vuole rimuovere):
Codice 2.3: Rimozione delle vecchie versioni di GCC |
# emerge -aC =sys-devel/gcc-3.4*
|
Importante:
Si ponga attenzione al fatto che GCC 4.1 e successivi sono in grado di compilare
solo i kernel successivi al 2.4.34. Non rimuovere le vecchie versioni di GCC se
si pensa di usare un kernel più datato.
|
Importante:
Nel caso si stia aggiornando dal GCC-3.3, è consigliabile eseguire
emerge --oneshot sys-libs/libstdc++-v3 per ottenere la compatibilità
con vecchie applicazioni C++ binarie.
|
3.
Aggiornamento da GCC-3.3 a 3.4
Introduzione
L'aggiornamento dal GCC-3.3 al 3.4 presenta delle problematiche particolari,
in quanto l'ABI C++ è cambiata fra queste versioni. Inoltre bisogna porre
particolare attenzione ai possibili problemi dati dalla libreria
libstdc++.
Modalità dell'aggiornamento
Importante:
Se si sta aggiornando dal gcc 3.4 al 4.1, si seguano le istruzioni per un aggiornamento
generale.
|
Importante:
Se si sta effettuando l'aggiornamento su un sistema SPARC, bisogna ricompilare l'intero
sistema a causa di cambiamenti nell'ABI interna, ovvero il
modo in cui GCC passa i parametri al proprio interno. [Il link porta a una
pagina in inglese. NdT]
|
Se si aggiorna dal gcc 3.3 al 3.4, ci sono due metodi per effettuare
l'aggiornamento. Il primo metodo è più
veloce e implica l'uso del programma revdep-rebuild contenuto nel
pacchetto gentoolkit mentre il secondo ricompila l'intero
sistema da zero, sfruttando le nuove caratteristiche del GCC. Ogni utente può
decidere per l'uno o l'altro metodo. Nella maggior parte dei casi, il primo
metodo è sufficiente.
Se si aggiorna da gcc 3.3 al 4,1, non usare il metodo basato su
revdep-rebuild, ma si ricompili
l'intero sistema.
Utilizzo di revdep-rebuild
Questo metodo richiede l'installazione di gentoolkit se non già
presente nel sistema. Fatto ciò, si proceda all'aggiornamento del GCC e al
passaggio al nuovo compilatore. Si ricompili anche il pacchetto
libtool per assicurare la corretta funzionalità del sistema di
compilazione.
Codice 3.1: Installazione di gentoolkit e aggiornamento del GCC |
# emerge -an gentoolkit
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# emerge --oneshot -av libtool
|
A questo punto si generi la lista dei pacchetti che revdep-rebuild prevede di
ricompilare. Poi si usi revdep-rebuild per ricompilarli. Si presti attenzione
al fatto che questa fase può richiedere diverso tempo.
Codice 3.2: Utilizzo di revdep-rebuild |
# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5
|
Nota:
E' possibile che si verifichino dei problemi con delle versioni non esistenti
di pacchetti, perché obsolete o mascherate. In questo caso si può usare
revdep-rebuild con l'opzione --package-names, per far sì che i
pacchetti siano ricompilati sulla base solo del nome del pacchetto, piuttosto
che sulla combinazione esatta del nome del pacchetto e sua versione.
|
Per ottenere la compatibilità con vecchie applicazioni C++ binarie ed
eventuali pacchetti che potrebbero non essere stati aggiornati da
revdep-rebuild, bisogna installare sys-libs/libstdc++-v3 prima di
rimuovere GCC 3.3 dal sistema.
Codice 3.3: Installazione di libstdc++-v3 e rimozione di GCC 3.3 |
# emerge --oneshot sys-libs/libstdc++-v3
# emerge -aC =sys-devel/gcc-3.3*
|
Utilizzo di emerge -e
Questo metodo, benché molto più lento, effettua la ricompilazione dell'intero
sistema, per essere sicuri che tutti i pacchetti siano ricompilati con il
nuovo compilatore, ed è perciò più sicuro. Per prima cosa, si aggiornino GCC
e libtool e si effettui il passaggio al nuovo compilatore.
Codice 3.4: Aggiornamento di GCC |
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# /usr/share/gcc-data/$CHOST/<gcc-versione>/fix_libtool_files.sh 3.3.6
# emerge --oneshot -av libtool
|
Per ottenere la compatibilità con vecchie applicazioni C++ binarie, bisogna
installare sys-libs/libstdc++-v3.
Codice 3.5: Installazione di libstdc++-v3 |
# emerge --oneshot sys-libs/libstdc++-v3
|
Ora si proceda a ricompilare per primo l'insieme di pacchetti (profilo) system,
poi il profilo world. Questa fase richiede molto tempo, a seconda del numero di
pacchetti installati, in quanto ricompila il sistema di base (toolchain) e poi
tutti i pacchetti installati (compresa la toolchain). Questo è necessario per
assicurarsi che tutti i pacchetti siano stati compilati la nuova toolchain,
compresa la toolchain stessa.
Codice 3.6: Ricompilazione di system e world |
# emerge -e system
# emerge -e world
|
Si possono anche rimuovere in sicurezza le vecchie versioni del GCC:
Codice 3.7: Rimozione delle vecchie versioni del GCC |
# emerge -aC =sys-devel/gcc-3.3*
|
4.
Aggiornamento di GCC su una nuova installazione
Introduzione
L'aggiornamento del GCC su un sistema dopo l'installazione da un pacchetto dello
stage 3 è semplice. Un vantaggio degli utenti di nuove installazioni è che non
hanno un gran numero di pacchetti installati che utilizzano le librerie del
vecchio GCC. Il seguente esempio è per l'aggiornamento del GCC-3.3 al 3.4. Certi
particolari potrebbero differire se si effettua l'aggiornamento da altre
versioni di GCC. Per esempio i nomi per le librerie utilizzate per il comando
revdep-rebuild qui sotto sono specifiche per il GCC 3.3, così come la
necessità di installare libstdc++-v3.
Se non si sono effettuate personalizzazioni al sistema, ci sono pochi passi da
fare per aggiornare il GCC. Come con l'aggiornamento da GCC-3.3 a 3.4, ci sono
due opzioni. Comunque, diversamente dall'aggiornamento da GCC-3.3 al 3.4, ci
sono meno complicazioni e ci sono meno differenze fra i metodi. Il primo metodo è più rapido e utilizza
il comando revdep-rebuild del pacchetto gentoolkit, in modo simile
alla procedura già vista. Utilizzando revdep-rebuild si ricompilano solo i
pacchetti che davvero fanno uso delle librerie del GCC, mentre il secondo metodo ricompila l'intero
sistema con il nuovo GCC e richiede molto più tempo. Questo secondo metodo non è
mai richiesto ed è incluso solo per completezza.
Queste prime istruzioni sono comuni ai due metodi, e dovrebbero essere
seguite da tutti.
Codice 4.1: Aggiornamento di GCC |
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# emerge --oneshot -av libtool
|
Per ottenere la compatibilità con vecchie applicazioni C++ binarie, bisogna
installare sys-libs/libstdc++-v3.
Codice 4.2: Installazione di libstdc++-v3 |
# emerge --oneshot sys-libs/libstdc++-v3
|
Utilizzo di revdep-rebuild
Questo metodo richiede che si installi il pacchetto gentoolkit se non
lo si è già fatto. A questo punto si generi la lista dei pacchetti che
revdep-rebuild prevede di ricompilare. Poi si usi
revdep-rebuild per ricompilarli.
Codice 4.3: Installazione di gentoolkit e utilizzo di revdep-rebuild |
# emerge -an gentoolkit
# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5
|
Nota:
E' possibile che si verifichino dei problemi con delle versioni non esistenti
di pacchetti, perché obsolete o mascherate. In questo caso si può usare
revdep-rebuild con l'opzione --package-names, per far sì che i
pacchetti siano ricompilati sulla base solo del nome del pacchetto, piuttosto
che sulla combinazione esatta del nome del pacchetto e sua versione.
|
Utilizzo di emerge -e
Questo metodo, benché più lento, ricompila l'intero insieme di dei pacchetti
base (system) per assicurarsi che tutto sia ricompilato con il nuovo
compilatore. Questo non è necessario, ma è un buon metodo se contestualmente
si effettuano cambiamenti alle CFLAG o a altre variabili del file make.conf
che influenzino la compilazione del sistema.
Trattandosi di una nuova installazione, non è necessario ricompilare il
world come in un sistema già in uso. Comunque, è possibile aggiornare
world per maggiore completezza.
Codice 4.4: Ricompilazione di system |
# emerge -e system
|
Pulizia del sistema
Ora è possibile rimuovere le vecchie versioni di GCC. Si sostituisca a
VERSIONE-NUOVO-GCC la versione a cui si è aggiornato:
Codice 4.5: Pulizia del sistema |
# emerge -aC "<sys-devel/gcc-VERSIONE-NUOVO-GCC"
|
5.
Problemi comuni
Ci si assicuri di aver disabilitato distcc durante l'aggiornamento.
Mescolare sui vari nodi versioni differenti del compilatore causerà
problemi di ricompilazione. Non è necessario disabilitare ccache, in
quanto la cache dei file oggetto sarà comunque ignorata, perché non più
valida.
Si usi sempre la stessa versione di GCC per compilare il kernel e moduli
aggiuntivi del kernel. Una volta ricompilato il world con il nuovo GCC, i
moduli esterni (come ad esempio app-emulation/qemu-softmmu) non
potranno essere caricati. Ricompilare il kernel con il nuovo GCC risolve il
problema.
Se si sta effettuando l'aggiornamento di un sistema SPARC, rieseguire silo
-f dopo aver riemerso world per evitare problemi.
Messaggi di errore frequenti
Se si verifica l'errore: libtool: link:
`/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/libstdc++.la' is not a valid
libtool archive, si esegua il comando
/usr/share/gcc-data/$CHOST/<gcc-versione>/fix_libtool_files.sh 3.3.6
(sostituendo "3.3.6" con il numero di versione del messaggio di errore, e
$CHOST e <gcc-versione> con i valori del proprio sistema).
Se si verifica l'errore: error: /usr/bin/gcc-config: line 632:
/etc/env.d/gcc/i686-pc-linux-gnu-3.3.5: No such file or directory, si
provi a cancellare /etc/env.d/gcc/config-i686-pc-linux-gnu e si
riesegua gcc-config, seguito da source /etc/profile. E'
possibile farlo solo se non sono stati impostati dei compilatori per altri
sistemi (cross-compilers).
Se un pacchetto non si compila durante l'esecuzione del comando emerge -e
system o emerge -e world, si può riprendere l'operazione con
emerge --resume Se un pacchetto fallisce ripetutamente, si può passare
al successivo con emerge --resume --skipfirst. Non eseguire altre
instanze di emerge nel frattempo o si perderanno le informazioni necessarie
per poter riprendere la ricompilazione.
Se si verifica l'errore: spec failure: unrecognized spec option
durante l'aggiornamento del compilatore, si provi a ritornare al compilatore
predefinito, azzerare il valore della variabile GCC_SPECS e aggiornare
nuovamente il GCC:
Codice 5.1: Ripristino della configurazione predefinita |
# gcc-config 1
# source /etc/profile
# unset GCC_SPECS
# emerge -uav gcc
|
I contenuti di questo documento sono rilasciati sotto la licenza Creative
Commons - Attribution / Share Alike.
|