Gentoo. Компиляция системы clang

2024-05-16 · 5 мин. для прочтения

Переход на 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 Основная системная конфигурация

4.1.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
    
    Распечатка 1: /etc/portage/make.conf
  • Подключение настроек конкретного хоста:
    source /etc/portage/make.profile/make.conf
    
    Распечатка 2: /etc/portage/make.conf

4.1.2 Настройка portage

  • Выбор формата бинарных пакетов:
    ## binpkg
    BINPKG_FORMAT="gpkg"
    
    Распечатка 3: /etc/portage/make.conf
  • Выбор формата сжатия бинарных пакетов:
    BINPKG_COMPRESS="zstd"
    
    Распечатка 4: /etc/portage/make.conf
  • Формат каталога пакетов:
    FEATURES=binpkg-multi-instance
    
    Распечатка 5: /etc/portage/make.conf
  • Управление приоритетом:
    ## https://wiki.gentoo.org/wiki/Portage_niceness
    ## Extremely low priority (per above)
    PORTAGE_SCHEDULING_POLICY="idle"
    ## Lowest priority
    PORTAGE_NICENESS="19"
    PORTAGE_IONICE_COMMAND="ionice -c 3 -p \${PID}"
    
    Распечатка 6: /etc/portage/make.conf

4.1.3 Настройка clang

  • Опции для ядерных модулей:
    ## This is added to make options by linux-mod.eclass
    BUILD_FIXES="LLVM=1 LLVM_IAS=1"
    CLANG_NO_DEFAULT_CONFIG=1
    
    COMMON_FLAGS="-O2 -march=native"
    CFLAGS="${COMMON_FLAGS}"
    CXXFLAGS="${COMMON_FLAGS}"
    
    # CFLAGS="${CFLAGS} -flto=thin"
    CXXFLAGS="${CFLAGS} ${CXXFLAGS}"
    #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"
    
    
    CC="clang"
    CPP="clang-cpp" # necessary for xorg-server and possibly other packages
    CXX="clang++"
    AR="llvm-ar"
    NM="llvm-nm"
    RANLIB="llvm-ranlib"
    OBJCOPY="llvm-objcopy"
    LD="mold"
    
    ## No need to set this, clang-common can handle this based on chosen USE flags
    # LDFLAGS="${LDFLAGS} -fuse-ld=lld"
    # LDFLAGS="${LDFLAGS} -fuse-ld=mold"
    # LDFLAGS="${LDFLAGS} -Wl,-O2 -Wl,--as-needed -Wl,--undefined-version"
    # LDFLAGS="${LDFLAGS} -rtlib=compiler-rt -unwindlib=libunwind"
    # LDFLAGS="${LDFLAGS} -flto"
    
    Распечатка 7: /etc/portage/make.conf

