Buildroot Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [[RFC]] toolchain: print actual version of kernel headers when checking
@ 2014-03-30 12:59 Yann E. MORIN
  2014-03-30 13:10 ` Yann E. MORIN
  2014-04-06 12:28 ` Thomas Petazzoni
  0 siblings, 2 replies; 4+ messages in thread
From: Yann E. MORIN @ 2014-03-30 12:59 UTC (permalink / raw)
  To: buildroot

From: "Yann E. MORIN" <yann.morin.1998@free.fr>

Reported-by: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 support/scripts/check-kernel-headers.sh | 39 ++++++++++++++++++++++++++++-----
 toolchain/helpers.mk                    |  3 +--
 2 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/support/scripts/check-kernel-headers.sh b/support/scripts/check-kernel-headers.sh
index d7fe7d4..2b4ee36 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 <stdio.h>
+#include <stdlib.h>
 
-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
+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:\n" );
+        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 64d5095..6875916 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
 
 #
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [Buildroot] [[RFC]] toolchain: print actual version of kernel headers when checking
  2014-03-30 12:59 [Buildroot] [[RFC]] toolchain: print actual version of kernel headers when checking Yann E. MORIN
@ 2014-03-30 13:10 ` Yann E. MORIN
  2014-04-06 12:28 ` Thomas Petazzoni
  1 sibling, 0 replies; 4+ messages in thread
From: Yann E. MORIN @ 2014-03-30 13:10 UTC (permalink / raw)
  To: buildroot

Hello All!

On 2014-03-30 14:59 +0200, Yann E. MORIN spake thusly:
> From: "Yann E. MORIN" <yann.morin.1998@free.fr>

It just occured to me I forgot to explain in the commit log what this
was for. So here are the explanations:

Since we introduced the _AT_LEAST_XXX for the kernel headers, people
using pre-built custom toolchain now have to specify the version of
the kernel headers their custom toolchain uses.

So, when we detect that there is a mismatch between the selection in
the menuconfig, and the actual version of the headers, we currently
only bail out with a terse message "Incorrect selection of kernel
headers".

This could be confusing some, and getting the version of the headers
used by the toolchain is not trivial (well, it's very easy, but not
trivial.)

This patch changes the way we report the error by moving the message
into the test-code, and by printing the expected and actual versions
of the kernel headers.

BUT! To get this pretty error message, we need to run the test-program,
so we can not use the cross-toolchain, we have to use the native one.

BUT! The native one has its own linux/version.h header, so we can not
simply include it.

So, we ask the cross-compiler where its default sysroot is, and use that
to then force-feed the cross linux/version.h to the native toolchain.


This is only an RFC for now, as I am not very happy with how I got the
sysroot of the compiler. If there is a better way, I'm all ears and
eyes.

Regards,
Yann E. MORIN.


> Reported-by: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
> Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
> Cc: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> ---
>  support/scripts/check-kernel-headers.sh | 39 ++++++++++++++++++++++++++++-----
>  toolchain/helpers.mk                    |  3 +--
>  2 files changed, 35 insertions(+), 7 deletions(-)
> 
> diff --git a/support/scripts/check-kernel-headers.sh b/support/scripts/check-kernel-headers.sh
> index d7fe7d4..2b4ee36 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 <stdio.h>
> +#include <stdlib.h>
>  
> -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
> +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:\n" );
> +        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 64d5095..6875916 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
>  
>  #
> -- 
> 1.8.3.2
> 

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Buildroot] [[RFC]] toolchain: print actual version of kernel headers when checking
  2014-03-30 12:59 [Buildroot] [[RFC]] toolchain: print actual version of kernel headers when checking Yann E. MORIN
  2014-03-30 13:10 ` Yann E. MORIN
@ 2014-04-06 12:28 ` Thomas Petazzoni
  2014-04-06 14:13   ` Yann E. MORIN
  1 sibling, 1 reply; 4+ messages in thread
From: Thomas Petazzoni @ 2014-04-06 12:28 UTC (permalink / raw)
  To: buildroot

Dear Yann E. MORIN,

On Sun, 30 Mar 2014 14:59:30 +0200, Yann E. MORIN wrote:
> From: "Yann E. MORIN" <yann.morin.1998@free.fr>
> 
> Reported-by: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
> Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
> Cc: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> ---
>  support/scripts/check-kernel-headers.sh | 39 ++++++++++++++++++++++++++++-----
>  toolchain/helpers.mk                    |  3 +--
>  2 files changed, 35 insertions(+), 7 deletions(-)

I've applied the patch with the following changes:

 * Modified the commit log to add the message you suggested.

 * Fix the coding style: no space after opening parenthesis, no space
   before closing parenthesis.

 * Adjust the error message so that it fits on one line, which I
   believe is clearer.

Also, I'm not entirely sure about the usage of $(uuidgen). Should we use
mktemp instead?

Thomas
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Buildroot] [[RFC]] toolchain: print actual version of kernel headers when checking
  2014-04-06 12:28 ` Thomas Petazzoni
@ 2014-04-06 14:13   ` Yann E. MORIN
  0 siblings, 0 replies; 4+ messages in thread
From: Yann E. MORIN @ 2014-04-06 14:13 UTC (permalink / raw)
  To: buildroot

Thomas, All,

On 2014-04-06 14:28 +0200, Thomas Petazzoni spake thusly:
> On Sun, 30 Mar 2014 14:59:30 +0200, Yann E. MORIN wrote:
> > From: "Yann E. MORIN" <yann.morin.1998@free.fr>
> > 
> > Reported-by: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
> > Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
> > Cc: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
> > Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> > ---
> >  support/scripts/check-kernel-headers.sh | 39 ++++++++++++++++++++++++++++-----
> >  toolchain/helpers.mk                    |  3 +--
> >  2 files changed, 35 insertions(+), 7 deletions(-)
> 
> I've applied the patch with the following changes:
[--SNIP--]
> Also, I'm not entirely sure about the usage of $(uuidgen). Should we use
> mktemp instead?

Oh, probably, yes. I initially tossed that patch after Maxime enticed me
into it, so I just throw at it whatever was needed to make it work, and
then tried to clean it up.

The uuidgen part I missed when cleaning the patch.

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-04-06 14:13 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-30 12:59 [Buildroot] [[RFC]] toolchain: print actual version of kernel headers when checking Yann E. MORIN
2014-03-30 13:10 ` Yann E. MORIN
2014-04-06 12:28 ` Thomas Petazzoni
2014-04-06 14:13   ` Yann E. MORIN

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox