summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMasahiro Yamada <yamada.masahiro@socionext.com>2019-06-30 20:58:40 -0400
committerMasahiro Yamada <yamada.masahiro@socionext.com>2019-07-08 10:13:57 -0400
commitd6fc9fcbaa655cff2d2be05e16867d1918f78b85 (patch)
tree963ee9a8fa175e10b832aa6a5d724ae5acb1f5bd
parent1a927fd347ebb3c02046150ee489d4fe4e6b9e81 (diff)
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>
-rw-r--r--Makefile2
-rw-r--r--init/Kconfig10
-rw-r--r--usr/.gitignore1
-rw-r--r--usr/Makefile2
-rw-r--r--usr/include/.gitignore3
-rw-r--r--usr/include/Makefile132
6 files changed, 148 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index eb850190b951..fca827bc3f77 100644
--- a/Makefile
+++ b/Makefile
@@ -1378,7 +1378,7 @@ CLEAN_DIRS += $(MODVERDIR) include/ksym
1378CLEAN_FILES += modules.builtin.modinfo 1378CLEAN_FILES += modules.builtin.modinfo
1379 1379
1380# Directories & files removed with 'make mrproper' 1380# Directories & files removed with 'make mrproper'
1381MRPROPER_DIRS += include/config usr/include include/generated \ 1381MRPROPER_DIRS += include/config include/generated \
1382 arch/$(SRCARCH)/include/generated .tmp_objdiff 1382 arch/$(SRCARCH)/include/generated .tmp_objdiff
1383MRPROPER_FILES += .config .config.old .version \ 1383MRPROPER_FILES += .config .config.old .version \
1384 Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \ 1384 Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
diff --git a/init/Kconfig b/init/Kconfig
index 2e9813daa2c1..74192de8ada6 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -108,6 +108,16 @@ config HEADER_TEST
108 If you are a developer or tester and want to ensure the requested 108 If you are a developer or tester and want to ensure the requested
109 headers are self-contained, say Y here. Otherwise, choose N. 109 headers are self-contained, say Y here. Otherwise, choose N.
110 110
111config UAPI_HEADER_TEST
112 bool "Compile test UAPI headers"
113 depends on HEADER_TEST && HEADERS_INSTALL && CC_CAN_LINK
114 help
115 Compile test headers exported to user-space to ensure they are
116 self-contained, i.e. compilable as standalone units.
117
118 If you are a developer or tester and want to ensure the exported
119 headers are self-contained, say Y here. Otherwise, choose N.
120
111config LOCALVERSION 121config LOCALVERSION
112 string "Local version - append to kernel release" 122 string "Local version - append to kernel release"
113 help 123 help
diff --git a/usr/.gitignore b/usr/.gitignore
index 8e48117a3f3d..be5eae1df7eb 100644
--- a/usr/.gitignore
+++ b/usr/.gitignore
@@ -7,4 +7,3 @@ initramfs_data.cpio.gz
7initramfs_data.cpio.bz2 7initramfs_data.cpio.bz2
8initramfs_data.cpio.lzma 8initramfs_data.cpio.lzma
9initramfs_list 9initramfs_list
10include
diff --git a/usr/Makefile b/usr/Makefile
index 4a70ae43c9cb..6a89eb019275 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -56,3 +56,5 @@ $(deps_initramfs): klibcdirs
56$(obj)/$(datafile_y): $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs 56$(obj)/$(datafile_y): $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs
57 $(Q)$(initramfs) -l $(ramfs-input) > $(obj)/$(datafile_d_y) 57 $(Q)$(initramfs) -l $(ramfs-input) > $(obj)/$(datafile_d_y)
58 $(call if_changed,initfs) 58 $(call if_changed,initfs)
59
60subdir-$(CONFIG_UAPI_HEADER_TEST) += include
diff --git a/usr/include/.gitignore b/usr/include/.gitignore
new file mode 100644
index 000000000000..a0991ff4402b
--- /dev/null
+++ b/usr/include/.gitignore
@@ -0,0 +1,3 @@
1*
2!.gitignore
3!Makefile
diff --git a/usr/include/Makefile b/usr/include/Makefile
new file mode 100644
index 000000000000..cd8daa20d487
--- /dev/null
+++ b/usr/include/Makefile
@@ -0,0 +1,132 @@
1# SPDX-License-Identifier: GPL-2.0-only
2
3# Unlike the kernel space, exported headers are written in standard C.
4# - Forbid C++ style comments
5# - Use '__inline__', '__asm__' instead of 'inline', 'asm'
6#
7# -std=c90 (equivalent to -ansi) catches the violation of those.
8# We cannot go as far as adding -Wpedantic since it emits too many warnings.
9UAPI_CFLAGS := -std=c90 -Wall -Werror=implicit-function-declaration
10
11override c_flags = $(UAPI_CFLAGS) -Wp,-MD,$(depfile) -I$(objtree)/usr/include
12
13# The following are excluded for now because they fail to build.
14#
15# Do not add a new header to the blacklist without legitimate reason.
16# Please consider to fix the header first.
17#
18# Sorted alphabetically.
19header-test- += asm/ipcbuf.h
20header-test- += asm/msgbuf.h
21header-test- += asm/sembuf.h
22header-test- += asm/shmbuf.h
23header-test- += asm/signal.h
24header-test- += asm/ucontext.h
25header-test- += drm/vmwgfx_drm.h
26header-test- += linux/am437x-vpfe.h
27header-test- += linux/android/binder.h
28header-test- += linux/android/binderfs.h
29header-test-$(CONFIG_CPU_BIG_ENDIAN) += linux/byteorder/big_endian.h
30header-test-$(CONFIG_CPU_LITTLE_ENDIAN) += linux/byteorder/little_endian.h
31header-test- += linux/coda.h
32header-test- += linux/coda_psdev.h
33header-test- += linux/dvb/audio.h
34header-test- += linux/dvb/osd.h
35header-test- += linux/elfcore.h
36header-test- += linux/errqueue.h
37header-test- += linux/fsmap.h
38header-test- += linux/hdlc/ioctl.h
39header-test- += linux/ivtv.h
40header-test- += linux/jffs2.h
41header-test- += linux/kexec.h
42header-test- += linux/matroxfb.h
43header-test- += linux/netfilter_bridge/ebtables.h
44header-test- += linux/netfilter_ipv4/ipt_LOG.h
45header-test- += linux/netfilter_ipv6/ip6t_LOG.h
46header-test- += linux/nfc.h
47header-test- += linux/nilfs2_ondisk.h
48header-test- += linux/omap3isp.h
49header-test- += linux/omapfb.h
50header-test- += linux/patchkey.h
51header-test- += linux/phonet.h
52header-test- += linux/reiserfs_xattr.h
53header-test- += linux/scc.h
54header-test- += linux/sctp.h
55header-test- += linux/signal.h
56header-test- += linux/sysctl.h
57header-test- += linux/usb/audio.h
58header-test- += linux/v4l2-mediabus.h
59header-test- += linux/v4l2-subdev.h
60header-test- += linux/videodev2.h
61header-test- += linux/vm_sockets.h
62header-test- += misc/ocxl.h
63header-test- += mtd/mtd-abi.h
64header-test- += mtd/mtd-user.h
65header-test- += scsi/scsi_bsg_fc.h
66header-test- += scsi/scsi_netlink.h
67header-test- += scsi/scsi_netlink_fc.h
68header-test- += sound/asequencer.h
69header-test- += sound/asoc.h
70header-test- += sound/asound.h
71header-test- += sound/compress_offload.h
72header-test- += sound/emu10k1.h
73header-test- += sound/sfnt_info.h
74header-test- += sound/sof/eq.h
75header-test- += sound/sof/fw.h
76header-test- += sound/sof/header.h
77header-test- += sound/sof/manifest.h
78header-test- += sound/sof/trace.h
79header-test- += xen/evtchn.h
80header-test- += xen/gntdev.h
81header-test- += xen/privcmd.h
82
83# More headers are broken in some architectures
84
85ifeq ($(SRCARCH),arc)
86header-test- += linux/bpf_perf_event.h
87endif
88
89ifeq ($(SRCARCH),ia64)
90header-test- += asm/setup.h
91header-test- += asm/sigcontext.h
92header-test- += asm/perfmon.h
93header-test- += asm/perfmon_default_smpl.h
94header-test- += linux/if_bonding.h
95endif
96
97ifeq ($(SRCARCH),mips)
98header-test- += asm/stat.h
99endif
100
101ifeq ($(SRCARCH),powerpc)
102header-test- += asm/stat.h
103header-test- += linux/bpf_perf_event.h
104endif
105
106ifeq ($(SRCARCH),riscv)
107header-test- += linux/bpf_perf_event.h
108endif
109
110ifeq ($(SRCARCH),s390)
111header-test- += asm/runtime_instr.h
112header-test- += asm/zcrypt.h
113endif
114
115ifeq ($(SRCARCH),sparc)
116header-test- += asm/stat.h
117header-test- += asm/uctx.h
118header-test- += asm/fbio.h
119header-test- += asm/openpromio.h
120endif
121
122# asm-generic/*.h is used by asm/*.h, and should not be included directly
123header-test- += asm-generic/%
124
125# The rest are compile-tested
126header-test-y += $(filter-out $(header-test-), \
127 $(patsubst $(obj)/%,%, $(wildcard \
128 $(addprefix $(obj)/, *.h */*.h */*/*.h */*/*/*.h))))
129
130# For GNU Make <= 4.2.1, $(wildcard $(obj)/*/) matches to not only directories
131# but also regular files. Use $(filter %/, ...) just in case.
132clean-dirs += $(patsubst $(obj)/%/,%,$(filter %/, $(wildcard $(obj)/*/)))