mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-04 04:02:26 +00:00
fdf94e4403
Various information about modules is compiled into the info sections. For that a dedicated .mod.c file is generated by modpost for each module and then linked into the module. However most of the information in the .mod.c is the same for all modules, internal and external. Split the shared information into a dedicated source file that is compiled once and then linked into all modules. This avoids frequent rebuilds for all .mod.c files when using CONFIG_LOCALVERSION_AUTO because the local version ends up in .mod.c through UTS_RELEASE and VERMAGIC_STRING. The modules are still relinked in this case. The code is also easier to maintain as it's now in a proper source file instead of an inline string literal. Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
84 lines
2.8 KiB
Makefile
84 lines
2.8 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0-only
|
|
# ===========================================================================
|
|
# Module final link
|
|
# ===========================================================================
|
|
|
|
PHONY := __modfinal
|
|
__modfinal:
|
|
|
|
include include/config/auto.conf
|
|
include $(srctree)/scripts/Kbuild.include
|
|
|
|
# for c_flags
|
|
include $(srctree)/scripts/Makefile.lib
|
|
|
|
# find all modules listed in modules.order
|
|
modules := $(call read-file, $(MODORDER))
|
|
|
|
__modfinal: $(modules:%.o=%.ko)
|
|
@:
|
|
|
|
# modname and part-of-module are set to make c_flags define proper module flags
|
|
modname = $(notdir $(@:.mod.o=))
|
|
part-of-module = y
|
|
GCOV_PROFILE := n
|
|
KCSAN_SANITIZE := n
|
|
|
|
quiet_cmd_cc_o_c = CC [M] $@
|
|
cmd_cc_o_c = $(CC) $(filter-out $(CC_FLAGS_CFI), $(c_flags)) -c -o $@ $<
|
|
|
|
%.mod.o: %.mod.c FORCE
|
|
$(call if_changed_dep,cc_o_c)
|
|
|
|
$(extmod_prefix).module-common.o: $(srctree)/scripts/module-common.c FORCE
|
|
$(call if_changed_dep,cc_o_c)
|
|
|
|
quiet_cmd_ld_ko_o = LD [M] $@
|
|
cmd_ld_ko_o += \
|
|
$(LD) -r $(KBUILD_LDFLAGS) \
|
|
$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
|
|
-T scripts/module.lds -o $@ $(filter %.o, $^)
|
|
|
|
quiet_cmd_btf_ko = BTF [M] $@
|
|
cmd_btf_ko = \
|
|
if [ ! -f vmlinux ]; then \
|
|
printf "Skipping BTF generation for %s due to unavailability of vmlinux\n" $@ 1>&2; \
|
|
else \
|
|
LLVM_OBJCOPY="$(OBJCOPY)" $(PAHOLE) -J $(PAHOLE_FLAGS) $(MODULE_PAHOLE_FLAGS) --btf_base vmlinux $@; \
|
|
$(RESOLVE_BTFIDS) -b vmlinux $@; \
|
|
fi;
|
|
|
|
# Same as newer-prereqs, but allows to exclude specified extra dependencies
|
|
newer_prereqs_except = $(filter-out $(PHONY) $(1),$?)
|
|
|
|
# Same as if_changed, but allows to exclude specified extra dependencies
|
|
if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check), \
|
|
$(cmd); \
|
|
printf '%s\n' 'savedcmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
|
|
|
|
# Re-generate module BTFs if either module's .ko or vmlinux changed
|
|
%.ko: %.o %.mod.o $(extmod_prefix).module-common.o scripts/module.lds $(and $(CONFIG_DEBUG_INFO_BTF_MODULES),$(KBUILD_BUILTIN),vmlinux) FORCE
|
|
+$(call if_changed_except,ld_ko_o,vmlinux)
|
|
ifdef CONFIG_DEBUG_INFO_BTF_MODULES
|
|
+$(if $(newer-prereqs),$(call cmd,btf_ko))
|
|
endif
|
|
|
|
targets += $(modules:%.o=%.ko) $(modules:%.o=%.mod.o) $(extmod_prefix).module-common.o
|
|
|
|
# Add FORCE to the prerequisites of a target to force it to be always rebuilt.
|
|
# ---------------------------------------------------------------------------
|
|
|
|
PHONY += FORCE
|
|
FORCE:
|
|
|
|
# Read all saved command lines and dependencies for the $(targets) we
|
|
# may be building above, using $(if_changed{,_dep}). As an
|
|
# optimization, we don't need to read them if the target does not
|
|
# exist, we will rebuild anyway in that case.
|
|
|
|
existing-targets := $(wildcard $(sort $(targets)))
|
|
|
|
-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
|
|
|
|
.PHONY: $(PHONY)
|