--- /dev/null
+#!/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_
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
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"
# 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))
@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)",\