Installazione gcc 8.4

Buongiorno a tutti,
mi scuso in anticipo dovessi aver toppato sezione. Mi sono appena iscritto, sono entrato da poco nell’ambiente Linux per questioni scientifiche (ancora alle prime armi) e necessito di dover “sostituire” la versione di gcc (in particolare gfortran) correntemente installata sul mio pc (10.2) con la 8.4. Uso fedora 33. Ho fatto diversi tentativi su alcune virtual machine (per non rischiare di fare disastri coi pacchetti) ma si è sempre generato un loop infinito di dipendenze danneggiate o mancanti. Vorrei capire:
A) se quello che voglio fare è fattibile, o molto difficile perchè il pacchetto a cui fare il downgrade (gcc 8.4) è troppo vecchio
B) se c’è un modo per installare entrambe le versioni e poi “switchare” tra l’una e l’altra in modo da non “danneggiare” altri pacchetti che invece girano bene con la 10.2
C) se si, come farlo XD

Grazie in anticipo!

Scommetto che stai cercando di compilare un certo programma di analisi meteorologica e nella guida del sito ti viene detto che deve essere compilato usando quella versione specifica. Riguardo alle tue domande ecco le risposte:
A) Ritornare alla versione precedente di un pacchetto è possibile, bisogna dare il comando “sudo dnf downgrade <nome_del_pacchetto>”. La versione che vuoi utilizzare, la 8.4, non è più supportata da Fedora.
B) Non è possibile installare due versioni dello stesso pacchetto usando rpm o dnf.
C) Potresti però scaricarti i sorgenti del compilatore Gcc in quella versione, installarlo su una directory come /opt per la massima sicurezza, compilarlo e poi provare a compilare il tuo programma. Altra soluzione sarebbe compilare il programma che ti interessa usando il compilatore nella versione corrente, sperare che si ottenga un eseguibile funzionante se no correggere i problemi che ti vengono segnalati durante la compilazione. In tal caso un IDE come KDevelop o Qt Creator ti sarebbero utili.
Spero di esserti stato d’aiuto…

1 Mi Piace

Ciao Shako, benvenuto su FOL e in un bellissimo “dependency hell” :wink:

La soluzione forse piu’ pulita sarebbe usare un container, podman andrebbe benissimo, ma sarebbe una learning curve forse troppo ripida.
Altra alternativa meno dispendiosa di tempo sarebbe usare spack.io.

Ma per gcc 8 c’e’ una soluzione piu’ semplice forse, usando un repository presente su copr:
https://copr.fedorainfracloud.org/coprs/mkrupcale/gcc-8/

Purtroppo questo repo usa lo stesso nome per il pacchetto gcc, quindi effettivamente sara’ un downgrade, e significa che non potrai avere sia un gcc aggiornato che l’8 allo stesso tempo tramite pacchetti RPM. Per aggiungere il repo:

# dnf copr enable mkrupcale/gcc-8

Se vuoi ora puoi ispezionare con un dnf info che tipo di pacchetti avresti disponibili:

# dnf info gcc-gfortran --showduplicates

Dovresti vederne cinque versioni diverse, in particolare una coppia 10.3.x (x86_64 e i686) nei repo updates, una coppia 10.2.1 (x86_64 e i686) e una release 8.2.1 proveniente dal repo copr aggiunto sopra.
Il motivo delle due versioni 10.x.x e’ perche’ fedora viene rilasciata con un certo set di pacchetti nei repo base, e quei repo non vengono poi piu’ toccati; tutti gli aggiornamenti arrivano nei repo updates finche’ la versione di fedora e’ supportata.

Se ora procediamo ad installare specificamente la 8.2.1, dnf ci proporra’ di fare un downgrade effettivamente (i numeri del gcc installato qua sono piu’ alti perche’ sono su una fedora 34):

# dnf install gcc-gfortran-8.2.1
==================================================================================================
 Package           Arch   Version            Repository                                      Size
==================================================================================================
Installing:
 gcc-gfortran      x86_64 8.2.1-6.fc34       copr:copr.fedorainfracloud.org:mkrupcale:gcc-8  11 M
