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

Переход на Clang для компиляции системы.

Содержание

1 Общая информация

  • Обязательно должен быть запасной вариант с GCC.
  • На данный момент система не сможет скомпилировать все, что использует Clang.

2 Установка

  • Установите llvm-libunwind:
    1emerge --deselect libunwind
    2FEATURES="-protect-owned" emerge -vO 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:
     1COMMON_FLAGS="-O2 -march=native"
     2CFLAGS="${COMMON_FLAGS}"
     3CXXFLAGS="${COMMON_FLAGS}"
     4LDFLAGS="-Wl,--as-needed"
     5
     6CC="gcc"
     7CXX="g++"
     8CPP="gcc -E"
     9AR="ar"
    10NM="nm"
    11RANLIB="ranlib"
    12OBJCOPY="objcopy"
    13STRIP="strip"
    14LD="ld"
    
    Распечатка 1: /etc/portage/env/compiler-gcc

4.3.2 clang без LTO

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

4.3.3 clang

  • Конфигурация для компилятора /clang/в файле /etc/portage/env/compiler-clang:
    1CC="clang"
    2CPP="clang-cpp"
    3CXX="clang++"
    4AR="llvm-ar"
    5NM="llvm-nm"
    6RANLIB="llvm-ranlib"
    7OBJCOPY="llvm-objcopy"
    8LD="lld"
    
    Распечатка 3: /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: /etc/portage/env/compiler-clang-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: /etc/portage/env/compiler-clang-mold-18

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
    

7 Ресурсы


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

Мои научные интересы включают физику, администрирование Unix и сетей.

Похожие