# 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),$(addprefix -e ,$(KBUILD_EXTRA_SYMBOLS)))	\
	$(if $(KBUILD_EXTMOD),-o $(modulesymfile))			\
	$(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E)			\
	$(if $(KBUILD_MODPOST_WARN),-w)

ifdef MODPOST_VMLINUX

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

__modpost:
	$(call cmd,modpost)

else

MODPOST += $(subst -i,-n,$(filter -i,$(MAKEFLAGS))) -s -T - \
	$(if $(KBUILD_NSDEPS),-d $(MODULES_NSDEPS))

ifeq ($(KBUILD_EXTMOD),)
MODPOST += $(wildcard vmlinux)
else

# set src + obj - they may be used in the modules's Makefile
obj := $(KBUILD_EXTMOD)
src := $(obj)

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

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

# 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$$/o/' $(MODORDER) | $(MODPOST)

__modpost:
	$(call cmd,modpost)
ifneq ($(KBUILD_MODPOST_NOFINAL),1)
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal
endif

endif

.PHONY: $(PHONY)
