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