Ciao Shako, benvenuto su FOL e in un bellissimo “dependency hell”
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?