Skip to content
Snippets Groups Projects
  • Masahiro Yamada's avatar
    kbuild: allow to start building external modules in any directory · 8cd07cc6
    Masahiro Yamada authored
    
    Unless an explicit O= option is provided, external module builds must
    start from the kernel directory.
    
    This can be achieved by using the -C option:
    
      $ make -C /path/to/kernel M=/path/to/external/module
    
    This commit allows starting external module builds from any directory,
    so you can also do the following:
    
      $ make -f /path/to/kernel/Makefile M=/path/to/external/module
    
    The key difference is that the -C option changes the working directory
    and parses the Makefile located there, while the -f option only
    specifies the Makefile to use.
    
    As shown in the examples in Documentation/kbuild/modules.rst, external
    modules usually have a wrapper Makefile that allows you to build them
    without specifying any make arguments. The Makefile typically contains
    a rule as follows:
    
        KDIR ?= /path/to/kernel
        default:
                $(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKECMDGOALS)
    
    The log will appear as follows:
    
        $ make
        make -C /path/to/kernel M=/path/to/external/module
        make[1]: Entering directory '/path/to/kernel'
        make[2]: Entering directory '/path/to/external/module'
          CC [M]  helloworld.o
          MODPOST Module.symvers
          CC [M]  helloworld.mod.o
          CC [M]  .module-common.o
          LD [M]  helloworld.ko
        make[2]: Leaving directory '/path/to/external/module'
        make[1]: Leaving directory '/path/to/kernel'
    
    This changes the working directory twice because the -C option first
    switches to the kernel directory, and then Kbuild internally recurses
    back to the external module directory.
    
    With this commit, the wrapper Makefile can directly include the kernel
    Makefile:
    
        KDIR ?= /path/to/kernel
        export KBUILD_EXTMOD := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
        include $(KDIR)/Makefile
    
    This avoids unnecessary sub-make invocations:
    
        $ make
          CC [M]  helloworld.o
          MODPOST Module.symvers
          CC [M]  helloworld.mod.o
          CC [M]  .module-common.o
          LD [M]  helloworld.ko
    
    Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: default avatarNicolas Schier <nicolas@fjasle.eu>
    8cd07cc6