Skip to content

Commit a0123f5

Browse files
iavclaude
authored 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 c980f49 commit a0123f5

1 file changed

Lines changed: 27 additions & 1 deletion

File tree

lib/functions/compilation/kernel-debs.sh

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,12 +473,31 @@ 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"
479498
(
480499
cd "${headers_target_dir}" || exit 33
481-
find . -type f | grep -v -e "include/config/" -e "\.h$" -e ".c$" -e "Makefile$" -e "Kconfig$" -e "Kbuild$" -e "\.cocci$" | xargs file | grep -v -e "ASCII" -e "script text" -e "empty" -e "Unicode text" -e "symbolic link" -e "CSV text" -e "SAS 7+" || true
500+
find . -type f | grep -v -e "include/config/" -e "include/generated/\.armbian-build\.tar\.gz" -e "\.h$" -e ".c$" -e "Makefile$" -e "Kconfig$" -e "Kbuild$" -e "\.cocci$" | xargs file | grep -v -e "ASCII" -e "script text" -e "empty" -e "Unicode text" -e "symbolic link" -e "CSV text" -e "SAS 7+" || true
482501
)
483502
fi
484503

@@ -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)