kbuild: do not create wrappers for header-test-y
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Mon, 1 Jul 2019 00:58:41 +0000 (09:58 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Tue, 9 Jul 2019 01:10:27 +0000 (10:10 +0900)
header-test-y does not work with headers in sub-directories.

For example, you may want to write a Makefile, like this:

include/linux/Kbuild:

  header-test-y += mtd/nand.h

This entry will create a wrapper include/linux/mtd/nand.hdrtest.c
with the following content:

  #include "mtd/nand.h"

To make this work, we need to add $(srctree)/include/linux to the
header search path. It would be tedious to add ccflags-y.

Instead, we could change the *.hdrtest.c rule to wrap:

  #include "nand.h"

This works for in-tree build since #include "..." searches in the
relative path from the header with this directive. For O=... build,
we need to add $(srctree)/include/linux/mtd to the header search path,
which will be even more tedious.

After all, I thought it would be handier to compile headers directly
without creating wrappers.

I added a new build rule to compile %.h into %.h.s

The target is %.h.s instead of %.h.o because it is slightly faster.
Also, as for GCC, an empty assembly is smaller than an empty object.

I wrote the build rule:

  $(CC) $(c_flags) -S -o $@ -x c /dev/null -include $<

instead of:

  $(CC) $(c_flags) -S -o $@ -x c $<

Both work fine with GCC, but the latter is bad for Clang.

This comes down to the difference in the -Wunused-function policy.
GCC does not warn about unused 'static inline' functions at all.
Clang does not warn about the ones in included headers, but does
about the ones in the source. So, we should handle headers as
headers, not as source files.

In fact, this has been hidden since commit abb2ea7dfd82 ("compiler,
clang: suppress warning for unused static inline functions"), but we
should not rely on that.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Acked-by: Jani Nikula <jani.nikula@intel.com>
Tested-by: Jani Nikula <jani.nikula@intel.com>
.gitignore
Documentation/dontdiff
Documentation/kbuild/makefiles.txt
Makefile
scripts/Makefile.build
scripts/Makefile.lib
scripts/package/mkspec

index 4bb60f0fa23be91f09e5f549ffe691abecf86095..7587ef56b92dcc93ba85db2ee022201b3502225f 100644 (file)
@@ -22,7 +22,6 @@
 *.elf
 *.gcno
 *.gz
-*.hdrtest.c
 *.i
 *.ko
 *.lex.c
index 554dfe4883d23ccb00737dbe7e203729740d5b9e..5eba889ea84da0b95728adfb6f82fa9b0213bbdb 100644 (file)
@@ -19,7 +19,6 @@
 *.grep
 *.grp
 *.gz
-*.hdrtest.c
 *.html
 *.i
 *.jpeg
index ca4b24ec0399c069181688dd5034b7587e9ad736..5080fec346093a5b67cadf493d8e3f3cde555399 100644 (file)
@@ -1023,8 +1023,7 @@ When kbuild executes, the following steps are followed (roughly):
        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.
+       this builds them as part of extra-y.
 
 --- 6.7 Commands useful for building a boot image
 
index fca827bc3f778fa645e50ec25c8cd274f8affa18..82fccd37a1adc451627105cdbda5e2ab07da19ca 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1663,7 +1663,6 @@ 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' \
index ee03195605131b13ce3f87bd21f04e946ef2883a..776842b7e6a3b1f97bb6beb0c9a38f29601bcea9 100644 (file)
@@ -294,14 +294,14 @@ 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)
+# header test (header-test-y target)
 # ---------------------------------------------------------------------------
 
-quiet_cmd_header_test = HDRTEST $@
-      cmd_header_test = echo "\#include \"$*.h\"" > $@
+quiet_cmd_cc_s_h = CC      $@
+      cmd_cc_s_h = $(CC) $(c_flags) -S -o $@ -x c /dev/null -include $<
 
-$(obj)/%.hdrtest.c:
-       $(call cmd,header_test)
+$(obj)/%.h.s: $(src)/%.h FORCE
+       $(call if_changed_dep,cc_s_h)
 
 # Compile assembler sources (.S)
 # ---------------------------------------------------------------------------
index 3e630fcaffd1e7ffb743c11d2ae24c755021239c..55ae1ec653428c37d25f288749c42e7164933c10 100644 (file)
@@ -67,7 +67,7 @@ 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))
+extra-$(CONFIG_HEADER_TEST) += $(addsuffix .s, $(header-test-y))
 
 # Add subdir path
 
index 009147d4718eeead8117413a8bdf95108c84e4dd..2d29df4a0a53c09acdfa7fbe5f7f66bf0bc5f291 100755 (executable)
@@ -31,7 +31,7 @@ PROVIDES="$PROVIDES kernel-$KERNELRELEASE"
 __KERNELRELEASE=$(echo $KERNELRELEASE | sed -e "s/-/_/g")
 EXCLUDES="$RCS_TAR_IGNORE --exclude=.tmp_versions --exclude=*vmlinux* \
 --exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation \
---exclude=.config.old --exclude=.missing-syscalls.d"
+--exclude=.config.old --exclude=.missing-syscalls.d --exclude=*.s"
 
 # We can label the here-doc lines for conditional output to the spec file
 #