Skip to content
  • Masahiro Yamada's avatar
    kbuild: make single targets work more correctly · 394053f4
    Masahiro Yamada authored
    
    
    Currently, the single target build directly descends into the directory
    of the target. For example,
    
      $ make foo/bar/baz.o
    
    ... directly descends into foo/bar/.
    
    On the other hand, the normal build usually descends one directory at
    a time, i.e. descends into foo/, and then foo/bar/.
    
    This difference causes some problems.
    
    [1] miss subdir-asflags-y, subdir-ccflags-y in upper Makefiles
    
        The options in subdir-{as,cc}flags-y take effect in the current
        and its sub-directories. In other words, they are inherited
        downward. In the example above, the single target will miss
        subdir-{as,cc}flags-y if they are defined in foo/Makefile.
    
    [2] could be built in a different directory
    
        As Documentation/kbuild/modules.rst section 4.3 says, Kbuild can
        handle files that are spread over several sub-directories.
    
        The build rule of foo/bar/baz.o may not necessarily be specified in
        foo/bar/Makefile. It might be specifies in foo/Makefile as follows:
    
        [foo/Makefile]
        obj-y := bar/baz.o
    
        This often happens when a module is so big that its source files
        are divided into sub-directories.
    
        In this case, there is no Makefile in the foo/bar/ directory, yet
        the single target descends into foo/bar/, then fails due to the
        missing Makefile. You can still do 'make foo/bar/' for partial
        building, but cannot do 'make foo/bar/baz.s'. I believe the single
        target '%.s' is a useful feature for inspecting the compiler output.
    
        Some modules work around this issue by putting an empty Makefile
        in every sub-directory.
    
    This commit fixes those problems by making the single target build
    descend in the same way as the normal build does.
    
    Another change is the single target build will observe the CONFIG
    options. Previously, it allowed users to build the foo.o even when
    the corresponding CONFIG_FOO is disabled:
    
       obj-$(CONFIG_FOO) += foo.o
    
    In the new behavior, the single target build will just fail and show
    "No rule to make target ..." (or "Nothing to be done for ..." if the
    stale object already exists, but cannot be updated).
    
    The disadvantage of this commit is the build speed. Now that the
    single target build visits every directory and parses lots of
    Makefiles, it is slower than before. (But, I hope it will not be
    too slow.)
    
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    394053f4