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" 6 7CFLAGS="${CFLAGS} -flto=thin" 8#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" 9CXXFLAGS="${CFLAGS} ${CXXFLAGS}" 10 11CC="clang" 12CPP="clang-cpp" # necessary for xorg-server and possibly other packages 13CXX="clang++" 14AR="llvm-ar" 15NM="llvm-nm" 16RANLIB="llvm-ranlib" 17 18# No need to set this, clang-common can handle this based on chosen USE flags 19#LDFLAGS="${LDFLAGS} -fuse-ld=lld" 20#LDFLAGS="${LDFLAGS} -Wl,-O2 -Wl,--as-needed -Wl,--undefined-version" 21#LDFLAGS="${LDFLAGS} -rtlib=compiler-rt -unwindlib=libunwind" 22#LDFLAGS="${LDFLAGS} -fuse-ld=mold" 23LDFLAGS="${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 10#app-emulation/qemu compiler-gcc # ERROR: sizeof(size_t) doesn't match 11#dev-lang/mono compiler-gcc # ld.lld error 12#app-cdr/cdrtools compiler-gcc # configure error 13#dev-libs/libsecp256k1 compiler-gcc # unrecognized command-line option 14#dev-util/ostree compiler-gcc # ld.lld error 15#dev-python/ruamel-yaml-clib compiler-gcc # incompatible function pointer types 16#dev-qt/qtwebengine:5 compiler-gcc # build fails 17#media-libs/libpano13 compiler-gcc # build fails 18#media-libs/tg_owt compiler-gcc # build fails 19#media-libs/phonon compiler-gcc # build fails 20#media-libs/vigra compiler-gcc # build fails 21#net-print/hplip compiler-gcc # error: ISO C++17 22#sys-boot/syslinux compiler-gcc # 'stdarg.h' file not found 23#sys-libs/db compiler-gcc # build fails with USE="cxx" 24#sys-process/tini compiler-gcc # ld.lld error 25sys-apps/systemd compiler-gcc 26dev-libs/libgudev compiler-gcc 27#net-dialup/ppp compiler-gcc 28#media-libs/audiofile compiler-gcc 29#app-crypt/chntpw compiler-gcc 30media-gfx/exact-image compiler-gcc 31media-libs/libfpx compiler-gcc 32sci-libs/djbfft compiler-gcc 33sci-visualization/gnuplot compiler-gcc 34=dev-db/sqlite-3.45* compiler-gcc 35app-editors/emacs compiler-gcc # gcc-jit 36sys-libs/talloc compiler-gcc 37sys-libs/tevent compiler-gcc 38#app-text/freelib compiler-gcc 39app-editors/wily compiler-gcc 40sci-mathematics/gretl compiler-gcc 41dev-java/openjdk:8 compiler-gcc 42dev-java/openjdk:11 compiler-gcc 43dev-java/openjdk:17 compiler-clang-mold 44dev-java/openjdk:21 compiler-clang-mold 45dev-java/commons-daemon compiler-gcc 46=dev-perl/PDL-2.63* compiler-gcc 47dev-python/scipy compiler-clang-mold 48dev-python/pygame compiler-gcc 49dev-games/openscenegraph compiler-gcc 50#dev-util/intel-graphics-compiler compiler-gcc 51#dev-libs/intel-compute-runtime compiler-gcc 52dev-libs/libdnet compiler-gcc 53sys-devel/llvm:15 compiler-gcc 54sys-devel/clang:15 compiler-gcc 55sys-devel/lld:15 compiler-gcc 56dev-libs/opencl-clang:15 compiler-gcc 57dev-libs/opencl-clang compiler-clang-mold 58dev-util/spirv-llvm-translator:15 compiler-gcc 59dev-debug/lldb compiler-clang-lto 60media-video/vlc compiler-clang-no-lto 61dev-libs/intel-vc-intrinsics compiler-gcc 62app-misc/ddcutil compiler-gcc 63mail-client/thunderbird compiler-gcc 64dev-vcs/cvs compiler-gcc 65dev-vcs/darcs compiler-clang-binutils # need ld 66x11-libs/agg compiler-gcc 67x11-libs/fox compiler-gcc 68x11-libs/motif compiler-clang-lto 69sys-boot/gnu-efi compiler-gcc 70sys-apps/memtest86+ compiler-gcc 71sys-apps/fwupd-efi compiler-gcc 72sys-apps/flashrom compiler-gcc 73media-libs/mesa compiler-clang-lto 74app-text/zathura-pdf-mupdf compiler-clang-mold 75sys-libs/ldb compiler-clang-mold 76sys-libs/tdb compiler-clang-mold 77dev-db/cdb compiler-gcc 78sys-auth/sssd compiler-clang-mold 79=sci-libs/coinor-osi-0.108.6 compiler-gcc # bug: #919825 80media-gfx/blender:4.0 compiler-gcc 81dev-debug/systemtap compiler-gcc 82x11-misc/virtualgl compiler-clang-mold 83dev-libs/libphonenumber compiler-clang-mold 84dev-libs/ffcall compiler-gcc 85dev-util/yacc compiler-gcc 86dev-libs/libbpf compiler-clang-mold 87dev-perl/OpenGL compiler-clang-mold 88dev-libs/xmlrpc-c compiler-gcc 89dev-libs/liboil compiler-gcc 90dev-libs/liblouis compiler-gcc 91dev-java/snappy compiler-gcc 92dev-libs/libcdio compiler-gcc 93net-fs/samba compiler-clang-mold 94dev-lang/gprolog compiler-clang-mold 95dev-libs/log4cpp compiler-gcc 96dev-db/libiodbc compiler-clang-mold 97dev-debug/ddd compiler-gcc 98dev-libs/totem-pl-parser compiler-clang-mold 99dev-lisp/ecl compiler-gcc 100dev-db/mariadb compiler-gcc 101dev-perl/PGPLOT compiler-clang-mold 102net-analyzer/rrdtool compiler-clang-mold 103dev-lang/harbour compiler-gcc 104media-libs/avidemux-core compiler-gcc 105media-video/avidemux compiler-gcc 106media-libs/avidemux-plugins compiler-gcc 107net-nds/openldap compiler-clang-mold 108net-libs/serf compiler-clang-mold 109sci-mathematics/pari compiler-gcc # needs fix makefiles 110dev-python/cysignals compiler-gcc 111app-accessibility/brltty compiler-clang-mold 112media-video/ffmpeg compiler-clang-mold 113app-office/dia compiler-gcc 114app-text/tesseract compiler-clang-mold 115dev-perl/PDL compiler-clang-mold 116dev-perl/OpenGL-GLUT compiler-clang-mold 117net-misc/openssh-contrib compiler-gcc 118dev-haskell/network compiler-gcc 119dev-haskell/old-time compiler-gcc 120dev-haskell/resolv compiler-gcc 121net-proxy/dante compiler-gcc 122sys-apps/keyutils compiler-clang-mold 123net-libs/libnftnl compiler-clang-mold 124media-sound/sox compiler-clang-mold 125media-libs/libgphoto2 compiler-clang-mold 126net-dns/bind-tools compiler-clang-mold 127media-gfx/sane-backends compiler-gcc 128app-text/paper-clip compiler-gcc 129app-i18n/scim compiler-gcc 130=sci-mathematics/octave-8* compiler-gcc 131dev-libs/libgamin compiler-clang-mold 132x11-misc/redshift compiler-gcc 133sys-cluster/glusterfs compiler-clang-mold 134media-libs/exempi compiler-gcc 135media-libs/urt compiler-gcc 136media-libs/libopenraw compiler-gcc 137media-libs/libsidplay compiler-gcc 138media-libs/libdc1394 compiler-gcc 139media-gfx/autopano-sift-C compiler-gcc 140media-libs/libdv compiler-gcc 141media-video/gpac compiler-gcc 142media-gfx/povray compiler-gcc 143media-libs/openglide compiler-gcc 144media-sound/audacity compiler-clang-mold 145net-firewall/ipset compiler-clang-mold 146media-gfx/graphicsmagick compiler-clang-mold 147dev-libs/libayatana-appindicator compiler-clang-mold 148net-libs/gtk-vnc compiler-clang-mold 149net-misc/omniORB compiler-gcc 150media-gfx/inkscape compiler-clang-mold 151net-print/gutenprint compiler-gcc 152net-misc/netkit-telnetd compiler-gcc 153net-fs/autofs compiler-gcc 154sci-physics/openmodelica compiler-gcc 155dev-db/sqlite compiler-gcc ## Bug #928745 156media-video/mpv compiler-clang-mold 157app-emulation/dosemu compiler-gcc 158app-arch/lha compiler-gcc 159app-arch/arj compiler-gcc 160app-text/fbreader compiler-gcc 161app-cdr/cdrtools compiler-gcc 162dev-libs/libpqxx compiler-clang-mold-18 163sci-libs/vtk compiler-clang-mold-18 164sci-visualization/paraview compiler-clang-mold-18
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
:1# Normal settings here 2COMMON_FLAGS="-O2 -march=native" 3CFLAGS="${COMMON_FLAGS}" 4CXXFLAGS="${COMMON_FLAGS}" 5 6CC="clang" 7CPP="clang-cpp" # necessary for xorg-server and possibly other packages 8CXX="clang++" 9AR="llvm-ar" 10NM="llvm-nm" 11RANLIB="llvm-ranlib" 12 13# No need to set this, clang-common can handle this based on chosen USE flags 14# LDFLAGS="${LDFLAGS} -fuse-ld=lld -rtlib=compiler-rt -unwindlib=libunwind -Wl,--as-needed" 15# LDFLAGS="-fuse-ld=lld -rtlib=compiler-rt -unwindlib=libunwind -Wl,--as-needed"
4.3.3 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
16
17#LDFLAGS="${LDFLAGS} -Wl,-O2 -Wl,--as-needed -Wl,--undefined-version"
18#LDFLAGS="${LDFLAGS} -rtlib=compiler-rt -unwindlib=libunwind"
19LDFLAGS="${LDFLAGS} -fuse-ld=mold"
20#LDFLAGS="${LDFLAGS} -flto"
4.3.4 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