Gentoo. Компиляция системы clang
Переход на Clang для компиляции системы.
Содержание
1 Общая информация
- Обязательно должен быть запасной вариант с GCC.
- На данный момент система не сможет скомпилировать все, что использует Clang.
2 Установка
- Установите
llvm-libunwind
: - Установите Clang:
1emerge 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++:
1emerge sys-libs/libcxxabi sys-libs/libcxx
- Вместо
lld
можно использовать линкерmold
:1emerge mold
3 Обновление системы
- Перекомпилим пакеты с библиотекой
libunwind
:1revdep-rebuild --library libunwind -- --keep-going
- Удалите библиотеку
libunwind
:1emerge -cv libunwind
- Необходимо перекомпилить программы, слинкованные со стандартной библиотекой
libstdc++
. - Проверьте, какие программы надо перекомпилить:
1revdep-rebuild --library libstdc++ -p
- Перекомпилим эти пакеты:
1revdep-rebuild --library libstdc++ -- --keep-going
4 Конфигурация
4.1 Основная системная конфигурация
- Файл
/etc/portage/make.conf
:1# this sources the PORTDIR_OVERLAY variable defined by layman. however, the variable expanded by layman was empty 2# source /var/db/repos/gentoo/local/layman/make.conf 3 4## This is added to make options by linux-mod.eclass 5BUILD_FIXES="LLVM=1 LLVM_IAS=1" 6CLANG_NO_DEFAULT_CONFIG=1 7 8COMMON_FLAGS="-O2 -march=native" 9CFLAGS="${COMMON_FLAGS}" 10CXXFLAGS="${COMMON_FLAGS}" 11 12# CFLAGS="${CFLAGS} -flto=thin" 13CXXFLAGS="${CFLAGS} ${CXXFLAGS}" 14#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" 15 16 17CC="clang" 18CPP="clang-cpp" # necessary for xorg-server and possibly other packages 19CXX="clang++" 20AR="llvm-ar" 21NM="llvm-nm" 22RANLIB="llvm-ranlib" 23OBJCOPY="llvm-objcopy" 24LD="mold" 25 26## No need to set this, clang-common can handle this based on chosen USE flags 27# LDFLAGS="${LDFLAGS} -fuse-ld=lld" 28# LDFLAGS="${LDFLAGS} -fuse-ld=mold" 29# LDFLAGS="${LDFLAGS} -Wl,-O2 -Wl,--as-needed -Wl,--undefined-version" 30# LDFLAGS="${LDFLAGS} -rtlib=compiler-rt -unwindlib=libunwind" 31# LDFLAGS="${LDFLAGS} -flto"
4.2 Конфигурация окружения для каждого пакета
- Можно задать компилятор для каждого пакета в отдельности в файле
/etc/portage/package.env
:1sys-devel/gcc compiler-gcc # gcc itself 2sys-devel/binutils compiler-gcc # gcc itself # configure: error: AR 3sys-libs/binutils-libs compiler-gcc # gcc itself 4dev-util/mingw64-toolchain compiler-gcc # gcc itself 5dev-debug/gdb compiler-gcc # gcc itself 6=dev-util/gengetopt-2.23* compiler-gcc # 7sys-devel/bin86 compiler-gcc # error: ISO C99 8=app-emulation/virtualbox-7.0* compiler-gcc # ld.lld error 9=app-emulation/virtualbox-kvm-7.0* compiler-gcc # ld.lld error 10sys-apps/systemd compiler-gcc 11dev-libs/libgudev compiler-gcc 12media-gfx/exact-image compiler-gcc 13media-libs/libfpx compiler-gcc 14sci-libs/djbfft compiler-gcc 15sci-visualization/gnuplot compiler-gcc 16app-editors/emacs compiler-gcc # gcc-jit 17sys-libs/talloc compiler-gcc 18sys-libs/tevent compiler-gcc 19app-editors/wily compiler-gcc 20sci-mathematics/gretl compiler-gcc 21dev-java/openjdk:8 compiler-gcc 22dev-java/openjdk:11 compiler-gcc 23dev-java/openjdk:17 compiler-clang-mold 24dev-java/openjdk:21 compiler-clang-mold 25dev-java/commons-daemon compiler-gcc 26=dev-perl/PDL-2.63* compiler-gcc 27dev-python/scipy compiler-clang-mold 28dev-python/pygame compiler-gcc 29dev-games/openscenegraph compiler-gcc 30dev-libs/libdnet compiler-gcc 31sys-devel/llvm:15 compiler-gcc 32sys-devel/clang:15 compiler-gcc 33sys-devel/lld:15 compiler-gcc 34dev-libs/opencl-clang:15 compiler-gcc 35dev-libs/opencl-clang compiler-clang-mold 36dev-util/spirv-llvm-translator:15 compiler-gcc 37dev-debug/lldb compiler-clang-lto 38media-video/vlc compiler-clang-no-lto 39dev-libs/intel-vc-intrinsics compiler-gcc 40app-misc/ddcutil compiler-gcc 41mail-client/thunderbird compiler-gcc 42dev-vcs/cvs compiler-gcc 43dev-vcs/darcs compiler-clang-binutils # need ld 44x11-libs/agg compiler-gcc 45x11-libs/fox compiler-gcc 46x11-libs/motif compiler-clang-lto 47sys-boot/gnu-efi compiler-gcc 48sys-apps/memtest86+ compiler-gcc 49sys-apps/fwupd-efi compiler-gcc 50sys-apps/flashrom compiler-gcc 51media-libs/mesa compiler-clang-lto 52app-text/zathura-pdf-mupdf compiler-clang-mold 53sys-libs/ldb compiler-clang-mold 54sys-libs/tdb compiler-clang-mold 55dev-db/cdb compiler-gcc 56sys-auth/sssd compiler-clang-mold 57=sci-libs/coinor-osi-0.108.6 compiler-gcc # bug: #919825 58media-gfx/blender:4.0 compiler-gcc 59dev-debug/systemtap compiler-gcc 60x11-misc/virtualgl compiler-clang-mold 61dev-libs/libphonenumber compiler-clang-mold 62dev-libs/ffcall compiler-gcc 63dev-util/yacc compiler-gcc 64dev-libs/libbpf compiler-clang-mold 65dev-perl/OpenGL compiler-clang-mold 66dev-libs/xmlrpc-c compiler-gcc 67dev-libs/liboil compiler-gcc 68dev-libs/liblouis compiler-gcc 69dev-java/snappy compiler-gcc 70dev-libs/libcdio compiler-gcc 71net-fs/samba compiler-clang-mold 72dev-lang/gprolog compiler-clang-mold 73dev-libs/log4cpp compiler-gcc 74dev-db/libiodbc compiler-clang-mold 75dev-debug/ddd compiler-gcc 76dev-libs/totem-pl-parser compiler-clang-mold 77dev-lisp/ecl compiler-gcc 78dev-db/mariadb compiler-gcc 79dev-perl/PGPLOT compiler-clang-mold 80net-analyzer/rrdtool compiler-clang-mold 81dev-lang/harbour compiler-gcc 82media-libs/avidemux-core compiler-gcc 83media-video/avidemux compiler-gcc 84media-libs/avidemux-plugins compiler-gcc 85net-nds/openldap compiler-clang-mold 86net-libs/serf compiler-clang-mold 87sci-mathematics/pari compiler-gcc # needs fix makefiles 88dev-python/cysignals compiler-gcc 89app-accessibility/brltty compiler-clang-mold 90media-video/ffmpeg compiler-clang-mold 91app-office/dia compiler-gcc 92app-text/tesseract compiler-clang-mold 93dev-perl/PDL compiler-clang-mold 94dev-perl/OpenGL-GLUT compiler-clang-mold 95net-misc/openssh-contrib compiler-gcc 96dev-haskell/network compiler-gcc 97dev-haskell/old-time compiler-gcc 98dev-haskell/resolv compiler-gcc 99net-proxy/dante compiler-gcc 100sys-apps/keyutils compiler-clang-mold 101net-libs/libnftnl compiler-clang-mold 102media-sound/sox compiler-clang-mold 103media-libs/libgphoto2 compiler-clang-mold 104net-dns/bind-tools compiler-clang-mold 105media-gfx/sane-backends compiler-gcc 106app-text/paper-clip compiler-gcc 107app-i18n/scim compiler-gcc 108=sci-mathematics/octave-8* compiler-gcc 109dev-libs/libgamin compiler-clang-mold 110x11-misc/redshift compiler-gcc 111sys-cluster/glusterfs compiler-clang-mold 112media-libs/exempi compiler-gcc 113media-libs/urt compiler-gcc 114media-libs/libopenraw compiler-gcc 115media-libs/libsidplay compiler-gcc 116media-libs/libdc1394 compiler-gcc 117media-gfx/autopano-sift-C compiler-gcc 118media-libs/libdv compiler-gcc 119media-video/gpac compiler-gcc 120media-gfx/povray compiler-gcc 121media-libs/openglide compiler-gcc 122media-sound/audacity compiler-clang-mold 123net-firewall/ipset compiler-clang-mold 124media-gfx/graphicsmagick compiler-clang-mold 125dev-libs/libayatana-appindicator compiler-clang-mold 126net-libs/gtk-vnc compiler-clang-mold 127net-misc/omniORB compiler-gcc 128media-gfx/inkscape compiler-clang-mold 129net-print/gutenprint compiler-gcc 130net-misc/netkit-telnetd compiler-gcc 131net-fs/autofs compiler-gcc 132sci-physics/openmodelica compiler-gcc 133media-video/mpv compiler-clang-mold 134app-emulation/dosemu compiler-gcc 135app-arch/lha compiler-gcc 136app-arch/arj compiler-gcc 137app-text/fbreader compiler-gcc 138app-cdr/cdrtools compiler-gcc 139dev-libs/libpqxx compiler-clang-mold-18 140sci-libs/vtk compiler-clang-mold-18 141sci-visualization/paraview compiler-clang-mold-18 142sci-libs/pdal compiler-clang-mold-18 143dev-lang/rust compiler-gcc 144dev-qt/qttools compiler-clang-mold-18 145dev-util/kdevelop compiler-clang-mold-18 146dev-qt/qtwebengine compiler-clang-mold-18 147kde-apps/step compiler-clang-mold-18 148sci-mathematics/singular compiler-gcc 149media-libs/tg_owt compiler-gcc 150media-gfx/asymptote compiler-gcc 151gui-libs/gtk:4 compiler-clang
4.3 Конфигурация специальных окружений
- Нужно задать конфигурации для разных компиляторов.
4.3.1 gcc
- Конфигурация для компилятора gcc в файле
/etc/portage/env/compiler-gcc
:
4.3.2 clang без LTO
- Конфигурация для компилятора clang без LTO в файле
/etc/portage/env/compiler-clang-no-lto
:
4.3.3 clang
- Конфигурация для компилятора /clang/в файле
/etc/portage/env/compiler-clang
:
4.3.4 clang + mold
1# Normal settings here
2COMMON_FLAGS="-O2 -march=native"
3CFLAGS="${COMMON_FLAGS}"
4CXXFLAGS="${COMMON_FLAGS}"
5CLANG_NO_DEFAULT_CONFIG=1
6
7CC="clang"
8CPP="clang-cpp" # necessary for xorg-server and possibly other packages
9CXX="clang++"
10AR="llvm-ar"
11NM="llvm-nm"
12RANLIB="llvm-ranlib"
13OBJCOPY="llvm-objcopy"
14LD="mold"
15
16LDFLAGS="${LDFLAGS} -fuse-ld=mold"
4.3.5 clang-18 + mold
1# Normal settings here
2COMMON_FLAGS="-O2 -march=native"
3CFLAGS="${COMMON_FLAGS}"
4CXXFLAGS="${COMMON_FLAGS}"
5CLANG_NO_DEFAULT_CONFIG=1
6
7CC="clang-18"
8CPP="clang-cpp-18"
9CXX="clang++-18"
10AR="llvm-ar"
11NM="llvm-nm"
12RANLIB="llvm-ranlib"
13OBJCOPY="llvm-objcopy"
14LD="mold"
15LDFLAGS="${LDFLAGS} -fuse-ld=mold"
5 Компиляция ядра
- Ядро Linux можно скомпилировать с помощью Clang и набора инструментов LLVM, определив переменную среды:
1LLVM=1
- Чтобы настроить специальные параметры ядра Clang, такие как оптимизация времени компоновки или целостность потока управления, выполните следующую команду:
1LLVM=1 make menuconfig
- Далее скомпилируйте ядро как обычно:
1LLVM=1 make
- Раньше необходимо было объявить
LLVM_IAS=1
для использования внутреннего ассемблера Clang для ядра. - Это больше не требуется, поскольку
LLVM=1
теперь включён по умолчанию.
6 C++ ABI
- Для Clang по умолчанию устанавливается библиотека C++
libcxx
. - При компиляции с помощью gcc используется библиотека
libstdc++
. - Необходимо, как минимум, перекомпилить приложения, использующие библиотеку
libstdc++
:1revdep-rebuild --library libstdc++ -- -v --keep-going