Skip to content

Commit 59a3ab7

Browse files
iavclaude
andcommitted
fix(kernel-headers): preserve build-time autoconf.h across postinst olddefconfig (#9425)
При упаковке linux-headers скомпилированные бинарники из scripts/ удаляются, так как они собраны под хост сборки, а не под целевую машину (типичный случай кросс-сборки). Поэтому postinst при установке пакета пересобирает их нативно, предварительно запустив `make olddefconfig`. Однако olddefconfig не только подготавливает окружение — он заново вычисляет конфигурацию ядра, проверяя тулчейн, доступный на целевом хосте при установке. Если инструменты, использовавшиеся при сборке ядра, на целевой машине отсутствуют или имеют другую версию, olddefconfig молча отключает соответствующие CONFIG_* опции (например, CONFIG_CC_IS_CLANG, CONFIG_LTO_CLANG, CONFIG_DEBUG_INFO_BTF). В результате установленный пакет заголовков описывает не то ядро, которое реально собрано и работает, а то, которое можно было бы собрать на данном хосте. Это затрагивает: - include/generated/autoconf.h (используется препроцессором C) - include/config/auto.conf + маркер-файлы include/config/ (используются make-правилами kbuild) - include/generated/rustc_cfg (используется Rust-сборками) Все эти файлы — артефакты сборки и должны описывать скомпилированное ядро, а не возможности хоста установки. Исправление: при упаковке сохраняем сайдкар-тарбол с build-time версиями include/config/ и include/generated/{autoconf.h,rustc_cfg}; восстанавливаем его в postinst в самом конце, после всех make-шагов. Fixes: #9425 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 77f919f commit 59a3ab7

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

lib/functions/compilation/kernel-debs.sh

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,25 @@ function kernel_package_callback_linux_headers() {
473473
[[ -f "${kernel_work_dir}/scripts/module.lds" ]] &&
474474
run_host_command_logged cp -v "${kernel_work_dir}/scripts/module.lds" "${headers_target_dir}/scripts/module.lds"
475475

476+
# Preserve build-time kernel config as a sidecar tarball.
477+
# postinst runs `make olddefconfig` which re-evaluates toolchain availability on the target host
478+
# and may silently disable CONFIG_* options that were active at kernel build time
479+
# (e.g. CONFIG_CC_IS_CLANG, CONFIG_LTO_CLANG, CONFIG_DEBUG_INFO_BTF).
480+
# This affects both include/generated/autoconf.h (used by the C preprocessor) and
481+
# include/config/auto.conf + include/config/ marker files (used by kbuild make rules), as well as
482+
# include/generated/rustc_cfg (used by Rust builds).
483+
# All of these are build artifacts and must describe the compiled kernel, not the target host.
484+
# See: https://github.com/armbian/build/issues/9425
485+
if [[ -f "${kernel_work_dir}/include/config/auto.conf" ]]; then
486+
run_host_command_logged mkdir -p "${headers_target_dir}/include/generated"
487+
local _sidecar_paths=("include/config")
488+
[[ -f "${kernel_work_dir}/include/generated/autoconf.h" ]] && _sidecar_paths+=("include/generated/autoconf.h")
489+
[[ -f "${kernel_work_dir}/include/generated/rustc_cfg" ]] && _sidecar_paths+=("include/generated/rustc_cfg")
490+
run_host_command_logged tar -C "${kernel_work_dir}" -czf \
491+
"${headers_target_dir}/include/generated/.armbian-build.tar.gz" \
492+
"${_sidecar_paths[@]}"
493+
fi
494+
476495
if [[ "${DEBUG}" == "yes" ]]; then
477496
# Check that no binaries are included by now. Expensive... @TODO: remove after me make sure.
478497
display_alert "Checking for binaries in kernel headers" "${headers_target_dir}" "debug"
@@ -545,6 +564,7 @@ function kernel_package_callback_linux_headers() {
545564
546565
# make ARCH="${SRC_ARCH}" -j\$NCPU modules_prepare # depends on too much other stuff.
547566
echo "Done compiling kernel-headers (${kernel_version_family})."
567+
548568
EOT_POSTINST
549569
550570
if [[ "${ARCH}" == "amd64" ]]; then # This really only works on x86/amd64; @TODO revisit later
@@ -557,6 +577,12 @@ function kernel_package_callback_linux_headers() {
557577
558578
cat <<- EOT_POSTINST_FINISH
559579
echo "Done compiling kernel-headers tools (${kernel_version_family})."
580+
581+
# Restore build-time config after all make steps. See: https://github.com/armbian/build/issues/9425
582+
if [[ -f include/generated/.armbian-build.tar.gz ]]; then
583+
tar -C . -xzf include/generated/.armbian-build.tar.gz
584+
rm -f include/generated/.armbian-build.tar.gz
585+
fi
560586
EOT_POSTINST_FINISH
561587
)
562588
}

0 commit comments

Comments
 (0)