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

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

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

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

4.1.2 Настройка portage

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

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"
    
    Распечатка 7: /etc/portage/make.conf

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:
     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"
    
    Распечатка 8: /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"
    
    Распечатка 9: /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"
    
    Распечатка 10: /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"
Распечатка 11: /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"
Распечатка 12: /etc/portage/env/compiler-clang-mold-18

4.3.6 clang + binutils

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

7 Ресурсы

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