![Roman Zippel](/assets/img/avatar_default.png)
This fixes one of the worst kbuild warts left - the broken dependencies used to check and regenerate the .config file. This was done via an indirect dependency and the .config itself had an empty command, which can cause make not to reread the changed .config file. Instead of this we generate now a new file include/config/auto.conf from .config, which is used for kbuild and has the proper dependencies. It's also the main make target now for all files generated during this step (and thus replaces include/linux/autoconf.h). This also means we can now relax the syntax requirements for the .config file and we don't have to rewrite it all the time, i.e. silentoldconfig only writes .config now when it's necessary to keep it in sync with the Kconfig files and even this can be suppressed by setting the environment variable KCONFIG_NOSILENTUPDATE, so the update can (and must) be done manually. Signed-off-by: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
121 lines
3.7 KiB
Makefile
121 lines
3.7 KiB
Makefile
# ===========================================================================
|
|
# 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 in $(MODVERDIR)/, listing the name of the
|
|
# the preliminary <module>.o file, plus all .o files
|
|
|
|
# Stage 2 is handled by this file and does the following
|
|
# 1) Find all modules from the files listed in $(MODVERDIR)/
|
|
# 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
|
|
# 5) compile all <module>.mod.c files
|
|
# 6) final link of the module to a <module.ko> file
|
|
|
|
# Step 3 is used to place certain information in the module's ELF
|
|
# section, including information such as:
|
|
# Version magic (see include/vermagic.h for full details)
|
|
# - Kernel release
|
|
# - SMP is CONFIG_SMP
|
|
# - PREEMPT is CONFIG_PREEMPT
|
|
# - 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.symers file.
|
|
|
|
PHONY := _modpost
|
|
_modpost: __modpost
|
|
|
|
include include/config/auto.conf
|
|
include scripts/Kbuild.include
|
|
include scripts/Makefile.lib
|
|
|
|
kernelsymfile := $(objtree)/Module.symvers
|
|
modulesymfile := $(KBUILD_EXTMOD)/Modules.symvers
|
|
|
|
# Step 1), find all modules listed in $(MODVERDIR)/
|
|
__modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod)))
|
|
modules := $(patsubst %.o,%.ko, $(wildcard $(__modules:.ko=.o)))
|
|
|
|
_modpost: $(modules)
|
|
|
|
|
|
# Step 2), invoke modpost
|
|
# Includes step 3,4
|
|
quiet_cmd_modpost = MODPOST
|
|
cmd_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),-o $(modulesymfile)) \
|
|
$(filter-out FORCE,$^)
|
|
|
|
PHONY += __modpost
|
|
__modpost: $(wildcard vmlinux) $(modules:.ko=.o) FORCE
|
|
$(call cmd,modpost)
|
|
|
|
# Declare generated files as targets for modpost
|
|
$(symverfile): __modpost ;
|
|
$(modules:.ko=.mod.c): __modpost ;
|
|
|
|
|
|
# Step 5), compile all *.mod.c files
|
|
|
|
# modname is set to make c_flags define KBUILD_MODNAME
|
|
modname = $(*F)
|
|
|
|
quiet_cmd_cc_o_c = CC $@
|
|
cmd_cc_o_c = $(CC) $(c_flags) $(CFLAGS_MODULE) \
|
|
-c -o $@ $<
|
|
|
|
$(modules:.ko=.mod.o): %.mod.o: %.mod.c FORCE
|
|
$(call if_changed_dep,cc_o_c)
|
|
|
|
targets += $(modules:.ko=.mod.o)
|
|
|
|
# Step 6), final link of the modules
|
|
quiet_cmd_ld_ko_o = LD [M] $@
|
|
cmd_ld_ko_o = $(LD) $(LDFLAGS) $(LDFLAGS_MODULE) -o $@ \
|
|
$(filter-out FORCE,$^)
|
|
|
|
$(modules): %.ko :%.o %.mod.o FORCE
|
|
$(call if_changed,ld_ko_o)
|
|
|
|
targets += $(modules)
|
|
|
|
|
|
# Add FORCE to the prequisites 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.
|
|
|
|
targets := $(wildcard $(sort $(targets)))
|
|
cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
|
|
|
|
ifneq ($(cmd_files),)
|
|
include $(cmd_files)
|
|
endif
|
|
|
|
|
|
# Declare the contents of the .PHONY variable as phony. We keep that
|
|
# information in a variable se we can use it in if_changed and friends.
|
|
|
|
.PHONY: $(PHONY)
|