# SPDX-License-Identifier: GPL-2.0
# ===========================================================================
# Module versions
# ===========================================================================
#
# Stage one of module building created the following:
# a) The individual .o files used for the module
# b) A <module>.o file which is the .o files above linked together
# c) A <module>.mod file, listing the name of the preliminary <module>.o file,
#    plus all .o files
# d) modules.order, which lists all the modules

# Stage 2 is handled by this file and does the following
# 1) Find all modules listed in modules.order
# 2) modpost is then used to
# 3)  create one <module>.mod.c file pr. module
# 4)  create one Module.symvers file with CRC for all exported symbols

# Step 3 is used to place certain information in the module's ELF
# section, including information such as:
#   Version magic (see include/linux/vermagic.h for full details)
#     - Kernel release
#     - SMP is CONFIG_SMP
#     - PREEMPT is CONFIG_PREEMPT[_RT]
#     - GCC Version
#   Module info
#     - Module version (MODULE_VERSION)
#     - Module alias'es (MODULE_ALIAS)
#     - Module license (MODULE_LICENSE)
#     - See include/linux/module.h for more details

# Step 4 is solely used to allow module versioning in external modules,
# where the CRC of each module is retrieved from the Module.symvers file.

# KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined
# symbols in the final module linking stage
# KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules.
# This is solely useful to speed up test compiles

PHONY := __modpost
__modpost:

include include/config/auto.conf
include scripts/Kbuild.include

kernelsymfile := $(objtree)/Module.symvers
modulesymfile := $(firstword $(KBUILD_EXTMOD))/Module.symvers

MODPOST = scripts/mod/modpost						\
	$(if $(CONFIG_MODVERSIONS),-m)					\
	$(if $(CONFIG_MODULE_SRCVERSION_ALL),-a)			\
	$(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile)			\
	$(if $(KBUILD_EXTMOD),-I $(modulesymfile))			\
	$(if $(KBUILD_EXTMOD),$(addprefix -e ,$(KBUILD_EXTRA_SYMBOLS)))	\
	$(if $(KBUILD_EXTMOD),-o $(modulesymfile))			\
	$(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E)			\
	$(if $(KBUILD_MODPOST_WARN),-w)					\
	$(if $(filter nsdeps,$(MAKECMDGOALS)),-d)

ifdef MODPOST_VMLINUX

quiet_cmd_modpost = MODPOST vmlinux.o
      cmd_modpost = $(MODPOST) vmlinux.o

__modpost:
	$(call cmd,modpost)

else

# When building external modules load the Kbuild file to retrieve EXTRA_SYMBOLS info
ifneq ($(KBUILD_EXTMOD),)

# set src + obj - they may be used when building the .mod.c file
obj := $(KBUILD_EXTMOD)
src := $(obj)

# Include the module's Makefile to find KBUILD_EXTRA_SYMBOLS
include $(if $(wildcard $(src)/Kbuild), $(src)/Kbuild, $(src)/Makefile)
endif

MODPOST += $(subst -i,-n,$(filter -i,$(MAKEFLAGS))) -s -T - $(wildcard vmlinux)

# find all modules listed in modules.order
modules := $(sort $(shell cat $(MODORDER)))

# With CONFIG_LTO_CLANG, .o files might be LLVM IR, so we need to link them
# into actual objects before passing them to modpost
modpost-ext = $(if $(CONFIG_LTO_CLANG),.lto,)

ifdef CONFIG_LTO_CLANG
quiet_cmd_cc_lto_link_modules = LTO [M] $@
cmd_cc_lto_link_modules =						\
	$(LD) $(ld_flags) -r -o $(@)					\
		$(shell [ -s $(@:$(modpost-ext).o=.o.symversions) ] &&	\
			echo -T $(@:$(modpost-ext).o=.o.symversions))	\
		--whole-archive $(filter-out FORCE,$^)

$(modules:.ko=$(modpost-ext).o): %$(modpost-ext).o: %.o FORCE
	$(call if_changed,cc_lto_link_modules)

PHONY += FORCE
FORCE:

endif

# Read out modules.order instead of expanding $(modules) to pass in modpost.
# Otherwise, allmodconfig would fail with "Argument list too long".
quiet_cmd_modpost = MODPOST $(words $(modules)) modules
      cmd_modpost = sed 's/\.ko$$/$(modpost-ext)\.o/' $(MODORDER) | $(MODPOST)

__modpost: $(modules:.ko=$(modpost-ext).o)
	@$(kecho) '  Building modules, stage 2.'
	$(call cmd,modpost)
ifneq ($(KBUILD_MODPOST_NOFINAL),1)
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal
endif

nsdeps: __modpost

endif

.PHONY: $(PHONY)
