# =========================================================================== # Module versions # =========================================================================== src := $(obj) MODVERDIR := include/linux/modules .PHONY: modver modver: include .config include $(obj)/Makefile include scripts/Makefile.lib # =========================================================================== ifeq ($(strip $(export-objs)),) # If we don't export any symbols in this dir, just descend # --------------------------------------------------------------------------- modver: $(subdir-ym) @: else # This sets version suffixes on exported symbols # --------------------------------------------------------------------------- # # Added the SMP separator to stop module accidents between uniprocessor # and SMP Intel boxes - AC - from bits by Michael Chastain # ifdef CONFIG_SMP genksyms_smp_prefix := -p smp_ else genksyms_smp_prefix := endif # Don't include modversions.h, we're just about to generate it here. CFLAGS_MODULE := $(filter-out -include include/linux/modversions.h,$(CFLAGS_MODULE)) $(addprefix $(MODVERDIR)/,$(real-objs-y:.o=.ver)): modkern_cflags := $(CFLAGS_KERNEL) $(addprefix $(MODVERDIR)/,$(real-objs-m:.o=.ver)): modkern_cflags := $(CFLAGS_MODULE) $(addprefix $(MODVERDIR)/,$(export-objs:.o=.ver)): export_flags := -D__GENKSYMS__ # Default for not multi-part modules modname = $(*F) $(addprefix $(MODVERDIR)/,$(multi-objs:.o=.ver)) : modname = $(modname-multi) # Our objects only depend on modversions.h, not on the individual .ver # files (fix-dep filters them), so touch modversions.h if any of the .ver # files changes quiet_cmd_cc_ver_c = MKVER include/linux/modules/$*.ver cmd_cc_ver_c = $(CPP) $(c_flags) $< | $(GENKSYMS) $(genksyms_smp_prefix) \ -k $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) > $@.tmp # Okay, let's explain what's happening in rule_make_cc_ver_c: # o echo the command # o execute the command # o If the $(CPP) fails, we won't notice because it's output is piped # to $(GENKSYMS) which does not fail. We recognize this case by # looking if the generated $(depfile) exists, though. # o If the .ver file changed, touch modversions.h, which is our marker # of any changed .ver files. # o Move command line and deps into their normal .*.cmd place. define rule_cc_ver_c $(if $($(quiet)cmd_cc_ver_c),echo ' $($(quiet)cmd_cc_ver_c)';) \ $(cmd_cc_ver_c); \ if [ ! -r $(depfile) ]; then exit 1; fi; \ scripts/fixdep $(depfile) $@ '$(cmd_cc_ver_c)' > $(@D)/.$(@F).tmp; \ rm -f $(depfile); \ if [ ! -r $@ ] || cmp -s $@ $@.tmp; then \ touch include/linux/modversions.h; \ fi; \ mv -f $@.tmp $@ mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd endef targets := $(addprefix $(MODVERDIR)/,$(export-objs:.o=.ver)) $(MODVERDIR)/%.ver: %.c FORCE @$(call if_changed_rule,cc_ver_c) modver: $(targets) $(subdir-ym) @mkdir -p $(dir $(addprefix .tmp_export-objs/modules/,$(export-objs:.o=.ver))) @touch $(addprefix .tmp_export-objs/modules/,$(export-objs:.o=.ver)) endif # export-objs # Descending # --------------------------------------------------------------------------- .PHONY: $(subdir-ym) $(subdir-ym): $(Q)$(MAKE) -f scripts/Makefile.modver obj=$@ # 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