В общем и целом ядро собирается с минимальными правками исходного .spec: - необходимо указать версию llvm, если используется отличная от версии по-умолчанию - необходимо выставить переменную ALTWRAP_LLVM_VERSION=%{llvm_version} в %build если используется версия llvm, отличная от версии по умолчанию - необходимо выставить переменную LLVM=1 в %build перед сборкой ядра - в сборочные зависимости требуется clang, llvm-devel и lld + обновленные elfutils (см. https://bugzilla.altlinux.org/59221). Для сборки модулей как минимум нужны следующие действия - сборочные зависимости должны автоматически подтянуть clang, llvm-devel и lld нужных версий. - в %build должны быть определены переменные LLVM или CC/LD/OBJDUMP (заметил при сборке модулей nvidia). Как это делать вопрос открытый, для сборочных зависимостей можно просто расширить макрос setup_kernel_module() добавив туда проверку на включение clang'а: @@ -172,7 +173,8 @@ done \ %{?!kepoch: %global kepoch %nil} \ %{?!kversion: %global kversion %nil} \ %{?!krelease: %global krelease %nil} \ - %setup_kernel_module_from_globals + %setup_kernel_module_from_globals \ + %setup_llvm_packages %setup_kernel_module_from_globals() \ %global kbuildrelease %( a="%{krelease}"; echo "${a#alt}") \ %global kcode %_kernel_version_code %kversion \ @@ -183,6 +185,19 @@ BuildRequires: kernel-headers-modules-%kflavour = %{?kepoch}%kversion-%krelease # For writing Requires in modules: %requires_kimage %{?kimage:Requires(pre,postun): %kimage} +%setup_llvm_packages() \ +%{?!_with_clang: %global _with_clang %nil} \ +%{?!llvm_version: %global llvm_version %nil} \ +%{?_with_clang:BuildRequires: llvm%{llvm_version} lld%{llvm_version}} (версия llvm_version может выставлена где-то глобально) для %build сложнее, тут либо нужно переопределить %make_build либо сделать отдельный макрос где выставляются все нужные переменные: +%setup_llvm_env() \ +%{?_with_clang:\ +export ALTWRAP_LLVM_VERSION=%{llvm_version} \ +export LLVM=1 \ +export CC=clang \ +export LD=ld.lld \ +export OBJDUMP=llvm-objdump}
Интересно. По поводу реализации у меня есть такая мысль. С древних времён (это есть в каком-то виде в SRPM-ках из 2004го) в kernel-image*.spec есть возможность задать версию GCC для сборки через макрос %kgcc_version. Чтобы это работало - kernel-headers-modules-%flavour получают зависимость на gcc%kgcc_version - в основном Makefile значение CC по умолчанию заменятеся с gcc на gcc-%kversion[1] [1] https://git.altlinux.org/people/kernelbot/packages/kernel-image.git?a=blob;f=kernel-image.spec;h=d7e806adf1b44b4402b1f129a61053bd17173d24#l285 Поскольку для сборки модулей нужно поставить kernel-headers-modules-%flavour, gcc нужной версии попадает в сборочное окружение. Поскольку все адекватные модули так или иначе пользуются /usr/src/linux-[...]/Makefile, для них оказывается выставлен по умолчанию нужный СС. Как будто можно пойти по такому же пути при сборке с помощью LLVM: - добавить сборочные зависимости на clang, llvm-devel и lld нужных версий к ядру - добавить обычные (runtime) зависимости на clang, llvm-devel и lld нужных версий в kernel-headers-modules-%flavour - где-нибудь в начале Makefile дописать `LLVM ?= -%{llvm_version}`. По идее, такое значение попадёт в LLVM_SUFFIX[2] и этого должно быть достаточно чтобы и ядро, и модули использовали для сборки именно LLVM, причём нужной версии и в обход wrapper'а[3]. [2] https://git.altlinux.org/people/kernelbot/packages/kernel-image.git?a=blob;f=Makefile;h=f3bacdc021a426588a34b3db6cb705568ab3ad79#l427 [3] https://git.altlinux.org/people/kernelbot/packages/kernel-image.git?p=kernel-image.git;a=blob;f=Makefile;h=f3bacdc021a426588a34b3db6cb705568ab3ad79#l486