Skip to content

Commit

Permalink
toolchain: allow using custom headers newer than latest known ones
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Vincent Fazio <[email protected]>
[[email protected]:
  - only do a loose check for the latest version
  - expand commit log
]
Signed-off-by: Yann E. MORIN <[email protected]>
Cc: Thomas Petazzoni <[email protected]>
Tested-by: Vincent Fazio <[email protected]>
Signed-off-by: Peter Korsgaard <[email protected]>
  • Loading branch information
vfazio authored and jacmet committed Feb 8, 2020
1 parent fbe18eb commit 338e62b
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 9 deletions.
5 changes: 4 additions & 1 deletion package/linux-headers/Config.in.host
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,11 @@ choice
This is used to hide/show some packages that have strict
requirements on the version of kernel headers.

If your kernel headers are more recent than the latest version
in the choice, then select the latest version.

config BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_5_4
bool "5.4.x"
bool "5.4.x or later"
select BR2_TOOLCHAIN_HEADERS_AT_LEAST_5_4

config BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_5_3
Expand Down
5 changes: 4 additions & 1 deletion package/linux-headers/linux-headers.mk
Original file line number Diff line number Diff line change
Expand Up @@ -136,11 +136,14 @@ define LINUX_HEADERS_INSTALL_STAGING_CMDS
endef

ifeq ($(BR2_KERNEL_HEADERS_VERSION)$(BR2_KERNEL_HEADERS_AS_KERNEL)$(BR2_KERNEL_HEADERS_CUSTOM_TARBALL)$(BR2_KERNEL_HEADERS_CUSTOM_GIT),y)
# In this case, we must always do a 'loose' test, because they are all
# custom versions which may be later than what we know right now.
define LINUX_HEADERS_CHECK_VERSION
$(call check_kernel_headers_version,\
$(BUILD_DIR),\
$(STAGING_DIR),\
$(call qstrip,$(BR2_TOOLCHAIN_HEADERS_AT_LEAST)))
$(call qstrip,$(BR2_TOOLCHAIN_HEADERS_AT_LEAST)),\
loose)
endef
LINUX_HEADERS_POST_INSTALL_STAGING_HOOKS += LINUX_HEADERS_CHECK_VERSION
endif
Expand Down
28 changes: 24 additions & 4 deletions support/scripts/check-kernel-headers.sh
Original file line number Diff line number Diff line change
@@ -1,9 +1,25 @@
#!/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#*.}"
Expand All @@ -28,20 +44,24 @@ ${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)))
{
if((LINUX_VERSION_CODE & ~0xFF)
!= KERNEL_VERSION(${HDR_M},${HDR_m},0))
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));
return 1;
ret = ((l >= h) && !strcmp("${CHECK}", "loose")) ? 0 : 1;
}
return 0;
return ret;
}
_EOF_

Expand Down
8 changes: 8 additions & 0 deletions toolchain/Config.in
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,14 @@ config BR2_TOOLCHAIN_HEADERS_AT_LEAST_5_3
config BR2_TOOLCHAIN_HEADERS_AT_LEAST_5_4
bool
select BR2_TOOLCHAIN_HEADERS_AT_LEAST_5_3
select BR2_TOOLCHAIN_HEADERS_LATEST

# This should be selected by the latest version, above, to indicate that
# Buildroot does not know of more recent headers than the ones selected.
# This allows using toolchains with headers more recent than Buildroot
# knows about, while still enforcing strict check for older headers.
config BR2_TOOLCHAIN_HEADERS_LATEST
bool

# This order guarantees that the highest version is set, as kconfig
# stops affecting a value on the first matching default.
Expand Down
6 changes: 5 additions & 1 deletion toolchain/helpers.mk
Original file line number Diff line number Diff line change
Expand Up @@ -161,9 +161,13 @@ copy_toolchain_sysroot = \
# $1: build directory
# $2: sysroot directory
# $3: kernel version string, in the form: X.Y
# $4: test to do for the latest kernel version, 'strict' or 'loose'
# always 'strict' if this is not the latest version.
#
check_kernel_headers_version = \
if ! support/scripts/check-kernel-headers.sh $(1) $(2) $(3); then \
if ! support/scripts/check-kernel-headers.sh $(1) $(2) $(3) \
$(if $(BR2_TOOLCHAIN_HEADERS_LATEST),$(4),strict); \
then \
exit 1; \
fi

Expand Down
3 changes: 2 additions & 1 deletion toolchain/toolchain-external/pkg-toolchain-external.mk
Original file line number Diff line number Diff line change
Expand Up @@ -542,7 +542,8 @@ define $(2)_CONFIGURE_CMDS
$$(call check_kernel_headers_version,\
$$(BUILD_DIR)\
$$(call toolchain_find_sysroot,$$(TOOLCHAIN_EXTERNAL_CC)),\
$$(call qstrip,$$(BR2_TOOLCHAIN_HEADERS_AT_LEAST))); \
$$(call qstrip,$$(BR2_TOOLCHAIN_HEADERS_AT_LEAST)),\
$$(if $$(BR2_TOOLCHAIN_EXTERNAL_CUSTOM),loose,strict)); \
$$(call check_gcc_version,$$(TOOLCHAIN_EXTERNAL_CC),\
$$(call qstrip,$$(BR2_TOOLCHAIN_GCC_AT_LEAST))); \
if test "$$(BR2_arm)" = "y" ; then \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,11 @@ choice
m = ( LINUX_VERSION_CODE >> 8 ) & 0xFF
p = ( LINUX_VERSION_CODE >> 0 ) & 0xFF

If your toolchain uses headers newer than the latest version
in the choice, then select the latest version.

config BR2_TOOLCHAIN_EXTERNAL_HEADERS_5_4
bool "5.4.x"
bool "5.4.x or later"
select BR2_TOOLCHAIN_HEADERS_AT_LEAST_5_4

config BR2_TOOLCHAIN_EXTERNAL_HEADERS_5_3
Expand Down

0 comments on commit 338e62b

Please sign in to comment.