4.2 Конфигурация окружения для каждого пакета

  • Можно задать компилятор для каждого пакета в отдельности в файле /etc/portage/package.env:
    # dev-haskell/network				compiler-gcc
    # dev-haskell/old-time				compiler-gcc
    # dev-util/spirv-llvm-translator:15		compiler-gcc
    # dev-vcs/darcs					compiler-clang-binutils	# need ld
    # sys-devel/clang:15				compiler-gcc
    # sys-devel/lld:15				compiler-gcc
    # sys-devel/llvm:15				compiler-gcc
    =app-emulation/virtualbox-7.0*			compiler-gcc    # ld.lld error
    =app-emulation/virtualbox-7.1*			compiler-gcc    # ld.lld error
    =app-emulation/virtualbox-kvm-7.0*		compiler-gcc    # ld.lld error
    =app-emulation/virtualbox-kvm-7.1*		compiler-gcc    # ld.lld error
    =dev-perl/PDL-2.63*				compiler-gcc
    =dev-util/gengetopt-2.23*			compiler-gcc	#
    =sci-libs/coinor-osi-0.108.6			compiler-gcc		# bug: #919825
    =sci-mathematics/octave-8*			compiler-gcc
    app-accessibility/brltty			compiler-clang-mold
    app-arch/arj					compiler-gcc
    app-arch/lha					compiler-gcc
    app-cdr/cdrtools				compiler-gcc
    app-editors/emacs				compiler-gcc	# gcc-jit
    app-editors/wily				compiler-gcc
    app-editors/wily				compiler-gcc
    app-emulation/dosemu				compiler-gcc
    app-i18n/scim					compiler-gcc
    app-misc/ddcutil				compiler-gcc
    app-office/dia					compiler-gcc
    app-text/fbreader				compiler-gcc
    app-text/paper-clip				compiler-gcc
    app-text/tesseract				compiler-clang-mold
    app-text/zathura-pdf-mupdf			compiler-clang-mold
    dev-db/cdb					compiler-gcc
    dev-db/libiodbc					compiler-clang-mold
    dev-db/mariadb					compiler-gcc
    dev-debug/ddd					compiler-gcc
    dev-debug/gdb					compiler-gcc	# gcc itself
    dev-debug/systemtap				compiler-gcc
    dev-games/openscenegraph			compiler-gcc
    dev-haskell/network				compiler-clang
    dev-haskell/old-time				compiler-clang
    dev-haskell/resolv				compiler-gcc
    dev-java/commons-daemon				compiler-gcc
    dev-java/openjdk:11				compiler-gcc
    dev-java/openjdk:17				compiler-clang-mold
    dev-java/openjdk:21				compiler-clang-mold
    dev-java/openjdk:8				compiler-gcc
    dev-java/snappy					compiler-gcc
    dev-lang/gprolog				compiler-clang-mold
    dev-lang/harbour				compiler-gcc
    dev-lang/rust					compiler-gcc
    dev-libs/cereal					compiler-clang-mold-18
    dev-libs/efl					compiler-clang-mold-18
    dev-libs/ffcall					compiler-gcc
    dev-libs/intel-vc-intrinsics			compiler-gcc
    dev-libs/libayatana-appindicator		compiler-clang-mold
    dev-libs/libbpf					compiler-clang-mold
    dev-libs/libcdio				compiler-gcc
    dev-libs/libdnet				compiler-gcc
    dev-libs/libgamin				compiler-clang-mold
    dev-libs/libgudev				compiler-gcc
    dev-libs/liblouis				compiler-gcc
    dev-libs/liboil					compiler-gcc
    dev-libs/libphonenumber				compiler-clang-mold
    dev-libs/libpqxx				compiler-clang-mold-18
    dev-libs/log4cpp				compiler-gcc
    dev-libs/olm					compiler-gcc
    dev-libs/opencl-clang				compiler-clang-mold
    dev-libs/opencl-clang:15			compiler-gcc
    dev-libs/totem-pl-parser			compiler-clang-mold
    dev-libs/xmlrpc-c				compiler-gcc
    dev-lisp/ecl					compiler-gcc
    dev-perl/OpenGL					compiler-clang-mold
    dev-perl/OpenGL-GLUT				compiler-clang-mold
    dev-perl/PDL					compiler-clang-mold
    dev-perl/PGPLOT					compiler-clang-mold
    dev-python/cysignals				compiler-gcc
    dev-python/pygame				compiler-gcc
    dev-python/scipy				compiler-clang-mold
    # dev-qt/qttools					compiler-clang-mold-18
    dev-qt/qtwebengine:5				compiler-clang-mold-18
    dev-qt/qtwebengine:6				compiler-clang-mold-18
    dev-tex/tectonic				compiler-gcc
    dev-util/kdevelop				compiler-clang-mold-18
    dev-util/mingw64-toolchain			compiler-gcc	# gcc itself
    dev-util/yacc					compiler-gcc
    dev-vcs/cvs					compiler-gcc
    dev-vcs/darcs					compiler-clang
    gui-libs/gtk:4					compiler-clang
    kde-apps/step					compiler-clang-mold-18
    llvm-core/lldb					compiler-clang
    mail-client/thunderbird				compiler-gcc
    media-gfx/asymptote				compiler-gcc
    media-gfx/autopano-sift-C			compiler-gcc
    media-gfx/blender:4.0				compiler-gcc
    media-gfx/exact-image				compiler-gcc
    media-gfx/graphicsmagick			compiler-clang-mold
    media-gfx/inkscape				compiler-clang-mold
    media-gfx/openvdb				compiler-clang-mold-18
    media-gfx/povray				compiler-gcc
    media-gfx/sane-backends				compiler-gcc
    media-libs/avidemux-core			compiler-gcc
    media-libs/avidemux-plugins			compiler-gcc
    media-libs/exempi				compiler-gcc
    media-libs/intel-mediasdk			compiler-gcc
    media-libs/libdc1394				compiler-gcc
    media-libs/libdv				compiler-gcc
    media-libs/libfpx				compiler-gcc
    media-libs/libgphoto2				compiler-clang-mold
    media-libs/libopenraw				compiler-gcc
    media-libs/libquvi				compiler-gcc
    media-libs/libsidplay				compiler-gcc
    # media-libs/mesa					compiler-clang-lto
    media-libs/openglide				compiler-gcc
    media-libs/tg_owt				compiler-gcc
    media-libs/urt					compiler-gcc
    media-sound/audacity				compiler-clang-mold
    media-sound/sox					compiler-clang-mold
    media-video/avidemux				compiler-gcc
    media-video/ffmpeg				compiler-clang-mold
    media-video/gpac				compiler-gcc
    media-video/mpv					compiler-clang-mold
    net-analyzer/rrdtool				compiler-clang-mold
    net-dns/bind-tools				compiler-clang-mold
    net-firewall/ipset				compiler-clang-mold
    net-fs/autofs					compiler-gcc
    net-fs/openafs					compiler-gcc
    net-fs/samba					compiler-clang-mold
    net-libs/gtk-vnc				compiler-clang-mold
    net-libs/libnftnl				compiler-clang-mold
    net-libs/serf					compiler-clang-mold
    net-libs/webkit-gtk				compiler-clang-mold-18
    net-misc/netkit-telnetd				compiler-gcc
    net-misc/omniORB				compiler-gcc
    net-misc/openssh-contrib			compiler-gcc
    net-nds/openldap				compiler-clang-mold
    net-print/gutenprint				compiler-gcc
    net-proxy/dante					compiler-gcc
    net-vpn/networkmanager-vpnc			compiler-gcc
    sci-libs/djbfft					compiler-gcc
    sci-libs/pdal					compiler-clang-mold-18
    sci-libs/vtk					compiler-clang-mold-18
    sci-mathematics/giac				compiler-gcc
    sci-mathematics/pari				compiler-gcc		# needs fix makefiles
    sci-mathematics/singular			compiler-gcc
    sci-physics/openmodelica			compiler-gcc
    sci-visualization/gnuplot			compiler-gcc
    sci-visualization/paraview			compiler-clang-mold-18
    sys-apps/flashrom				compiler-gcc
    sys-apps/fwupd-efi				compiler-gcc
    sys-apps/keyutils				compiler-clang-mold
    sys-apps/memtest86+				compiler-gcc
    sys-apps/systemd				compiler-gcc
    sys-auth/sssd					compiler-clang-mold
    sys-boot/gnu-efi				compiler-gcc
    sys-cluster/glusterfs				compiler-clang-mold
    sys-devel/bin86					compiler-gcc    # error: ISO C99
    sys-devel/binutils				compiler-gcc	# gcc itself	# configure: error: AR
    sys-devel/gcc					compiler-gcc	# gcc itself
    sys-libs/binutils-libs				compiler-gcc	# gcc itself
    sys-libs/ldb					compiler-clang-mold
    sys-libs/talloc					compiler-gcc
    sys-libs/tdb					compiler-clang-mold
    sys-libs/tevent					compiler-gcc
    www-client/chromium				compiler-clang
    x11-libs/agg					compiler-gcc
    x11-libs/fox					compiler-gcc
    # x11-libs/motif					compiler-clang-lto
    x11-misc/redshift				compiler-gcc
    x11-misc/virtualgl				compiler-clang-mold
    app-text/texlive-core				compiler-gcc
    dev-db/sqlite					compiler-gcc
    sys-fs/duperemove				compiler-gcc
    

