kbuild: add support for ensuring headers are self-contained
authorJani Nikula <jani.nikula@intel.com>
Tue, 4 Jun 2019 12:42:48 +0000 (15:42 +0300)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Sat, 15 Jun 2019 10:57:02 +0000 (19:57 +0900)
Sometimes it's useful to be able to explicitly ensure certain headers
remain self-contained, i.e. that they are compilable as standalone
units, by including and/or forward declaring everything they depend on.

Add special target header-test-y where individual Makefiles can add
headers to be tested if CONFIG_HEADER_TEST is enabled. This will
generate a dummy C file per header that gets built as part of extra-y.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
.gitignore
Documentation/dontdiff
Documentation/kbuild/makefiles.txt
Makefile
drivers/gpu/drm/i915/.gitignore [deleted file]
drivers/gpu/drm/i915/Makefile.header-test
init/Kconfig
scripts/Makefile.build
scripts/Makefile.lib

index 7587ef5..4bb60f0 100644 (file)
@@ -22,6 +22,7 @@
 *.elf
 *.gcno
 *.gz
+*.hdrtest.c
 *.i
 *.ko
 *.lex.c
index 5eba889..554dfe4 100644 (file)
@@ -19,6 +19,7 @@
 *.grep
 *.grp
 *.gz
+*.hdrtest.c
 *.html
 *.i
 *.jpeg
index bac301a..ca4b24e 100644 (file)
@@ -1018,6 +1018,13 @@ When kbuild executes, the following steps are followed (roughly):
        In this example, extra-y is used to list object files that
        shall be built, but shall not be linked as part of built-in.a.
 
+    header-test-y
+
+       header-test-y specifies headers (*.h) in the current directory that
+       should be compile tested to ensure they are self-contained,
+       i.e. compilable as standalone units. If CONFIG_HEADER_TEST is enabled,
+       this autogenerates dummy sources to include the headers, and builds them
+       as part of extra-y.
 
 --- 6.7 Commands useful for building a boot image
 
index e124a3e..aefdb56 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1647,6 +1647,7 @@ clean: $(clean-dirs)
                -o -name '*.dwo' -o -name '*.lst' \
                -o -name '*.su'  \
                -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
+               -o -name '*.hdrtest.c' \
                -o -name '*.lex.c' -o -name '*.tab.[ch]' \
                -o -name '*.asn1.[ch]' \
                -o -name '*.symtypes' -o -name 'modules.order' \
diff --git a/drivers/gpu/drm/i915/.gitignore b/drivers/gpu/drm/i915/.gitignore
deleted file mode 100644 (file)
index cff45d8..0000000
+++ /dev/null
@@ -1 +0,0 @@
-header_test_*.c
index c1c3918..639b596 100644 (file)
@@ -2,7 +2,7 @@
 # Copyright © 2019 Intel Corporation
 
 # Test the headers are compilable as standalone units
-header_test := \
+header-test-$(CONFIG_DRM_I915_WERROR) := \
        i915_active_types.h \
        i915_gem_context_types.h \
        i915_priolist_types.h \
@@ -35,13 +35,3 @@ header_test := \
        intel_sprite.h \
        intel_tv.h \
        intel_workarounds_types.h
-
-quiet_cmd_header_test = HDRTEST $@
-      cmd_header_test = echo "\#include \"$(<F)\"" > $@
-
-header_test_%.c: %.h
-       $(call cmd,header_test)
-
-i915-$(CONFIG_DRM_I915_WERROR) += $(foreach h,$(header_test),$(patsubst %.h,header_test_%.o,$(h)))
-
-clean-files += $(foreach h,$(header_test),$(patsubst %.h,header_test_%.c,$(h)))
index 0e23443..df5bba2 100644 (file)
@@ -96,6 +96,15 @@ config COMPILE_TEST
          here. If you are a user/distributor, say N here to exclude useless
          drivers to be distributed.
 
+config HEADER_TEST
+       bool "Compile test headers that should be standalone compilable"
+       help
+         Compile test headers listed in header-test-y target to ensure they are
+         self-contained, i.e. compilable as standalone units.
+
+         If you are a developer or tester and want to ensure the requested
+         headers are self-contained, say Y here. Otherwise, choose N.
+
 config LOCALVERSION
        string "Local version - append to kernel release"
        help
index ae9cf74..ee03195 100644 (file)
@@ -294,6 +294,15 @@ quiet_cmd_cc_lst_c = MKLST   $@
 $(obj)/%.lst: $(src)/%.c FORCE
        $(call if_changed_dep,cc_lst_c)
 
+# Dummy C sources for header test (header-test-y target)
+# ---------------------------------------------------------------------------
+
+quiet_cmd_header_test = HDRTEST $@
+      cmd_header_test = echo "\#include \"$*.h\"" > $@
+
+$(obj)/%.hdrtest.c:
+       $(call cmd,header_test)
+
 # Compile assembler sources (.S)
 # ---------------------------------------------------------------------------
 
index f1f38c8..3e630fc 100644 (file)
@@ -66,6 +66,9 @@ extra-y += $(patsubst %.dtb,%.dt.yaml, $(dtb-y))
 extra-$(CONFIG_OF_ALL_DTBS) += $(patsubst %.dtb,%.dt.yaml, $(dtb-))
 endif
 
+# Test self-contained headers
+extra-$(CONFIG_HEADER_TEST) += $(patsubst %.h,%.hdrtest.o,$(header-test-y))
+
 # Add subdir path
 
 extra-y                := $(addprefix $(obj)/,$(extra-y))