how to properly "export" a new header file to user space?
Robert P. J. Day
rpjday at crashcourse.ca
Wed May 18 07:58:03 EDT 2016
just want to make i'm using the new UAPI infrastructure properly,
since i remember the old days of stuffing "header-y" all over the
place in Kbuild files.
say i want to add a new driver to the kernel, so i create the
directory /drivers/rday, and add some code and i create a header file,
"rday1.h", that will be used by both my kernel code *and* needs to be
included by user space code as well.
normally, i could just leave that header file in that directory, and
let the source file use:
#include "rday1.h"
but if i want that header file visible in user space, as i read it, i
can create a new directory at the top level of the kernel source:
include/uapi/rday/
inside of which i can place the file "rday1.h", which has the
following consequences.
first, given this code in the top-level Makefile:
# Use USERINCLUDE when you must reference the UAPI directories only.
USERINCLUDE := \
-I$(srctree)/arch/$(hdr-arch)/include/uapi \
-Iarch/$(hdr-arch)/include/generated/uapi \
-I$(srctree)/include/uapi \
-Iinclude/generated/uapi \
-include $(srctree)/include/linux/kconfig.h
# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
LINUXINCLUDE := \
-I$(srctree)/arch/$(hdr-arch)/include \
-Iarch/$(hdr-arch)/include/generated/uapi \
-Iarch/$(hdr-arch)/include/generated \
$(if $(KBUILD_SRC), -I$(srctree)/include) \
-Iinclude \
$(USERINCLUDE)
my own kernel code should now use the include directive:
#include <rday/rday1.h>
which should properly locate that header file. and, second, user space
code can use the same directive as long as i extend the user space
header file search path to include "<kernel-source-tree/include/uapi",
correct?
am i thinking about this the right way? i'm using the model under
drivers/mtd, where one sees examples like:
nand/fsmc_nand.c:#include <mtd/mtd-abi.h>
ubi/cdev.c:#include <mtd/ubi-user.h>
with directory contents:
$ tree include/uapi/mtd
include/uapi/mtd
├── inftl-user.h
├── Kbuild
├── mtd-abi.h
├── mtd-user.h
├── nftl-user.h
└── ubi-user.h
$
i also note that include/uapi/mtd includes header files meant to be
included *only* from user space, such as mtd-user.h, which is fine.
so is this the correct approach? or am i missing something easier?
rday
p.s. i also note the Kbuild file "include/uapi/mtd/Kbuild", for use if
i want to export those headers with:
$ make headers_install
but if i don't want to export my own header files that way, i see no
need to add a Kbuild file, at least not for the moment. thoughts?
--
========================================================================
Robert P. J. Day Ottawa, Ontario, CANADA
http://crashcourse.ca
Twitter: http://twitter.com/rpjday
LinkedIn: http://ca.linkedin.com/in/rpjday
========================================================================
More information about the Kernelnewbies
mailing list