mirror of
https://github.com/godotengine/buildroot.git
synced 2026-01-04 06:10:16 +03:00
When Buildroot is released, it knows up to a certain kernel header version, and no later. However, it is possible that an external toolchain will be used, that uses headers newer than the latest version Buildroot knows about. This may also happen when testing a development, an rc-class, or a newly released kernel, either in an external toolchain, or with an internal toolchain with custom headers (same-as-kernel, custom version, custom git, custom tarball). In the current state, Buildroot would refuse to use such toolchains, because the test is for strict equality. We'd like to make that situation possible, but we also want the user not to be lenient at the same time, and select the right headers version when it is known. So, we add a new Kconfig blind option that the latest kernel headers version selects. This options is then used to decide whether we do a strict or loose check of the kernel headers. Suggested-by: Aaron Sierra <asierra@xes-inc.com> Signed-off-by: Vincent Fazio <vfazio@xes-inc.com> [yann.morin.1998@free.fr: - only do a loose check for the latest version - expand commit log ] Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Tested-by: Vincent Fazio <vfazio@xes-inc.com> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
69 lines
2.1 KiB
Bash
Executable File
69 lines
2.1 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# This script (and the embedded C code) will check that the actual
|
|
# headers version match the user told us they were:
|
|
#
|
|
# - if both versions are the same, all is well.
|
|
#
|
|
# - if the actual headers are older than the user told us, this is
|
|
# an error.
|
|
#
|
|
# - if the actual headers are more recent than the user told us, and
|
|
# we are doing a strict check, then this is an error.
|
|
#
|
|
# - if the actual headers are more recent than the user told us, and
|
|
# we are doing a loose check, then a warning is printed, but this is
|
|
# not an error.
|
|
|
|
BUILDDIR="${1}"
|
|
SYSROOT="${2}"
|
|
# Make sure we have enough version components
|
|
HDR_VER="${3}.0.0"
|
|
CHECK="${4}" # 'strict' or 'loose'
|
|
|
|
HDR_M="${HDR_VER%%.*}"
|
|
HDR_V="${HDR_VER#*.}"
|
|
HDR_m="${HDR_V%%.*}"
|
|
|
|
# Exit on any error, so we don't try to run an unexisting program if the
|
|
# compilation fails.
|
|
set -e
|
|
|
|
# Set the clean-up trap in advance to prevent a race condition in which we
|
|
# create the file but get a SIGTERM before setting it. Notice that we don't
|
|
# need to care about EXEC being empty, since 'rm -f ""' does nothing.
|
|
trap 'rm -f "${EXEC}"' EXIT
|
|
|
|
EXEC="$(mktemp -p "${BUILDDIR}" -t .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>
|
|
#include <string.h>
|
|
|
|
int main(int argc __attribute__((unused)),
|
|
char** argv __attribute__((unused)))
|
|
{
|
|
int ret = 0;
|
|
int l = LINUX_VERSION_CODE & ~0xFF;
|
|
int h = KERNEL_VERSION(${HDR_M},${HDR_m},0);
|
|
|
|
if(l != h)
|
|
{
|
|
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));
|
|
ret = ((l >= h) && !strcmp("${CHECK}", "loose")) ? 0 : 1;
|
|
}
|
|
return ret;
|
|
}
|
|
_EOF_
|
|
|
|
"${EXEC}"
|