2a82bb8a90
Old toolchains, with old gcc that do not support -print-sysroot, break the kernel-headers version check script: it fails to find the sysroot of the toolchain, and thus ends up including the host's linux/version.h. Most of the time, this will break early, since the host's kernel headers will not match the toolchain settings. But it can happen that the check is succesful, although the configuration of the toolchain is wrong: - the custom toolchain has kernel headers vX.Y - the user selected vX.Z (Z!=Y) - the host has headers vX.Y In this case, the check passes OK, but the build of some packages later on will break (which is exactly what those _AT_LEAST_XXX options were added to avoid). Fix that by passing the sysroot to the check script, instead of the cross compiler. We get the sysroot as thus: - for custom toolchains, we use the macro toolchain_find_sysroot. We can do that, because we already have a complete sysroot with libc.a at that time. - for internal toolchain using a custom kernel headers version, we just use $(STAGING_DIR). We can't use the macro as for custom toolchains above, because at the time we install the kernel headers, we do not yet have a complete sysroot with a libc.a. But we can just use $(STAGING_DIR), since we're only interested in the kernel headers. For all other types of toolchains, we already have the _AT_LEAST_XXX options properly set, so we need not add a check in this case. Fixes: http://autobuild.buildroot.net/results/f33/f331a6eff0b0b93c73af52db3a6b43e4e598577e/ http://autobuild.buildroot.net/results/a57/a5797c025bec50c10efdcff74945aab4021d05e4/ [...] [Thanks to Thomas for pointing out the toolchain_find_sysroot macro!] Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
42 lines
1.1 KiB
Bash
Executable File
42 lines
1.1 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
SYSROOT="${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%%.*}"
|
|
|
|
EXEC="$(mktemp --tmpdir check-headers.XXXXXX)"
|
|
|
|
# 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 <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
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}
|