kbuild: compile-test exported headers to ensure they are self-contained
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Mon, 1 Jul 2019 00:58:40 +0000 (09:58 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Mon, 8 Jul 2019 14:13:57 +0000 (23:13 +0900)
commitd6fc9fcbaa655cff2d2be05e16867d1918f78b85
tree963ee9a8fa175e10b832aa6a5d724ae5acb1f5bd
parent1a927fd347ebb3c02046150ee489d4fe4e6b9e81
kbuild: compile-test exported headers to ensure they are self-contained

Multiple people have suggested compile-testing UAPI headers to ensure
they can be really included from user-space. "make headers_check" is
obviously not enough to catch bugs, and we often leak unresolved
references to user-space.

Use the new header-test-y syntax to implement it. Please note exported
headers are compile-tested with a completely different set of compiler
flags. The header search path is set to $(objtree)/usr/include since
exported headers should not include unexported ones.

We use -std=gnu89 for the kernel space since the kernel code highly
depends on GNU extensions. On the other hand, UAPI headers should be
written in more standardized C, so they are compiled with -std=c90.
This will emit errors if C++ style comments, the keyword 'inline', etc.
are used. Please use C style comments (/* ... */), '__inline__', etc.
in UAPI headers.

There is additional compiler requirement to enable this test because
many of UAPI headers include <stdlib.h>, <sys/ioctl.h>, <sys/time.h>,
etc. directly or indirectly. You cannot use kernel.org pre-built
toolchains [1] since they lack <stdlib.h>.

I reused CONFIG_CC_CAN_LINK to check the system header availability.
The intention is slightly different, but a compiler that can link
userspace programs provide system headers.

For now, a lot of headers need to be excluded because they cannot
be compiled standalone, but this is a good start point.

[1] https://mirrors.edge.kernel.org/pub/tools/crosstool/index.html

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Makefile
init/Kconfig
usr/.gitignore
usr/Makefile
usr/include/.gitignore [new file with mode: 0644]
usr/include/Makefile [new file with mode: 0644]