Commit a5a30964 authored by Yann E. MORIN's avatar Yann E. MORIN Committed by Thomas Petazzoni
Browse files

toolchain/external: check kernel headers version for custom toolchain



Ensure the kernel headers version used in the custom external toolchain,
or the manually-specified kernel headers version, matches exactly the one
selected by the user.

We do not care about the patch-level, since headers are not supposed to
change between patchlevels. This applies only to kernels >= 3.0, but
those are actually the ones we do care about; we treat all 2.6.x kernels
as being a single version, since we do not support any 2.6 kernels for
packages with kernel-dependant features.

Signed-off-by: default avatar"Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Arnout Vandecappelle <arnout@mind.be>
Cc: Thomas De Schampheleire <patrickdepinguin@gmail.com>
Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
parent 88d0bca0
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
#!/bin/sh

CC="${1}"
# Make sure we have enough version components
HDR_VER="${2}.0.0"

HDR_M="${HDR_VER%%.*}"
HDR_V="${HDR_VER#*.}"
HDR_m="${HDR_V%%.*}"

# We do not want to account for the patch-level, since headers are
# not supposed to change for different patchlevels, so we mask it out.
# This only applies to kernels >= 3.0, but those are the only one
# we actually care about; we treat all 2.6.x kernels equally.

exec ${CC} -E -x c -o - - >/dev/null 2>&1 <<_EOF_
#include <linux/version.h>
#if (LINUX_VERSION_CODE & ~0xFF) != KERNEL_VERSION(${HDR_M},${HDR_m},0)
#error Incorrect kernel header version.
#endif
_EOF_
+13 −0
Original line number Diff line number Diff line
@@ -162,6 +162,19 @@ copy_toolchain_sysroot = \
	fi ; \
	find $(STAGING_DIR) -type d | xargs chmod 755

#
# Check the specified kernel headers version actually matches the
# version in the toolchain.
#
# $1: cross-gcc path
# $2: kernel version string, in the form: X.Y
#
check_kernel_headers_version = \
	if ! support/scripts/check-kernel-headers.sh $(1) $(2); then \
		echo "Incorrect selection of kernel headers"; \
	    exit 1; \
	fi

#
# Check the availability of a particular glibc feature. This function
# is used to check toolchain options that are always supported by
+20 −0
Original line number Diff line number Diff line
@@ -169,3 +169,23 @@ config BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_12
config BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_13
	bool
	select BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_12

# This order guarantees that the highest version is set, as kconfig
# stops affecting a value on the first matching default.
config BR2_TOOLCHAIN_HEADERS_AT_LEAST
	string
	default "3.13" if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_13
	default "3.12" if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_12
	default "3.11" if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_11
	default "3.10" if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_10
	default "3.9"  if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_9
	default "3.8"  if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_8
	default "3.7"  if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_7
	default "3.6"  if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_6
	default "3.5"  if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_5
	default "3.4"  if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_4
	default "3.3"  if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_3
	default "3.2"  if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_2
	default "3.1"  if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_1
	default "3.0"  if BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_0
	default "2.6"
+6 −1
Original line number Diff line number Diff line
@@ -412,7 +412,7 @@ endef
# Checks for an already installed toolchain: check the toolchain
# location, check that it supports sysroot, and then verify that it
# matches the configuration provided in Buildroot: ABI, C++ support,
# type of C library and all C library features.
# kernel headers version, type of C library and all C library features.
define TOOLCHAIN_EXTERNAL_CONFIGURE_CMDS
	$(Q)$(call check_cross_compiler_exists,$(TOOLCHAIN_EXTERNAL_CC))
	$(Q)$(call check_unusable_toolchain,$(TOOLCHAIN_EXTERNAL_CC))
@@ -421,6 +421,11 @@ define TOOLCHAIN_EXTERNAL_CONFIGURE_CMDS
		@echo "External toolchain doesn't support --sysroot. Cannot use." ; \
		exit 1 ; \
	fi ; \
	if [ "$(BR2_TOOLCHAIN_EXTERNAL_CUSTOM)" = "y" ]; then \
		$(call check_kernel_headers_version,\
			"$(TOOLCHAIN_EXTERNAL_CC) $(TOOLCHAIN_EXTERNAL_CFLAGS)",\
			$(call qstrip,$(BR2_TOOLCHAIN_HEADERS_AT_LEAST))); \
	fi ; \
	if test "$(BR2_arm)" = "y" ; then \
		$(call check_arm_abi,\
			"$(TOOLCHAIN_EXTERNAL_CC) $(TOOLCHAIN_EXTERNAL_CFLAGS)",\