diff --git a/support/scripts/check-kernel-headers.sh b/support/scripts/check-kernel-headers.sh index d7fe7d4bc2..b511a086c1 100755 --- a/support/scripts/check-kernel-headers.sh +++ b/support/scripts/check-kernel-headers.sh @@ -8,14 +8,43 @@ HDR_M="${HDR_VER%%.*}" HDR_V="${HDR_VER#*.}" HDR_m="${HDR_V%%.*}" +EXEC="/tmp/br.check-headers.$(uuidgen)" + +# By the time we get here, we do not always have the staging-dir +# already populated (think external toolchain), so we can not use +# it. +# So we just ask the cross compiler what its default sysroot is. +# For multilib-aware toolchains where we should use a non-default +# sysroot, it's not really a problem since the version of the kernel +# headers is the same for all sysroots. +SYSROOT=$(${CC} -print-sysroot) + # 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. +${HOSTCC} -imacros "${SYSROOT}/usr/include/linux/version.h" \ + -x c -o "${EXEC}" - <<_EOF_ +#include +#include -exec ${CC} -E -x c -o - - >/dev/null 2>&1 <<_EOF_ -#include -#if (LINUX_VERSION_CODE & ~0xFF) != KERNEL_VERSION(${HDR_M},${HDR_m},0) -#error Incorrect kernel header version. -#endif +int main(int argc __attribute__((unused)), + char** argv __attribute__((unused))) +{ + if((LINUX_VERSION_CODE & ~0xFF) + != KERNEL_VERSION(${HDR_M},${HDR_m},0)) + { + printf("Incorrect selection of kernel headers: "); + printf("expected %d.%d.x, got %d.%d.x\n", ${HDR_M}, ${HDR_m}, + ((LINUX_VERSION_CODE>>16) & 0xFF), + ((LINUX_VERSION_CODE>>8) & 0xFF)); + return 1; + } + return 0; +} _EOF_ + +"${EXEC}" +ret=${?} +rm -f "${EXEC}" +exit ${ret} diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk index 64d50951b5..68759163e6 100644 --- a/toolchain/helpers.mk +++ b/toolchain/helpers.mk @@ -171,8 +171,7 @@ copy_toolchain_sysroot = \ # check_kernel_headers_version = \ if ! support/scripts/check-kernel-headers.sh $(1) $(2); then \ - echo "Incorrect selection of kernel headers"; \ - exit 1; \ + exit 1; \ fi #