Skip to content

Instantly share code, notes, and snippets.

@marioroy
Last active April 7, 2024 18:16
Show Gist options
  • Save marioroy/6d4c055d970bdff0492db75f76dae842 to your computer and use it in GitHub Desktop.
Save marioroy/6d4c055d970bdff0492db75f76dae842 to your computer and use it in GitHub Desktop.
Notes for GCC 12.x installation on Fedora 38
#################################################################
# Install minimum dependencies.
#################################################################
# On "Fedora"-based systems, install minimum dependencies.
# sudo dnf install binutils libgcc glibc-devel libstdc++ patchelf wget
# On "Clear Linux" 40690+, install minimum dependencies.
# sudo swupd bundle-add c-basic patchelf wget
# Fetch gcc-12 packages from Debian:
# http://ftp.de.debian.org/debian/pool/main/
# I do not plan on keeping the package list up to date. Therefore,
# validate the package versions and update your copy accordingly.
# Last checked on April 7, 2024.
mkdir -p ~/Downloads/gcc-12
cd ~/Downloads/gcc-12
url="http://ftp.de.debian.org/debian/pool/main"
wget "${url}/i/isl/libisl23_0.26-3+b2_amd64.deb"
wget "${url}/g/gcc-12/cpp-12_12.3.0-17_amd64.deb"
wget "${url}/g/gcc-12/g++-12_12.3.0-17_amd64.deb"
wget "${url}/g/gcc-12/gcc-12_12.3.0-17_amd64.deb"
wget "${url}/g/gcc-12/gcc-12-base_12.3.0-17_amd64.deb"
wget "${url}/g/gcc-12/gfortran-12_12.3.0-17_amd64.deb"
wget "${url}/g/gcc-12/libasan8_12.2.0-14_amd64.deb"
wget "${url}/g/gcc-12/libatomic1_12.2.0-14_amd64.deb"
wget "${url}/g/gcc-12/libcc1-0_12.2.0-14_amd64.deb"
wget "${url}/g/gcc-12/libgcc-12-dev_12.3.0-17_amd64.deb"
wget "${url}/g/gcc-12/libgcc-s1_12.2.0-14_amd64.deb"
wget "${url}/g/gcc-12/libgomp1_12.2.0-14_amd64.deb"
wget "${url}/g/gcc-12/libitm1_12.2.0-14_amd64.deb"
wget "${url}/g/gcc-12/liblsan0_12.2.0-14_amd64.deb"
wget "${url}/g/gcc-12/libobjc-12-dev_12.3.0-17_amd64.deb"
wget "${url}/g/gcc-12/libobjc4_12.2.0-14_amd64.deb"
wget "${url}/g/gcc-12/libquadmath0_12.2.0-14_amd64.deb"
wget "${url}/g/gcc-12/libstdc++-12-dev_12.3.0-17_amd64.deb"
wget "${url}/g/gcc-12/libtsan2_12.2.0-14_amd64.deb"
wget "${url}/g/gcc-12/libubsan1_12.2.0-14_amd64.deb"
#################################################################
# Extract package files and installation.
#################################################################
for p in $(ls *.deb); do
echo "extracting $p"
ar x "$p"
tar xpf data.tar.xz
rm -f control.tar.xz data.tar.xz debian-binary
done
# Copy lib/x86_64-linux-gnu to usr/lib/.
# Create symbolic links to system gcc-devel files.
cp -a ./lib/x86_64-linux-gnu ./usr/lib/.
ln -sf /usr/lib64/libstdc++.so.6 ./usr/lib/gcc/x86_64-linux-gnu/12/libstdc++.so
for n in crt1 crti crtn gcrt1 grcrt1 Mcrt1 rcrt1 Scrt1; do
ln -sf /usr/lib64/${n}.o ./usr/lib/x86_64-linux-gnu/
done
# Set RPATH default to /opt/gcc-12/lib/x86_64-linux-gnu
(
cd ./usr/bin
for p in $(file * | grep "ELF 64-bit" | cut -f1 -d:); do
patchelf --force-rpath --set-rpath /opt/gcc-12/lib/x86_64-linux-gnu ${p}
done
)
(
cd ./usr/lib/gcc/x86_64-linux-gnu
for p in $(find . \( -name cc1 -o -name cc1plus -o -name collect2 \)); do
patchelf --force-rpath --set-rpath /opt/gcc-12/lib/x86_64-linux-gnu ${p}
done
for p in $(find . \( -name f951 -o -name lto1 -o -name lto-wrapper \)); do
patchelf --force-rpath --set-rpath /opt/gcc-12/lib/x86_64-linux-gnu ${p}
done
for p in $(find . \( -name g++-mapper-server \)); do
patchelf --force-rpath --set-rpath /opt/gcc-12/lib/x86_64-linux-gnu ${p}
done
)
# Create symbolic links for gcc, g++, and gfortran.
(
cd ./usr/bin
ln -sf cpp-12 cpp
ln -sf g++-12 g++
ln -sf gcc-12 gcc
ln -sf gcc-ar-12 gcc-ar
ln -sf gcc-nm-12 gcc-nm
ln -sf gcc-ranlib-12 gcc-ranlib
ln -sf gcov-12 gcov
ln -sf gcov-dump-12 gcov-dump
ln -sf gcov-tool-12 gcov-tool
ln -sf gfortran-12 gfortran
ln -sf lto-dump-12 lto-dump
)
# Move ./usr/{ bin, include, lib, libexec, share } to /opt/gcc-12/.
sudo rm -fr /opt/gcc-12
sudo mkdir -p /opt/gcc-12
sudo mv ./usr/* /opt/gcc-12/
# Cleanup.
rm -fr ./lib ./usr
#################################################################
# Running.
#################################################################
# /opt/gcc-12/bin/gcc --version
# /opt/gcc-12/bin/g++ --version
# Or, if you prefer without the full path.
export PATH=/opt/gcc-12/bin:$PATH
gcc --version
g++ --version
@manueldeprada
Copy link

Very useful. There are new urls though:
wget ${url}/i/isl/libisl23_0.26-3_amd64.deb
wget ${url}/g/gcc-12/cpp-12_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/g++-12_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/gcc-12_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/gcc-12-base_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/libasan8_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/libatomic1_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/libcc1-0_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/libgcc-12-dev_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/libgcc-s1_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/libgomp1_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/libitm1_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/liblsan0_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/libquadmath0_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/libstdc++-12-dev_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/libstdc++6_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/libtsan2_12.2.0-14_amd64.deb
wget ${url}/g/gcc-12/libubsan1_12.2.0-14_amd64.deb

@marioroy
Copy link
Author

Thank you, @manueldeprada. The how-to was something I tried with success some time ago. I updated your list to fetch gcc/g++ 12.3 (edits applied to the top post).

wget ${url}/g/gcc-12/cpp-12_12.3.0-11_amd64.deb
wget ${url}/g/gcc-12/g++-12_12.3.0-11_amd64.deb
wget ${url}/g/gcc-12/gcc-12_12.3.0-11_amd64.deb
wget ${url}/g/gcc-12/gcc-12-base_12.3.0-11_amd64.deb
wget ${url}/g/gcc-12/libgcc-12-dev_12.3.0-11_amd64.deb
wget ${url}/g/gcc-12/libstdc++-12-dev_12.3.0-11_amd64.deb

@marioroy
Copy link
Author

If gcc-12 is not in your PATH, an extra step for NVIDIA CUDA is defaulting to gcc-12 via a symbolic link in the same folder where nvcc resides.

sudo ln -s /opt/gcc-12/bin/gcc /opt/cuda/bin/gcc

@aashahin
Copy link

Thanks!

@aashahin
Copy link

This gist resolve big problem for me in nvcc with cuda

@marioroy
Copy link
Author

Your welcome, @aashahin. I updated the list to fetch cpp, g++, gcc, gcc-12-base, libgcc-12-dev, and libstdc++-12-dev version 12_12.3.0-13. The prior version 12_12.3.0-11 no longer exists.

@aashahin
Copy link

I followed the mirror and changed the version numbers that didn't work, again thank you

@ulatekh
Copy link

ulatekh commented Apr 7, 2024

I modified the gcc 12.3 spec file (from FC37) to build packages that can install alongside the system gcc installation. Find my instructions here.

@marioroy
Copy link
Author

marioroy commented Apr 7, 2024

++ @ulatekh Very cool.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment