diff options
| author | Masahiro Yamada <masahiroy@kernel.org> | 2022-09-25 03:19:13 +0900 | 
|---|---|---|
| committer | Masahiro Yamada <masahiroy@kernel.org> | 2022-09-29 06:07:58 +0900 | 
| commit | f73edc8951b2de515b5ecc8a357ccd47dd41077e (patch) | |
| tree | d47510e68b59ee420a244941b11be9a189c7e955 /Makefile | |
| parent | 9c5a0ac3c36917c4258f734bda98be02ca36b992 (diff) | |
| download | linux-f73edc8951b2de515b5ecc8a357ccd47dd41077e.tar.bz2 | |
kbuild: unify two modpost invocations
Currently, modpost is executed twice; first for vmlinux, second
for modules.
This commit merges them.
Current build flow
==================
  1) build obj-y and obj-m objects
    2) link vmlinux.o
      3) modpost for vmlinux
        4) link vmlinux
          5) modpost for modules
            6) link modules (*.ko)
The build steps 1) through 6) are serialized, that is, modules are
built after vmlinux. You do not get benefits of parallel builds when
scripts/link-vmlinux.sh is being run.
New build flow
==============
  1) build obj-y and obj-m objects
    2) link vmlinux.o
      3) modpost for vmlinux and modules
        4a) link vmlinux
        4b) link modules (*.ko)
In the new build flow, modpost is invoked just once.
vmlinux and modules are built in parallel. One exception is
CONFIG_DEBUG_INFO_BTF_MODULES=y, where modules depend on vmlinux.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Tested-by: Nick Desaulniers <ndesaulniers@google.com>
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
Diffstat (limited to 'Makefile')
| -rw-r--r-- | Makefile | 32 | 
1 files changed, 25 insertions, 7 deletions
| @@ -1150,7 +1150,7 @@ cmd_link-vmlinux =                                                 \  	$(CONFIG_SHELL) $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)";    \  	$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) -vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) FORCE +vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) modpost FORCE  	+$(call if_changed_dep,link-vmlinux)  targets := vmlinux @@ -1426,7 +1426,13 @@ endif  # Build modules  # -modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_prepare +# *.ko are usually independent of vmlinux, but CONFIG_DEBUG_INFOBTF_MODULES +# is an exception. +ifdef CONFIG_DEBUG_INFO_BTF_MODULES +modules: vmlinux +endif + +modules: modules_prepare  # Target to prepare building external modules  modules_prepare: prepare @@ -1739,8 +1745,12 @@ ifdef CONFIG_MODULES  $(MODORDER): $(build-dir)  	@: -modules: modules_check -	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost +# KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules. +# This is solely useful to speed up test compiles. +modules: modpost +ifneq ($(KBUILD_MODPOST_NOFINAL),1) +	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal +endif  PHONY += modules_check  modules_check: $(MODORDER) @@ -1771,6 +1781,11 @@ KBUILD_MODULES :=  endif # CONFIG_MODULES +PHONY += modpost +modpost: $(if $(single-build),, $(if $(KBUILD_BUILTIN), vmlinux.o)) \ +	 $(if $(KBUILD_MODULES), modules_check) +	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost +  # Single targets  # ---------------------------------------------------------------------------  # To build individual files in subdirectories, you can do like this: @@ -1790,16 +1805,19 @@ single-ko := $(sort $(filter %.ko, $(MAKECMDGOALS)))  single-no-ko := $(filter-out $(single-ko), $(MAKECMDGOALS)) \  		$(foreach x, o mod, $(patsubst %.ko, %.$x, $(single-ko))) -$(single-ko): single_modpost +$(single-ko): single_modules  	@:  $(single-no-ko): $(build-dir)  	@:  # Remove MODORDER when done because it is not the real one. -PHONY += single_modpost -single_modpost: $(single-no-ko) modules_prepare +PHONY += single_modules +single_modules: $(single-no-ko) modules_prepare  	$(Q){ $(foreach m, $(single-ko), echo $(extmod_prefix)$m;) } > $(MODORDER)  	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost +ifneq ($(KBUILD_MODPOST_NOFINAL),1) +	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal +endif  	$(Q)rm -f $(MODORDER)  single-goals := $(addprefix $(build-dir)/, $(single-no-ko)) |