4.3 Конфигурация специальных окружений

  • Нужно задать конфигурации для разных компиляторов.

4.3.1 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"
    
    Распечатка 8: /etc/portage/env/compiler-gcc

4.3.2 clang без LTO

  • Конфигурация для компилятора clang без LTO в файле /etc/portage/env/compiler-clang-no-lto:
    CC="clang"
    CPP="clang-cpp"
    CXX="clang++"
    AR="llvm-ar"
    NM="llvm-nm"
    RANLIB="llvm-ranlib"
    OBJCOPY="llvm-objcopy"
    LD="lld"
    
    Распечатка 9: /etc/portage/env/compiler-clang-no-lto

4.3.3 clang

  • Конфигурация для компилятора /clang/в файле /etc/portage/env/compiler-clang:
    CC="clang"
    CPP="clang-cpp"
    CXX="clang++"
    AR="llvm-ar"
    NM="llvm-nm"
    RANLIB="llvm-ranlib"
    OBJCOPY="llvm-objcopy"
    LD="lld"
    
    Распечатка 10: /etc/portage/env/compiler-clang

4.3.4 clang + mold

# Normal settings here
COMMON_FLAGS="-O2 -march=native"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
CLANG_NO_DEFAULT_CONFIG=1

CC="clang"
CPP="clang-cpp" # necessary for xorg-server and possibly other packages
CXX="clang++"
AR="llvm-ar"
NM="llvm-nm"
RANLIB="llvm-ranlib"
OBJCOPY="llvm-objcopy"
LD="mold"

LDFLAGS="${LDFLAGS} -fuse-ld=mold"
Распечатка 11: /etc/portage/env/compiler-clang-mold

4.3.5 clang-18 + mold

# Normal settings here
COMMON_FLAGS="-O2 -march=native"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
CLANG_NO_DEFAULT_CONFIG=1

CC="clang-18"
CPP="clang-cpp-18"
CXX="clang++-18"
AR="llvm-ar"
NM="llvm-nm"
RANLIB="llvm-ranlib"
OBJCOPY="llvm-objcopy"
LD="mold"
LDFLAGS="${LDFLAGS} -fuse-ld=mold"
Распечатка 12: /etc/portage/env/compiler-clang-mold-18

4.3.6 clang + binutils

  • Конфигурация для компилятора /clang/в файле /etc/portage/env/compiler-clang-binutils:
    CC="clang"
    CPP="clang-cpp"
    CXX="clang++"
    AR="ar"
    NM="nm"
    RANLIB="ranlib"
    OBJCOPY="objcopy"
    STRIP="strip"
    LD="ld"
    
    Распечатка 13: /etc/portage/env/compiler-clang-binutils

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
    

7 Ресурсы

Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Мои научные интересы включают физику, администрирование Unix и сетей.