Installing dependencies:
 info              x86_64 6.7-10.fc34        fedora                                         227 k
 isl               x86_64 0.16.1-13.fc34     fedora                                         884 k
 libgcc            i686   11.0.1-0.3.fc34    fedora                                         107 k
 libquadmath-devel x86_64 8.2.1-6.fc34       copr:copr.fedorainfracloud.org:mkrupcale:gcc-8  44 k
Downgrading:
 cpp               x86_64 8.2.1-6.fc34       copr:copr.fedorainfracloud.org:mkrupcale:gcc-8 9.8 M
 gcc               x86_64 8.2.1-6.fc34       copr:copr.fedorainfracloud.org:mkrupcale:gcc-8  21 M
 gcc-gdb-plugin    x86_64 8.2.1-6.fc34       copr:copr.fedorainfracloud.org:mkrupcale:gcc-8 141 k
 libgfortran       x86_64 8.2.1-6.fc34       copr:copr.fedorainfracloud.org:mkrupcale:gcc-8 669 k
 libgomp           x86_64 8.2.1-6.fc34       copr:copr.fedorainfracloud.org:mkrupcale:gcc-8 212 k
 libquadmath       x86_64 8.2.1-6.fc34       copr:copr.fedorainfracloud.org:mkrupcale:gcc-8 193 k
==================================================================================================

E voilà:

$ gcc --version
gcc (GCC) 8.2.1 20181215 (Red Hat 8.2.1-6)

$ cat /tmp/asdf.c 
int main() { return 0;}

$ gcc /tmp/asdf.c && ./a.out && echo $?
0

Cosi’ dovresti essere operativo.

Dato pero’ che abbiamo installato pacchetti con lo stesso nome, ogni volta che darai un dnf update in futuro, dnf cerchera’ di rifilarti la nuova versione di gcc presente nei repo fedora. Per evitare questo puoi specificare a dnf di non aggiornare un certo pacchetto da linea di comando con

# dnf update --excludepkgs=gcc

vedrai nel riepilogo che dice

Skipping packages with conflicts:
(add '--best --allowerasing' to command line to force their upgrade):
 cpp                                   x86_64 11.1.1-1.fc34           updates                10 M
 libgfortran                           x86_64 11.1.1-1.fc34           updates               806 k
 libgomp                               x86_64 11.1.1-1.fc34           updates               276 k
 libquadmath                           x86_64 11.1.1-1.fc34           updates               207 k
Skipping packages with broken dependencies:
 gcc-gdb-plugin                        x86_64 11.0.1-0.3.fc34         fedora                135 k
 gcc-gdb-plugin                        x86_64 11.1.1-1.fc34           updates               140 k
 gcc-gfortran                          x86_64 11.0.1-0.3.fc34         fedora                 11 M
 gcc-gfortran                          x86_64 11.1.1-1.fc34           updates                11 M
 libquadmath-devel                     x86_64 11.0.1-0.3.fc34         fedora                 41 k
 libquadmath-devel                     x86_64 11.1.1-1.fc34           updates                45 k

perche’ alcuni altri pacchetti aggiornabili dipendono da gcc aggiornato, e bloccando gcc hai bloccato anche gli altri.
Puoi specificarli tutti ogni volta a mano con --excludepkgs=gcc,cpp,gcc-gfortran,libgfortran,libgomp,libquadmath,libquadmath-devel,gcc-gdb-plugin per evitare di vedere quel riepilogo mezzo rotto, oppure ti direi di modificare (da root) il file /etc/dnf/dnf.conf aggiungendo questa riga in fondo dopo skip_if_unavailable=True:

excludepkgs=gcc,cpp,gcc-gfortran,libgfortran,libgomp,libquadmath,libquadmath-devel,gcc-gdb-plugin

E dnf ignorera’ quei pacchetti nei prossimi aggiornamenti.


Se invece vuoi vedere altri modi per risolvere, ti posso spiegare come usare spack, e’ abbastanza semplice ed e’ una rivoluzione per questo tipo di problemi.
Meglio ancora sarebbero dei container indipendenti, con dentro software gia’ compilati, che diventerebbero “facilmente” portabili anche su altri sistemi e cluster di calcolo senza dover ricompilare ogni volta tutto da zero e perdere ore… ma questo e’ un mondo a parte.

Perche’ cosa succede se un domani hai bisogno di un software che si compila solo con gcc 4.8 e in una notte di luna piena? :wink:

1 Mi Piace