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"
     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:
     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:
     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"
    
    Распечатка 2: /etc/portage/env/compiler-clang-no-lto

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"
Распечатка 3: /etc/portage/env/compiler-clang-mold

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"
Распечатка 4: /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 и сетей.

Похожие