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
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 (Si ponga attenzione a sostituire "i686-pc-linux-gnu-4.1.1" con la versione del GCC a cui si è aggiornato e l'impostazione per CHOST del proprio sistema) # gcc-config i686-pc-linux-gnu-4.1.1 # env-update && source /etc/profile Se è stato effettuato l'upgrade dal gcc 3 al 4 (dal 3.4.6 al 4.1.1 in questo esempio) bisogna eseguire manualmente fix_libtool_files.sh Sostituire $CHOST con il proprio CHOST, come si trova in /etc/make.conf (Sostituire a <gcc-versione> con la nuova versione di GCC a cui si è aggiornato) # /usr/share/gcc-data/$CHOST/<gcc-versione>/fix_libtool_files.sh 3.4.6 (Ricompilazione di libtool) # 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
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++.
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.
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 (Si ponga attenzione a sostituire "i686-pc-linux-gnu-3.4.5" con la versione del GCC a cui si è aggiornato e l'impostazione per CHOST del proprio sistema) # gcc-config i686-pc-linux-gnu-3.4.5 # source /etc/profile (Ricompilazione di libtool) # 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* |
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 (Si ponga attenzione a sostituire "i686-pc-linux-gnu-3.4.5" con la versione del GCC a cui si è aggiornato e l'impostazione per CHOST del proprio sistema) # gcc-config i686-pc-linux-gnu-3.4.5 # source /etc/profile Se si sta aggiornando dalla versione 3 alla 4 di gcc (dal 3.3.6 al 4.1.1 in questo esempio) bisogna eseguire manualmente fix_libtool_files.sh Sostituire $CHOST con il proprio CHOST, come si trova in /etc/make.conf (Sostituire a <gcc-versione> con la nuova versione di GCC a cui si è aggiornato) # /usr/share/gcc-data/$CHOST/<gcc-versione>/fix_libtool_files.sh 3.3.6 (Ricompilazione di libtool) # 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
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 (Si ponga attenzione a sostituire "i686-pc-linux-gnu-3.4.5" con la versione del GCC a cui si è aggiornato e l'impostazione per CHOST del proprio sistema) # gcc-config i686-pc-linux-gnu-3.4.5 # source /etc/profile (Ricompilare libtool) # 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
|
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. |
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
|
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"
|
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.
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.