[oe] staging & using kernel headers

Michael Jones michael.jones at matrix-vision.de
Fri Mar 18 09:49:24 UTC 2011


Hello Koen & co.,

I recently bumped into a problem with recipes ti-dmai and gstreamer-ti
when they included the kernel headers.  These headers were staged by
kernel.bbclass sysroot_stage_all_append() with a lot of manual copying
and manipulating links and such, rather than using 'oe_runmake
headers_install'.  Back in October Koen explained this
(http://article.gmane.org/gmane.comp.handhelds.openembedded/37772) is
because some recipes use private kernel API.  The result of this with my
2.6.38 kernel is that I get a warning-turned-error from linux/types.h
that "Attempt to use kernel headers from user space".

ti-dmai_svn.bb hacks this (self-admittedly) by defining
_EXPORTED_HEADERS_ (commit d0184be13b4879e, also from Koen).  I had to
modify the recipe to enable the define to actually get passed as a
compile option.  For gstreamer-ti, there was no such hack in place, but
it was needed for the same reason.

I would think it is a common requirement for recipes to include kernel
headers, and this warning has been around since 2.6.32.  I got around it
with gstreamer-ti by installing the headers with headers_install into a
subdir of the headers directory set up currently by kernel.bbclass, and
pointing the gstreamer-ti recipe at that, but I'm not sure if there's a
better way.

If there are some recipes that need internal kernel sources staged for
them, then it seems to me that we need both sets of kernel headers: one
exported to userspace (with headers_install) and one that is not.
Right?  Can we agree on a standard place/manner for this?

Below is my patch to get gstreamer-ti working, for illustration.

-Michael

>From 71b3762ad5f6e7a8553a6b780296f7e994513f0b Mon Sep 17 00:00:00 2001
From: Michael Jones <michael.jones at matrix-vision.de>
Date: Thu, 17 Mar 2011 17:23:53 +0100
Subject: [PATCH] install kernel headers exported for userspace

kernel.bbclass already copies and manipulates kernel headers into
sysroot, but it doesn't export them properly using "make headers_install"
which leads to a compiler error/warning in linux/types.h:

"Attempt to use kernel headers from user space, see
http://kernelnewbies.org/KernelHeaders"

---
 classes/kernel.bbclass      |    5 +++++
 recipes/ti/gstreamer-ti.inc |    2 +-
 2 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/classes/kernel.bbclass b/classes/kernel.bbclass
index 422bcd7..6b46d51 100644
--- a/classes/kernel.bbclass
+++ b/classes/kernel.bbclass
@@ -210,6 +210,11 @@ sysroot_stage_all_append() {
 	[ -e Module.symvers ] && install -m 0644 Module.symvers $kerneldir/
 
 	cp -fR scripts $kerneldir/
+
+	# install kernel headers in the proper manner to export them
+	# for userspace programs
+	userspace_hdrs=${kerneldir}/userspace
+	oe_runmake headers_install INSTALL_HDR_PATH=${userspace_hdrs} ARCH=${ARCH}
 }
 
 kernel_do_configure() {
diff --git a/recipes/ti/gstreamer-ti.inc b/recipes/ti/gstreamer-ti.inc
index 905e192..04d990f 100644
--- a/recipes/ti/gstreamer-ti.inc
+++ b/recipes/ti/gstreamer-ti.inc
@@ -72,7 +72,7 @@ CPPFLAGS_append = " -DPlatform_${PLATFORM}"
 export ENCODE_COMBO    = "${installdir}/ti-codecs-server/encodeCombo.x64P"
 export DECODE_COMBO    = "${installdir}/ti-codecs-server/decodeCombo.x64P"
 # Makefile also expects to be able to find the kernel headers from the envirionment
-export LINUXKERNEL_INSTALL_DIR = "${STAGING_KERNEL_DIR}"
+export LINUXKERNEL_INSTALL_DIR = "${STAGING_KERNEL_DIR}/userspace"
 
 do_configure_prepend() {
 	# PSP kernel is based on older DSS. we need to replace linux/omapfb.h with mach/omapfb.h
-- 
1.7.4.1


MATRIX VISION GmbH, Talstrasse 16, DE-71570 Oppenweiler
Registergericht: Amtsgericht Stuttgart, HRB 271090
Geschaeftsfuehrer: Gerhard Thullner, Werner Armingeon, Uwe Furtner




More information about the Openembedded-devel mailing list