Gentoo. Компиляция системы clang
Переход на Clang для компиляции системы.
Содержание
1 Общая информация
- Обязательно должен быть запасной вариант с GCC.
- На данный момент система не сможет скомпилировать все, что использует Clang.
2 Установка
- Установите
llvm-libunwind
:emerge --deselect libunwind FEATURES="-protect-owned" emerge -vO llvm-libunwind
- Установите Clang:
emerge sys-devel/clang-runtime sys-devel/clang sys-libs/compiler-rt sys-libs/compiler-rt-sanitizers sys-devel/lld-toolchain-symlinks sys-devel/lld
- Установите библиотеку для C++:
emerge sys-libs/libcxxabi sys-libs/libcxx
- Вместо
lld
можно использовать линкерmold
:emerge mold
3 Обновление системы
- Перекомпилим пакеты с библиотекой
libunwind
:revdep-rebuild --library libunwind -- --keep-going
- Удалите библиотеку
libunwind
:emerge -cv libunwind
- Необходимо перекомпилить программы, слинкованные со стандартной библиотекой
libstdc++
. - Проверьте, какие программы надо перекомпилить:
revdep-rebuild --library libstdc++ -p
- Перекомпилим эти пакеты:
revdep-rebuild --library libstdc++ -- --keep-going
4 Конфигурация
4.1 Основная системная конфигурация
- Файл
/etc/portage/make.conf
:# this sources the PORTDIR_OVERLAY variable defined by layman. however, the variable expanded by layman was empty # source /var/db/repos/gentoo/local/layman/make.conf ## This is added to make options by linux-mod.eclass BUILD_FIXES="LLVM=1 LLVM_IAS=1" CFLAGS="${CFLAGS} -flto=thin" #CFLAGS="${CFLAGS} -mllvm -extra-vectorizer-passes -mllvm -enable-cond-stores-vec -mllvm -slp-vectorize-hor-store -mllvm -enable-loopinterchange -mllvm -enable-loop-distribute -mllvm -enable-unroll-and-jam -mllvm -enable-loop-flatten -mllvm -interleave-small-loop-scalar-reduction -mllvm -unroll-runtime-multi-exit -mllvm -aggressive-ext-opt -fno-math-errno -fno-trapping-math -falign-functions=32 -funroll-loops -fno-semantic-interposition -fcf-protection=none -mharden-sls=none -fomit-frame-pointer -mprefer-vector-width=256 -flto" CXXFLAGS="${CFLAGS} ${CXXFLAGS}" CC="clang" CPP="clang-cpp" # necessary for xorg-server and possibly other packages CXX="clang++" AR="llvm-ar" NM="llvm-nm" RANLIB="llvm-ranlib" # No need to set this, clang-common can handle this based on chosen USE flags #LDFLAGS="${LDFLAGS} -fuse-ld=lld" #LDFLAGS="${LDFLAGS} -Wl,-O2 -Wl,--as-needed -Wl,--undefined-version" #LDFLAGS="${LDFLAGS} -rtlib=compiler-rt -unwindlib=libunwind" #LDFLAGS="${LDFLAGS} -fuse-ld=mold" LDFLAGS="${LDFLAGS} -flto"
4.2 Конфигурация для каждого пакета
- Можно задать компилятор для каждого пакета в отдельности в файле
/etc/portage/package.env
:sys-devel/gcc compiler-gcc # gcc itself sys-devel/binutils compiler-gcc # gcc itself # configure: error: AR sys-libs/binutils-libs compiler-gcc # gcc itself dev-util/mingw64-toolchain compiler-gcc # gcc itself dev-debug/gdb compiler-gcc # gcc itself =dev-util/gengetopt-2.23* compiler-gcc # sys-devel/bin86 compiler-gcc # error: ISO C99 #media-video/obs-studio compiler-gcc # cef plugin #media-video/obs-studio compiler-clang-no-lto app-emulation/virtualbox compiler-gcc # ld.lld error app-emulation/virtualbox-kvm compiler-gcc # ld.lld error #app-emulation/qemu compiler-gcc # ERROR: sizeof(size_t) doesn't match #dev-lang/mono compiler-gcc # ld.lld error #app-cdr/cdrtools compiler-gcc # configure error #dev-libs/libsecp256k1 compiler-gcc # unrecognized command-line option #dev-util/ostree compiler-gcc # ld.lld error #dev-python/ruamel-yaml-clib compiler-gcc # incompatible function pointer types #dev-qt/qtwebengine:5 compiler-gcc # build fails #media-libs/libpano13 compiler-gcc # build fails #media-libs/tg_owt compiler-gcc # build fails #media-libs/phonon compiler-gcc # build fails #media-libs/vigra compiler-gcc # build fails #net-print/hplip compiler-gcc # error: ISO C++17 #sys-boot/syslinux compiler-gcc # 'stdarg.h' file not found #sys-libs/db compiler-gcc # build fails with USE="cxx" #sys-process/tini compiler-gcc # ld.lld error sys-apps/systemd compiler-gcc dev-libs/libgudev compiler-gcc #net-dialup/ppp compiler-gcc #media-libs/audiofile compiler-gcc #app-crypt/chntpw compiler-gcc media-gfx/exact-image compiler-gcc media-libs/libfpx compiler-gcc sci-libs/djbfft compiler-gcc sci-visualization/gnuplot compiler-gcc =dev-db/sqlite-3.45* compiler-gcc app-editors/emacs compiler-gcc # gcc-jit sys-libs/talloc compiler-gcc sys-libs/tevent compiler-gcc #app-text/freelib compiler-gcc app-editors/wily compiler-gcc sci-mathematics/gretl compiler-gcc dev-java/openjdk:8 compiler-gcc dev-java/openjdk:11 compiler-gcc dev-java/openjdk:17 compiler-clang-mold dev-java/openjdk:21 compiler-clang-mold dev-java/commons-daemon compiler-gcc =dev-perl/PDL-2.63* compiler-gcc dev-python/scipy compiler-clang-mold dev-python/pygame compiler-gcc dev-games/openscenegraph compiler-gcc #dev-util/intel-graphics-compiler compiler-gcc #dev-libs/intel-compute-runtime compiler-gcc dev-libs/libdnet compiler-gcc sys-devel/llvm:15 compiler-gcc sys-devel/clang:15 compiler-gcc sys-devel/lld:15 compiler-gcc dev-libs/opencl-clang:15 compiler-gcc dev-libs/opencl-clang compiler-clang-mold dev-util/spirv-llvm-translator:15 compiler-gcc dev-debug/lldb compiler-clang-lto media-video/vlc compiler-clang-no-lto dev-libs/intel-vc-intrinsics compiler-gcc app-misc/ddcutil compiler-gcc mail-client/thunderbird compiler-gcc #www-client/chromium compiler-gcc dev-vcs/cvs compiler-gcc dev-vcs/darcs compiler-clang-binutils # need ld x11-libs/agg compiler-gcc x11-libs/fox compiler-gcc x11-libs/motif compiler-clang-lto sys-boot/gnu-efi compiler-gcc sys-apps/memtest86+ compiler-gcc #sys-apps/fwupd-efi compiler-clang-binutils sys-apps/fwupd-efi compiler-gcc sys-apps/flashrom compiler-gcc media-libs/mesa compiler-clang-lto app-text/zathura-pdf-mupdf compiler-clang-mold sys-libs/ldb compiler-clang-mold sys-libs/tdb compiler-clang-mold dev-db/cdb compiler-gcc sys-auth/sssd compiler-clang-mold =sci-libs/coinor-osi-0.108.6 compiler-gcc # bug: #919825 media-gfx/blender:4.0 compiler-gcc dev-debug/systemtap compiler-gcc x11-misc/virtualgl compiler-clang-mold dev-libs/libphonenumber compiler-clang-mold dev-libs/ffcall compiler-gcc dev-util/yacc compiler-gcc dev-libs/libbpf compiler-clang-mold dev-perl/OpenGL compiler-clang-mold dev-libs/xmlrpc-c compiler-gcc dev-libs/liboil compiler-gcc dev-libs/liblouis compiler-gcc dev-java/snappy compiler-gcc dev-libs/libcdio compiler-gcc net-fs/samba compiler-clang-mold dev-lang/gprolog compiler-clang-mold dev-libs/log4cpp compiler-gcc dev-db/libiodbc compiler-clang-mold dev-debug/ddd compiler-gcc dev-libs/totem-pl-parser compiler-clang-mold dev-lisp/ecl compiler-gcc dev-db/mariadb compiler-gcc dev-perl/PGPLOT compiler-clang-mold net-analyzer/rrdtool compiler-clang-mold dev-lang/harbour compiler-gcc media-libs/avidemux-core compiler-gcc media-video/avidemux compiler-gcc media-libs/avidemux-plugins compiler-gcc net-nds/openldap compiler-clang-mold net-libs/serf compiler-clang-mold sci-mathematics/pari compiler-gcc # needs fix makefiles dev-python/cysignals compiler-gcc app-accessibility/brltty compiler-clang-mold media-video/ffmpeg compiler-clang-mold app-office/dia compiler-gcc app-text/tesseract compiler-clang-mold dev-perl/PDL compiler-clang-mold dev-perl/OpenGL-GLUT compiler-clang-mold net-misc/openssh-contrib compiler-gcc dev-haskell/network compiler-gcc dev-haskell/old-time compiler-gcc dev-haskell/resolv compiler-gcc net-proxy/dante compiler-gcc sys-apps/keyutils compiler-clang-mold net-libs/libnftnl compiler-clang-mold media-sound/sox compiler-clang-mold media-libs/libgphoto2 compiler-clang-mold net-dns/bind-tools compiler-clang-mold media-gfx/sane-backends compiler-gcc app-text/paper-clip compiler-gcc app-i18n/scim compiler-gcc =sci-mathematics/octave-8* compiler-gcc =sci-mathematics/octave-9* compiler-gcc #sci-mathematics/octave compiler-clang-mold dev-libs/libgamin compiler-clang-mold x11-misc/redshift compiler-gcc #sci-visualization/scidavis compiler-gcc sys-cluster/glusterfs compiler-clang-mold media-libs/exempi compiler-gcc media-libs/urt compiler-gcc media-libs/libopenraw compiler-gcc media-libs/libsidplay compiler-gcc media-libs/libdc1394 compiler-gcc media-gfx/autopano-sift-C compiler-gcc media-libs/libdv compiler-gcc media-video/gpac compiler-gcc media-gfx/povray compiler-gcc media-libs/openglide compiler-gcc media-sound/audacity compiler-clang-mold net-firewall/ipset compiler-clang-mold media-gfx/graphicsmagick compiler-clang-mold dev-libs/libayatana-appindicator compiler-clang-mold net-libs/gtk-vnc compiler-clang-mold net-misc/omniORB compiler-gcc media-gfx/inkscape compiler-clang-mold net-print/gutenprint compiler-gcc net-misc/netkit-telnetd compiler-gcc net-fs/autofs compiler-gcc net-fs/openafs compiler-gcc #media-libs/libva-intel-media-driver compiler-gcc #sci-geosciences/liblas compiler-gcc dev-lang/openmodelica compiler-gcc dev-db/sqlite compiler-gcc ## Bug #928745 media-video/mpv compiler-clang-mold app-emulation/dosemu compiler-gcc app-arch/lha compiler-gcc app-arch/arj compiler-gcc app-text/fbreader compiler-gcc app-cdr/cdrtools compiler-gcc
- Нужно задать конфигурации для разных компиляторов.
- Конфигурация для компилятора gcc в файле
/etc/portage/env/compiler-gcc
:COMMON_FLAGS="-O2 -march=native" CFLAGS="${COMMON_FLAGS}" CXXFLAGS="${COMMON_FLAGS}" LDFLAGS="-Wl,--as-needed" CC="gcc" CXX="g++" CPP="gcc -E" AR="ar" NM="nm" RANLIB="ranlib" OBJCOPY="objcopy" STRIP="strip" LD="ld"
- Конфигурация для компилятора clang без LTO в файле
/etc/portage/env/compiler-clang-no-lto
:# Normal settings here COMMON_FLAGS="-O2 -march=native" CFLAGS="${COMMON_FLAGS}" CXXFLAGS="${COMMON_FLAGS}" CC="clang" CPP="clang-cpp" # necessary for xorg-server and possibly other packages CXX="clang++" AR="llvm-ar" NM="llvm-nm" RANLIB="llvm-ranlib" # No need to set this, clang-common can handle this based on chosen USE flags # LDFLAGS="${LDFLAGS} -fuse-ld=lld -rtlib=compiler-rt -unwindlib=libunwind -Wl,--as-needed" # LDFLAGS="-fuse-ld=lld -rtlib=compiler-rt -unwindlib=libunwind -Wl,--as-needed"
5 Компиляция ядра
- Ядро Linux можно скомпилировать с помощью Clang и набора инструментов LLVM, определив переменную среды:
LLVM=1
- Чтобы настроить специальные параметры ядра Clang, такие как оптимизация времени компоновки или целостность потока управления, выполните следующую команду:
LLVM=1 make menuconfig
- Далее скомпилируйте ядро как обычно:
LLVM=1 make
- Раньше необходимо было объявить
LLVM_IAS=1
для использования внутреннего ассемблера Clang для ядра. - Это больше не требуется, поскольку
LLVM=1
теперь включён по умолчанию.
6 C++ ABI
- Для Clang по умолчанию устанавливается библиотека C++
libcxx
. - При компиляции с помощью gcc используется библиотека
libstdc++
. - Необходимо, как минимум, перекомпилить приложения, использующие библиотеку
libstdc++
:revdep-rebuild --library libstdc++ -- -v --keep-going