1. 09 Jul, 2019 5 commits
    • Masahiro Yamada's avatar
      kbuild: compile-test kernel headers to ensure they are self-contained · 43c78d88
      Masahiro Yamada authored
      The headers in include/ are globally used in the kernel source tree
      to provide common APIs. They are included from external modules, too.
      
      It will be useful to make as many headers self-contained as possible
      so that we do not have to rely on a specific include order.
      
      There are more than 4000 headers in include/. In my rough analysis,
      70% of them are already self-contained. With efforts, most of them
      can be self-contained.
      
      For now, we must exclude more than 1000 headers just because they
      cannot be compiled as standalone units. I added them to header-test-.
      The blacklist was mostly generated by a script, so the reason of the
      breakage should be checked later.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      Tested-by: default avatarJani Nikula <jani.nikula@intel.com>
      Reviewed-by: default avatarJoel Fernandes (Google) <joel@joelfernandes.org>
      43c78d88
    • Masahiro Yamada's avatar
      kheaders: include only headers into kheaders_data.tar.xz · 7199ff7d
      Masahiro Yamada authored
      Currently, kheaders_data.tar.xz contains some build scripts as well as
      headers. None of them is needed in the header archive.
      
      For ARCH=x86, this commit excludes the following from the archive:
      
        arch/x86/include/asm/Kbuild
        arch/x86/include/uapi/asm/Kbuild
        include/asm-generic/Kbuild
        include/config/auto.conf
        include/config/kernel.release
        include/config/tristate.conf
        include/uapi/asm-generic/Kbuild
        include/uapi/Kbuild
        kernel/gen_kheaders.sh
      
      This change is actually motivated for the planned header compile-testing
      because it will generate more build artifacts, which should not be
      included in the archive.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      Reviewed-by: default avatarJoel Fernandes (Google) <joel@joelfernandes.org>
      7199ff7d
    • Masahiro Yamada's avatar
      kheaders: remove meaningless -R option of 'ls' · b60b7c2e
      Masahiro Yamada authored
      The -R option of 'ls' is supposed to be used for directories.
      
         -R, --recursive
                list subdirectories recursively
      
      Since 'find ... -type f' only matches to regular files, we do not
      expect directories passed to the 'ls' command here.
      
      Giving -R is harmless at least, but unneeded.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      Reviewed-by: default avatarJoel Fernandes (Google) <joel@joelfernandes.org>
      b60b7c2e
    • Masahiro Yamada's avatar
      kbuild: support header-test-pattern-y · 1e21cbfa
      Masahiro Yamada authored
      In my view, most of headers can be self-contained. So, it would be
      tedious to add every header to header-test-y explicitly. We usually
      end up with "all headers with some exceptions".
      
      There are two types in exceptions:
      
      [1] headers that are never compiled as standalone units
      
        For examples, include/linux/compiler-gcc.h is not intended for
        direct inclusion. We should always exclude such ones.
      
      [2] headers that are conditionally compiled as standalone units
      
        Some headers can be compiled only for particular architectures.
        For example, include/linux/arm-cci.h can be compiled only for
        arm/arm64 because it requires <asm/arm-cci.h> to exist.
        Clang can compile include/soc/nps/mtm.h only for arc because
        it contains an arch-specific register in inline assembler.
      
      So, you can write Makefile like this:
      
        header-test-                += linux/compiler-gcc.h
        header-test-$(CONFIG_ARM)   += linux/arm-cci.h
        header-test-$(CONFIG_ARM64) += linux/arm-cci.h
        header-test-$(CONFIG_ARC)   += soc/nps/mtm.h
      
      The new syntax header-test-pattern-y will be useful to specify
      "the rest".
      
      The typical usage is like this:
      
        header-test-pattern-y += */*.h
      
      This will add all the headers in sub-directories to the test coverage,
      excluding $(header-test-). In this regards, header-test-pattern-y
      behaves like a weaker variant of header-test-y.
      
      Caveat:
      The patterns in header-test-pattern-y are prefixed with $(srctree)/$(src)/
      but not $(objtree)/$(obj)/. Stale generated headers are often left over
      when you traverse the git history without cleaning. Wildcard patterns for
      $(objtree) may match to stale headers, which could fail to compile.
      One pitfall is $(srctree)/$(src)/ and $(objtree)/$(obj)/ point to the
      same directory for in-tree building. So, header-test-pattern-y should
      be used with care since it can potentially match to stale headers.
      
      Caveat2:
      You could use wildcard for header-test-. For example,
      
        header-test- += asm-generic/%
      
      ... will exclude headers in asm-generic directory. Unfortunately, the
      wildcard character is '%' instead of '*' here because this is evaluated
      by $(filter-out ...) whereas header-test-pattern-y is evaluated by
      $(wildcard ...). This is a kludge, but seems useful in some places...
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      Tested-by: default avatarJani Nikula <jani.nikula@intel.com>
      1e21cbfa
    • Masahiro Yamada's avatar
      kbuild: do not create wrappers for header-test-y · c93a0368
      Masahiro Yamada authored
      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 abb2ea7d ("compiler,
      clang: suppress warning for unused static inline functions"), but we
      should not rely on that.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      Acked-by: default avatarJani Nikula <jani.nikula@intel.com>
      Tested-by: default avatarJani Nikula <jani.nikula@intel.com>
      c93a0368
  2. 08 Jul, 2019 1 commit
    • Masahiro Yamada's avatar
      kbuild: compile-test exported headers to ensure they are self-contained · d6fc9fcb
      Masahiro Yamada authored
      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.htmlSigned-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      Reviewed-by: default avatarSam Ravnborg <sam@ravnborg.org>
      d6fc9fcb
  3. 07 Jul, 2019 7 commits
  4. 03 Jul, 2019 1 commit
  5. 01 Jul, 2019 6 commits
    • Masahiro Yamada's avatar
      fixdep: check return value of printf() and putchar() · 6f9ac9f4
      Masahiro Yamada authored
      When there is not enough space on your storage device, the build will
      fail with 'No space left on device' error message.
      
      The reason is obvious from the message, so you will free up some disk
      space, then you will resume the build.
      
      However, sometimes you may still see a mysterious error message:
      
        unterminated call to function 'wildcard': missing ')'.
      
      If you run out of the disk space, fixdep may end up with generating
      incomplete .*.cmd files.
      
      For example, if the disk-full error occurs while fixdep is running
      print_dep(), the .*.cmd might be truncated like this:
      
         $(wildcard include/config/
      
      When you run 'make' next time, this broken .*.cmd will be included,
      then Make will terminate parsing since it is a wrong syntax.
      
      Once this happens, you need to run 'make clean' or delete the broken
      .*.cmd file manually.
      
      Even if you do not see any error message, the .*.cmd files after any
      error could be potentially incomplete, and unreliable. You may miss
      the re-compilation due to missing header dependency.
      
      If printf() cannot output the string for disk shortage or whatever
      reason, it returns a negative value, but currently fixdep does not
      check it at all. Consequently, fixdep *successfully* generates a
      broken .*.cmd file. Make never notices that since fixdep exits with 0,
      which means success.
      
      Given the intended usage of fixdep, it must respect the return value
      of not only malloc(), but also printf() and putchar().
      
      This seems a long-standing issue since the introduction of fixdep.
      
      In old days, Kbuild tried to provide an extra safety by letting fixdep
      output to a temporary file and renaming it after everything is done:
      
        scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\
        rm -f $(depfile);                                                    \
        mv -f $(dot-target).tmp $(dot-target).cmd)
      
      It was no help to avoid the current issue; fixdep successfully created
      a truncated tmp file, which would be renamed to a .*.cmd file.
      
      This problem should be fixed by propagating the error status to the
      build system because:
      
      [1] Since commit 9c2af1c7 ("kbuild: add .DELETE_ON_ERROR special
          target"), Make will delete the target automatically on any failure
          in the recipe.
      
      [2] Since commit 392885ee ("kbuild: let fixdep directly write to
          .*.cmd files"), .*.cmd file is included only when the corresponding
          target already exists.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      6f9ac9f4
    • Masahiro Yamada's avatar
      kbuild: split modules.order build rule out of 'modules' target · 68980b47
      Masahiro Yamada authored
      modules.order is a real target. Split its build rule out like
      modules.builtin
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      68980b47
    • Masahiro Yamada's avatar
      kbuild: fix missed rebuild of modules.builtin · 50ef0cdf
      Masahiro Yamada authored
      Unlike modules.order, modules.builtin is not rebuilt every time.
      Once modules.builtin is created, it will not be updated until
      auto.conf or tristate.conf is changed.
      
      So, it does not  notice a change in Makefile, for example, the rename
      of modules.
      
      Kbuild must always descend into directories for modules.builtin too.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      50ef0cdf
    • Masahiro Yamada's avatar
      kbuild: save $(strip ...) for calling if_changed and friends · c2341e2a
      Masahiro Yamada authored
      The string returned by $(filter-out ...) does not contain any leading
      or trailing spaces.
      
      With the previous commit, 'any-prereq' no longer contains any
      excessive spaces.
      
      Nor does 'cmd-check' since it expands to a $(filter-out ...) call.
      
      So, only the space that matters is the one between 'any-prereq'
      and 'cmd-check'.
      
      By removing it from the code, we can save $(strip ...) evaluation.
      This refactoring is possible because $(any-prereq)$(cmd-check) is only
      passed to the first argument of $(if ...), so we are only interested
      in whether or not it is empty.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      c2341e2a
    • Masahiro Yamada's avatar
      kbuild: save $(strip ...) for calling any-prepreq · 93f31bbd
      Masahiro Yamada authored
      The string returned by $(filter-out ...) does not contain any leading
      or trailing spaces.
      
      So, only the space that matters is the one between
      
        $(filter-out $(PHONY),$?)
      
      and
      
        $(filter-out $(PHONY) $(wildcard $^),$^)
      
      By removing it from the code, we can save $(strip ...) evaluation.
      This refactoring is possible because $(any-prereq) is only passed to
      the first argument of $(if ...), so we are only interested in whether
      or not it is empty.
      
      This is also the prerequisite for the next commit.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      93f31bbd
    • Masahiro Yamada's avatar
      kbuild: rename arg-check to cmd-check · 50bcca6a
      Masahiro Yamada authored
      I prefer 'cmd-check' for consistency.
      
      We have 'echo-cmd', 'cmd', 'cmd_and_fixdep', etc. in this file.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      50bcca6a
  6. 23 Jun, 2019 7 commits
  7. 15 Jun, 2019 13 commits
    • Jani Nikula's avatar
      kbuild: add support for ensuring headers are self-contained · e846f0dc
      Jani Nikula authored
      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: default avatarJani Nikula <jani.nikula@intel.com>
      Reviewed-by: default avatarSam Ravnborg <sam@ravnborg.org>
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      e846f0dc
    • Masahiro Yamada's avatar
      kbuild: deb-pkg: do not run headers_check · 0315bb7a
      Masahiro Yamada authored
      It is absolutely fine to add extra sanity checks in package scripts,
      but it is not necessary to do so.
      
      This is already covered by the daily compile-testing (0day bot etc.)
      because headers_check is run as a part of the normal build process
      when CONFIG_HEADERS_CHECK=y.
      
      Replace it with the newly-added "make headers".
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      0315bb7a
    • Masahiro Yamada's avatar
      kbuild: simplify scripts/headers_install.sh · 555187a8
      Masahiro Yamada authored
      Now that headers_install.sh is invoked per file, remove the for-loop
      in the shell script.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      555187a8
    • Masahiro Yamada's avatar
      kbuild: move hdr-inst shorthand to top Makefile · a5bae54c
      Masahiro Yamada authored
      Now that hdr-inst is used only in the top Makefile, move it there
      from scripts/Kbuild.include.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      a5bae54c
    • Masahiro Yamada's avatar
      kbuild: re-implement Makefile.headersinst without recursion · d5470d14
      Masahiro Yamada authored
      Since commit fcc8487d ("uapi: export all headers under uapi
      directories"), the headers in uapi directories are all exported by
      default although exceptional cases are still allowed by the syntax
      'no-export-headers'.
      
      The traditional directory descending has been kept (in a somewhat
      hacky way), but it is actually unneeded.
      
      Get rid of it to simplify the code.
      
      Also, handle files one by one instead of the previous per-directory
      processing. This will emit much more log, but I like it.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      d5470d14
    • Masahiro Yamada's avatar
      kbuild: add 'headers' target to build up uapi headers in usr/include · 59b2bd05
      Masahiro Yamada authored
      In Linux build system, build targets and installation targets are
      separated.
      
      Examples are:
      
       - 'make vmlinux' -> 'make install'
       - 'make modules' -> 'make modules_install'
       - 'make dtbs'    -> 'make dtbs_install'
       - 'make vdso'    -> 'make vdso_install'
      
      The intention is to run the build targets under the normal privilege,
      then the installation targets under the root privilege since we need
      the write permission to the system directories.
      
      We have 'make headers_install' but the corresponding 'make headers'
      stage does not exist. The purpose of headers_install is to provide
      the kernel interface to C library. So, nobody would try to install
      headers to /usr/include directly.
      
      If 'sudo make INSTALL_HDR_PATH=/usr/include headers_install' were run,
      some build artifacts in the kernel tree would be owned by root because
      some of uapi headers are generated by 'uapi-asm-generic', 'archheaders'
      targets.
      
      Anyway, I believe it makes sense to split the header installation into
      two stages.
      
       [1] 'make headers'
          Process headers in uapi directories by scripts/headers_install.sh
          and copy them to usr/include
      
       [2] 'make headers_install'
          Copy '*.h' verbatim from usr/include to $(INSTALL_HDR_PATH)/include
      
      For the backward compatibility, 'headers_install' depends on 'headers'.
      
      Some samples expect uapi headers in usr/include. So, the 'headers'
      target is useful to build up them in the fixed location usr/include
      irrespective of INSTALL_HDR_PATH.
      
      Another benefit is to stop polluting the final destination with the
      time-stamp files '.install' and '.check'. Maybe you can see them in
      your toolchains.
      
      Lastly, my main motivation is to prepare for compile-testing uapi
      headers. To build something, we have to save an object and .*.cmd
      somewhere. The usr/include/ will be the work directory for that.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      59b2bd05
    • Masahiro Yamada's avatar
      kbuild: build all prerequisites of headers_install simultaneously · bdd7714b
      Masahiro Yamada authored
      Currently, scripts/unifdef is compiled after scripts_basic,
      uapi-asm-generic, archheaders, and archscripts.
      
      The proper dependency is just scripts_basic. There is no problem
      to compile scripts/unifdef and other headers at the same time.
      
      Split scripts_unifdef out in order to allow more parallel building.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      bdd7714b
    • Masahiro Yamada's avatar
      kbuild: remove build_unifdef target in scripts/Makefile · 2b8481be
      Masahiro Yamada authored
      Since commit 2aedcd09 ("kbuild: suppress annoying "... is up to date."
      message"), if_changed and friends nicely suppress "is up to date" messages.
      
      We do not need per-Makefile tricks.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      2b8481be
    • Masahiro Yamada's avatar
      kbuild: add CONFIG_HEADERS_INSTALL and loosen the dependency of samples · e949f4c2
      Masahiro Yamada authored
      Commit 5318321d ("samples: disable CONFIG_SAMPLES for UML") used
      a big hammer to fix the build errors under the samples/ directory.
      Only some samples actually include uapi headers from usr/include.
      
      Introduce CONFIG_HEADERS_INSTALL since 'depends on HEADERS_INSTALL' is
      clearer than 'depends on !UML'. If this option is enabled, uapi headers
      are installed before starting directory descending.
      
      I added 'depends on HEADERS_INSTALL' to per-sample CONFIG options.
      This allows UML to compile some samples.
      
      $ make ARCH=um allmodconfig samples/
        [ snip ]
        CC [M]  samples/configfs/configfs_sample.o
        CC [M]  samples/kfifo/bytestream-example.o
        CC [M]  samples/kfifo/dma-example.o
        CC [M]  samples/kfifo/inttype-example.o
        CC [M]  samples/kfifo/record-example.o
        CC [M]  samples/kobject/kobject-example.o
        CC [M]  samples/kobject/kset-example.o
        CC [M]  samples/trace_events/trace-events-sample.o
        CC [M]  samples/trace_printk/trace-printk.o
        AR      samples/vfio-mdev/built-in.a
        AR      samples/built-in.a
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      e949f4c2
    • Masahiro Yamada's avatar
      kbuild: fix Kconfig prompt of CONFIG_HEADERS_CHECK · c6509a24
      Masahiro Yamada authored
      Prior to commit 257edce6 ("kbuild: exploit parallel building for
      CONFIG_HEADERS_CHECK"), the sanity check of exported headers was done
      as a side-effect of build rule of vmlinux.
      
      That commit is good, but I missed to update the prompt of the Kconfig
      entry. For the sake of preciseness, lets' say "when building 'all'".
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      c6509a24
    • Masahiro Yamada's avatar
      kbuild: make gdb_script depend on prepare0 instead of prepare · 7a739ce5
      Masahiro Yamada authored
      'gdb_script' needs headers generated by ./Kbuild, which is visited
      by 'prepare0'. None of 'gdb_script' depends on 'prepare'.
      
      Loosen the dependency.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      7a739ce5
    • Masahiro Yamada's avatar
      kbuild: remove stale dependency between Documentation/ and headers_install · 3a51f908
      Masahiro Yamada authored
      Commit 8e2faea8 ("Make Documenation depend on headers_install")
      dates back to 2014, which is before Sphinx was introduced for the
      kernel documentation.
      
      Since none of DOC_TARGET requires headers_install, it is strange to
      run it only for the single target "Documentation/".
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      3a51f908
    • Masahiro Yamada's avatar
      kbuild: remove headers_{install,check}_all · f3c8d4c7
      Masahiro Yamada authored
      headers_install_all does not make much sense any more because different
      architectures export different set of uapi/linux/ headers. As you see
      in include/uapi/linux/Kbuild, the installation of a.out.h, kvm.h, and
      kvm_para.h is arch-dependent. So, headers_install_all repeats the
      installation/removal of them.
      
      If somebody really thinks it is useful to do headers_install for all
      architectures, it would be possible by small shell-scripting, but
      the top Makefile does not have to provide entry targets just for that
      purpose.
      Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
      Acked-by: default avatarSam Ravnborg <sam@ravnborg.org>
      f3c8d4c7