1*4882a593Smuzhiyun# ========================================================================== 2*4882a593Smuzhiyun# Building 3*4882a593Smuzhiyun# ========================================================================== 4*4882a593Smuzhiyun 5*4882a593Smuzhiyunsrc := $(obj) 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunPHONY := __build 8*4882a593Smuzhiyun__build: 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun# Init all relevant variables used in kbuild files so 11*4882a593Smuzhiyun# 1) they have correct type 12*4882a593Smuzhiyun# 2) they do not inherit any value from the environment 13*4882a593Smuzhiyunobj-y := 14*4882a593Smuzhiyunobj-m := 15*4882a593Smuzhiyunlib-y := 16*4882a593Smuzhiyunlib-m := 17*4882a593Smuzhiyunalways := 18*4882a593Smuzhiyuntargets := 19*4882a593Smuzhiyunsubdir-y := 20*4882a593Smuzhiyunsubdir-m := 21*4882a593SmuzhiyunEXTRA_AFLAGS := 22*4882a593SmuzhiyunEXTRA_CFLAGS := 23*4882a593SmuzhiyunEXTRA_CPPFLAGS := 24*4882a593SmuzhiyunEXTRA_LDFLAGS := 25*4882a593Smuzhiyunasflags-y := 26*4882a593Smuzhiyunccflags-y := 27*4882a593Smuzhiyuncppflags-y := 28*4882a593Smuzhiyunldflags-y := 29*4882a593Smuzhiyun 30*4882a593Smuzhiyunsubdir-asflags-y := 31*4882a593Smuzhiyunsubdir-ccflags-y := 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun# Read auto.conf if it exists, otherwise ignore 34*4882a593Smuzhiyun-include include/config/auto.conf 35*4882a593Smuzhiyun 36*4882a593Smuzhiyuninclude scripts/Kbuild.include 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun# For backward compatibility check that these variables do not change 39*4882a593Smuzhiyunsave-cflags := $(CFLAGS) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun# The filename Kbuild has precedence over Makefile 42*4882a593Smuzhiyunkbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) 43*4882a593Smuzhiyunkbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) 44*4882a593Smuzhiyuninclude $(kbuild-file) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun# If the save-* variables changed error out 47*4882a593Smuzhiyunifeq ($(KBUILD_NOPEDANTIC),) 48*4882a593Smuzhiyun ifneq ("$(save-cflags)","$(CFLAGS)") 49*4882a593Smuzhiyun $(error CFLAGS was changed in "$(kbuild-file)". Fix it to use ccflags-y) 50*4882a593Smuzhiyun endif 51*4882a593Smuzhiyunendif 52*4882a593Smuzhiyun 53*4882a593Smuzhiyuninclude scripts/Makefile.lib 54*4882a593Smuzhiyun 55*4882a593Smuzhiyunifdef host-progs 56*4882a593Smuzhiyunifneq ($(hostprogs-y),$(host-progs)) 57*4882a593Smuzhiyun$(warning kbuild: $(obj)/Makefile - Usage of host-progs is deprecated. Please replace with hostprogs-y!) 58*4882a593Smuzhiyunhostprogs-y += $(host-progs) 59*4882a593Smuzhiyunendif 60*4882a593Smuzhiyunendif 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun# Do not include host rules unless needed 63*4882a593Smuzhiyunifneq ($(hostprogs-y)$(hostprogs-m),) 64*4882a593Smuzhiyuninclude scripts/Makefile.host 65*4882a593Smuzhiyunendif 66*4882a593Smuzhiyun 67*4882a593Smuzhiyunifneq ($(KBUILD_SRC),) 68*4882a593Smuzhiyun# Create output directory if not already present 69*4882a593Smuzhiyun_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj)) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun# Create directories for object files if directory does not exist 72*4882a593Smuzhiyun# Needed when obj-y := dir/file.o syntax is used 73*4882a593Smuzhiyun_dummy := $(foreach d,$(obj-dirs), $(shell [ -d $(d) ] || mkdir -p $(d))) 74*4882a593Smuzhiyunendif 75*4882a593Smuzhiyun 76*4882a593Smuzhiyunifndef obj 77*4882a593Smuzhiyun$(warning kbuild: Makefile.build is included improperly) 78*4882a593Smuzhiyunendif 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun# =========================================================================== 81*4882a593Smuzhiyun 82*4882a593Smuzhiyunifneq ($(strip $(lib-y) $(lib-m) $(lib-)),) 83*4882a593Smuzhiyunlib-target := $(obj)/lib.a 84*4882a593Smuzhiyunendif 85*4882a593Smuzhiyun 86*4882a593Smuzhiyunifneq ($(strip $(obj-y) $(obj-m) $(obj-) $(subdir-m) $(lib-target)),) 87*4882a593Smuzhiyunbuiltin-target := $(obj)/built-in.o 88*4882a593Smuzhiyunendif 89*4882a593Smuzhiyun 90*4882a593Smuzhiyunmodorder-target := $(obj)/modules.order 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun# We keep a list of all modules in $(MODVERDIR) 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \ 95*4882a593Smuzhiyun $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \ 96*4882a593Smuzhiyun $(subdir-ym) $(always) 97*4882a593Smuzhiyun @: 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun# Linus' kernel sanity checking tool 100*4882a593Smuzhiyunifneq ($(KBUILD_CHECKSRC),0) 101*4882a593Smuzhiyun ifeq ($(KBUILD_CHECKSRC),2) 102*4882a593Smuzhiyun quiet_cmd_force_checksrc = CHECK $< 103*4882a593Smuzhiyun cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ; 104*4882a593Smuzhiyun else 105*4882a593Smuzhiyun quiet_cmd_checksrc = CHECK $< 106*4882a593Smuzhiyun cmd_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ; 107*4882a593Smuzhiyun endif 108*4882a593Smuzhiyunendif 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun# Do section mismatch analysis for each module/built-in.o 111*4882a593Smuzhiyunifdef CONFIG_DEBUG_SECTION_MISMATCH 112*4882a593Smuzhiyun cmd_secanalysis = ; scripts/mod/modpost $@ 113*4882a593Smuzhiyunendif 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun# Compile C sources (.c) 116*4882a593Smuzhiyun# --------------------------------------------------------------------------- 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun# Default is built-in, unless we know otherwise 119*4882a593Smuzhiyunmodkern_cflags = \ 120*4882a593Smuzhiyun $(if $(part-of-module), \ 121*4882a593Smuzhiyun $(KBUILD_CFLAGS_MODULE) $(CFLAGS_MODULE), \ 122*4882a593Smuzhiyun $(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL)) 123*4882a593Smuzhiyunquiet_modtag := $(empty) $(empty) 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun$(real-objs-m) : part-of-module := y 126*4882a593Smuzhiyun$(real-objs-m:.o=.i) : part-of-module := y 127*4882a593Smuzhiyun$(real-objs-m:.o=.s) : part-of-module := y 128*4882a593Smuzhiyun$(real-objs-m:.o=.lst): part-of-module := y 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun$(real-objs-m) : quiet_modtag := [M] 131*4882a593Smuzhiyun$(real-objs-m:.o=.i) : quiet_modtag := [M] 132*4882a593Smuzhiyun$(real-objs-m:.o=.s) : quiet_modtag := [M] 133*4882a593Smuzhiyun$(real-objs-m:.o=.lst): quiet_modtag := [M] 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun$(obj-m) : quiet_modtag := [M] 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun# Default for not multi-part modules 138*4882a593Smuzhiyunmodname = $(basetarget) 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun$(multi-objs-m) : modname = $(modname-multi) 141*4882a593Smuzhiyun$(multi-objs-m:.o=.i) : modname = $(modname-multi) 142*4882a593Smuzhiyun$(multi-objs-m:.o=.s) : modname = $(modname-multi) 143*4882a593Smuzhiyun$(multi-objs-m:.o=.lst) : modname = $(modname-multi) 144*4882a593Smuzhiyun$(multi-objs-y) : modname = $(modname-multi) 145*4882a593Smuzhiyun$(multi-objs-y:.o=.i) : modname = $(modname-multi) 146*4882a593Smuzhiyun$(multi-objs-y:.o=.s) : modname = $(modname-multi) 147*4882a593Smuzhiyun$(multi-objs-y:.o=.lst) : modname = $(modname-multi) 148*4882a593Smuzhiyun 149*4882a593Smuzhiyunquiet_cmd_cc_s_c = CC $(quiet_modtag) $@ 150*4882a593Smuzhiyuncmd_cc_s_c = $(CC) $(c_flags) $(DISABLE_LTO) -fverbose-asm -S -o $@ $< 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun$(obj)/%.s: $(src)/%.c FORCE 153*4882a593Smuzhiyun $(call if_changed_dep,cc_s_c) 154*4882a593Smuzhiyun 155*4882a593Smuzhiyunquiet_cmd_cc_i_c = CPP $(quiet_modtag) $@ 156*4882a593Smuzhiyuncmd_cc_i_c = $(CPP) $(c_flags) -o $@ $< 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun$(obj)/%.i: $(src)/%.c FORCE 159*4882a593Smuzhiyun $(call if_changed_dep,cc_i_c) 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun# These mirror gensymtypes_S and co below, keep them in synch. 162*4882a593Smuzhiyuncmd_gensymtypes_c = \ 163*4882a593Smuzhiyun $(CPP) -D__GENKSYMS__ $(c_flags) $< | \ 164*4882a593Smuzhiyun $(GENKSYMS) $(if $(1), -T $(2)) \ 165*4882a593Smuzhiyun $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \ 166*4882a593Smuzhiyun $(if $(KBUILD_PRESERVE),-p) \ 167*4882a593Smuzhiyun -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null)) 168*4882a593Smuzhiyun 169*4882a593Smuzhiyunquiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@ 170*4882a593Smuzhiyuncmd_cc_symtypes_c = \ 171*4882a593Smuzhiyun set -e; \ 172*4882a593Smuzhiyun $(call cmd_gensymtypes_c,true,$@) >/dev/null; \ 173*4882a593Smuzhiyun test -s $@ || rm -f $@ 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun$(obj)/%.symtypes : $(src)/%.c FORCE 176*4882a593Smuzhiyun $(call cmd,cc_symtypes_c) 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun# LLVM assembly 179*4882a593Smuzhiyun# Generate .ll files from .c 180*4882a593Smuzhiyunquiet_cmd_cc_ll_c = CC $(quiet_modtag) $@ 181*4882a593Smuzhiyun cmd_cc_ll_c = $(CC) $(c_flags) -emit-llvm -S -o $@ $< 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun$(obj)/%.ll: $(src)/%.c FORCE 184*4882a593Smuzhiyun $(call if_changed_dep,cc_ll_c) 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun# C (.c) files 187*4882a593Smuzhiyun# The C file is compiled and updated dependency information is generated. 188*4882a593Smuzhiyun# (See cmd_cc_o_c + relevant part of rule_cc_o_c) 189*4882a593Smuzhiyun 190*4882a593Smuzhiyunquiet_cmd_cc_o_c = CC $(quiet_modtag) $@ 191*4882a593Smuzhiyun 192*4882a593Smuzhiyunifndef CONFIG_MODVERSIONS 193*4882a593Smuzhiyuncmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< 194*4882a593Smuzhiyun 195*4882a593Smuzhiyunelse 196*4882a593Smuzhiyun# When module versioning is enabled the following steps are executed: 197*4882a593Smuzhiyun# o compile a .tmp_<file>.o from <file>.c 198*4882a593Smuzhiyun# o if .tmp_<file>.o doesn't contain a __ksymtab version, i.e. does 199*4882a593Smuzhiyun# not export symbols, we just rename .tmp_<file>.o to <file>.o and 200*4882a593Smuzhiyun# are done. 201*4882a593Smuzhiyun# o otherwise, we calculate symbol versions using the good old 202*4882a593Smuzhiyun# genksyms on the preprocessed source and postprocess them in a way 203*4882a593Smuzhiyun# that they are usable as a linker script 204*4882a593Smuzhiyun# o generate <file>.o from .tmp_<file>.o using the linker to 205*4882a593Smuzhiyun# replace the unresolved symbols __crc_exported_symbol with 206*4882a593Smuzhiyun# the actual value of the checksum generated by genksyms 207*4882a593Smuzhiyun 208*4882a593Smuzhiyuncmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $< 209*4882a593Smuzhiyun 210*4882a593Smuzhiyuncmd_modversions_c = \ 211*4882a593Smuzhiyun if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ 212*4882a593Smuzhiyun $(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ 213*4882a593Smuzhiyun > $(@D)/.tmp_$(@F:.o=.ver); \ 214*4882a593Smuzhiyun \ 215*4882a593Smuzhiyun $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ 216*4882a593Smuzhiyun -T $(@D)/.tmp_$(@F:.o=.ver); \ 217*4882a593Smuzhiyun rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \ 218*4882a593Smuzhiyun else \ 219*4882a593Smuzhiyun mv -f $(@D)/.tmp_$(@F) $@; \ 220*4882a593Smuzhiyun fi; 221*4882a593Smuzhiyunendif 222*4882a593Smuzhiyun 223*4882a593Smuzhiyunifdef CONFIG_FTRACE_MCOUNT_RECORD 224*4882a593Smuzhiyunifdef BUILD_C_RECORDMCOUNT 225*4882a593Smuzhiyunifeq ("$(origin RECORDMCOUNT_WARN)", "command line") 226*4882a593Smuzhiyun RECORDMCOUNT_FLAGS = -w 227*4882a593Smuzhiyunendif 228*4882a593Smuzhiyun# Due to recursion, we must skip empty.o. 229*4882a593Smuzhiyun# The empty.o file is created in the make process in order to determine 230*4882a593Smuzhiyun# the target endianness and word size. It is made before all other C 231*4882a593Smuzhiyun# files, including recordmcount. 232*4882a593Smuzhiyunsub_cmd_record_mcount = \ 233*4882a593Smuzhiyun if [ $(@) != "scripts/mod/empty.o" ]; then \ 234*4882a593Smuzhiyun $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)"; \ 235*4882a593Smuzhiyun fi; 236*4882a593Smuzhiyunrecordmcount_source := $(srctree)/scripts/recordmcount.c \ 237*4882a593Smuzhiyun $(srctree)/scripts/recordmcount.h 238*4882a593Smuzhiyunelse 239*4882a593Smuzhiyunsub_cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \ 240*4882a593Smuzhiyun "$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \ 241*4882a593Smuzhiyun "$(if $(CONFIG_64BIT),64,32)" \ 242*4882a593Smuzhiyun "$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CFLAGS)" \ 243*4882a593Smuzhiyun "$(LD)" "$(NM)" "$(RM)" "$(MV)" \ 244*4882a593Smuzhiyun "$(if $(part-of-module),1,0)" "$(@)"; 245*4882a593Smuzhiyunrecordmcount_source := $(srctree)/scripts/recordmcount.pl 246*4882a593Smuzhiyunendif 247*4882a593Smuzhiyuncmd_record_mcount = \ 248*4882a593Smuzhiyun if [ "$(findstring $(CC_FLAGS_FTRACE),$(_c_flags))" = \ 249*4882a593Smuzhiyun "$(CC_FLAGS_FTRACE)" ]; then \ 250*4882a593Smuzhiyun $(sub_cmd_record_mcount) \ 251*4882a593Smuzhiyun fi; 252*4882a593Smuzhiyunendif 253*4882a593Smuzhiyun 254*4882a593Smuzhiyundefine rule_cc_o_c 255*4882a593Smuzhiyun $(call echo-cmd,checksrc) $(cmd_checksrc) \ 256*4882a593Smuzhiyun $(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \ 257*4882a593Smuzhiyun $(cmd_modversions_c) \ 258*4882a593Smuzhiyun $(call echo-cmd,record_mcount) \ 259*4882a593Smuzhiyun $(cmd_record_mcount) \ 260*4882a593Smuzhiyun scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \ 261*4882a593Smuzhiyun $(dot-target).tmp; \ 262*4882a593Smuzhiyun rm -f $(depfile); \ 263*4882a593Smuzhiyun mv -f $(dot-target).tmp $(dot-target).cmd 264*4882a593Smuzhiyunendef 265*4882a593Smuzhiyun 266*4882a593Smuzhiyundefine rule_as_o_S 267*4882a593Smuzhiyun $(call echo-cmd,as_o_S) $(cmd_as_o_S); \ 268*4882a593Smuzhiyun scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,as_o_S)' > \ 269*4882a593Smuzhiyun $(dot-target).tmp; \ 270*4882a593Smuzhiyun $(cmd_modversions_S) \ 271*4882a593Smuzhiyun rm -f $(depfile); \ 272*4882a593Smuzhiyun mv -f $(dot-target).tmp $(dot-target).cmd 273*4882a593Smuzhiyunendef 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun# Built-in and composite module parts 276*4882a593Smuzhiyun$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE 277*4882a593Smuzhiyun $(call cmd,force_checksrc) 278*4882a593Smuzhiyun $(call if_changed_rule,cc_o_c) 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun# Single-part modules are special since we need to mark them in $(MODVERDIR) 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE 283*4882a593Smuzhiyun $(call cmd,force_checksrc) 284*4882a593Smuzhiyun $(call if_changed_rule,cc_o_c) 285*4882a593Smuzhiyun @{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod) 286*4882a593Smuzhiyun 287*4882a593Smuzhiyunquiet_cmd_cc_lst_c = MKLST $@ 288*4882a593Smuzhiyun cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \ 289*4882a593Smuzhiyun $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \ 290*4882a593Smuzhiyun System.map $(OBJDUMP) > $@ 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun$(obj)/%.lst: $(src)/%.c FORCE 293*4882a593Smuzhiyun $(call if_changed_dep,cc_lst_c) 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun# Compile assembler sources (.S) 296*4882a593Smuzhiyun# --------------------------------------------------------------------------- 297*4882a593Smuzhiyun 298*4882a593Smuzhiyunmodkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL) 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun$(real-objs-m) : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE) 301*4882a593Smuzhiyun$(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE) 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun# .S file exports must have their C prototypes defined in asm/asm-prototypes.h 304*4882a593Smuzhiyun# or a file that it includes, in order to get versioned symbols. We build a 305*4882a593Smuzhiyun# dummy C file that includes asm-prototypes and the EXPORT_SYMBOL lines from 306*4882a593Smuzhiyun# the .S file (with trailing ';'), and run genksyms on that, to extract vers. 307*4882a593Smuzhiyun# 308*4882a593Smuzhiyun# This is convoluted. The .S file must first be preprocessed to run guards and 309*4882a593Smuzhiyun# expand names, then the resulting exports must be constructed into plain 310*4882a593Smuzhiyun# EXPORT_SYMBOL(symbol); to build our dummy C file, and that gets preprocessed 311*4882a593Smuzhiyun# to make the genksyms input. 312*4882a593Smuzhiyun# 313*4882a593Smuzhiyun# These mirror gensymtypes_c and co above, keep them in synch. 314*4882a593Smuzhiyuncmd_gensymtypes_S = \ 315*4882a593Smuzhiyun (echo "\#include <linux/kernel.h>" ; \ 316*4882a593Smuzhiyun echo "\#include <asm/asm-prototypes.h>" ; \ 317*4882a593Smuzhiyun $(CPP) $(a_flags) $< | \ 318*4882a593Smuzhiyun grep "\<___EXPORT_SYMBOL\>" | \ 319*4882a593Smuzhiyun sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ) | \ 320*4882a593Smuzhiyun $(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \ 321*4882a593Smuzhiyun $(GENKSYMS) $(if $(1), -T $(2)) \ 322*4882a593Smuzhiyun $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \ 323*4882a593Smuzhiyun $(if $(KBUILD_PRESERVE),-p) \ 324*4882a593Smuzhiyun -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null)) 325*4882a593Smuzhiyun 326*4882a593Smuzhiyunquiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@ 327*4882a593Smuzhiyuncmd_cc_symtypes_S = \ 328*4882a593Smuzhiyun set -e; \ 329*4882a593Smuzhiyun $(call cmd_gensymtypes_S,true,$@) >/dev/null; \ 330*4882a593Smuzhiyun test -s $@ || rm -f $@ 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun$(obj)/%.symtypes : $(src)/%.S FORCE 333*4882a593Smuzhiyun $(call cmd,cc_symtypes_S) 334*4882a593Smuzhiyun 335*4882a593Smuzhiyunquiet_cmd_as_s_S = CPP $(quiet_modtag) $@ 336*4882a593Smuzhiyuncmd_as_s_S = $(CPP) $(a_flags) -o $@ $< 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun$(obj)/%.s: $(src)/%.S FORCE 339*4882a593Smuzhiyun $(call if_changed_dep,as_s_S) 340*4882a593Smuzhiyun 341*4882a593Smuzhiyunquiet_cmd_as_o_S = AS $(quiet_modtag) $@ 342*4882a593Smuzhiyun 343*4882a593Smuzhiyunifndef CONFIG_MODVERSIONS 344*4882a593Smuzhiyuncmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< 345*4882a593Smuzhiyun 346*4882a593Smuzhiyunelse 347*4882a593Smuzhiyun 348*4882a593SmuzhiyunASM_PROTOTYPES := $(wildcard $(srctree)/arch/$(SRCARCH)/include/asm/asm-prototypes.h) 349*4882a593Smuzhiyun 350*4882a593Smuzhiyunifeq ($(ASM_PROTOTYPES),) 351*4882a593Smuzhiyuncmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< 352*4882a593Smuzhiyun 353*4882a593Smuzhiyunelse 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun# versioning matches the C process described above, with difference that 356*4882a593Smuzhiyun# we parse asm-prototypes.h C header to get function definitions. 357*4882a593Smuzhiyun 358*4882a593Smuzhiyuncmd_as_o_S = $(CC) $(a_flags) -c -o $(@D)/.tmp_$(@F) $< 359*4882a593Smuzhiyun 360*4882a593Smuzhiyuncmd_modversions_S = \ 361*4882a593Smuzhiyun if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ 362*4882a593Smuzhiyun $(call cmd_gensymtypes_S,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ 363*4882a593Smuzhiyun > $(@D)/.tmp_$(@F:.o=.ver); \ 364*4882a593Smuzhiyun \ 365*4882a593Smuzhiyun $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ 366*4882a593Smuzhiyun -T $(@D)/.tmp_$(@F:.o=.ver); \ 367*4882a593Smuzhiyun rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \ 368*4882a593Smuzhiyun else \ 369*4882a593Smuzhiyun mv -f $(@D)/.tmp_$(@F) $@; \ 370*4882a593Smuzhiyun fi; 371*4882a593Smuzhiyunendif 372*4882a593Smuzhiyunendif 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun$(obj)/%.o: $(src)/%.S FORCE 375*4882a593Smuzhiyun $(call if_changed_rule,as_o_S) 376*4882a593Smuzhiyun 377*4882a593Smuzhiyuntargets += $(real-objs-y) $(real-objs-m) $(lib-y) 378*4882a593Smuzhiyuntargets += $(extra-y) $(MAKECMDGOALS) $(always) 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun# Linker scripts preprocessor (.lds.S -> .lds) 381*4882a593Smuzhiyun# --------------------------------------------------------------------------- 382*4882a593Smuzhiyunquiet_cmd_cpp_lds_S = LDS $@ 383*4882a593Smuzhiyun cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \ 384*4882a593Smuzhiyun -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $< 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun$(obj)/%.lds: $(src)/%.lds.S FORCE 387*4882a593Smuzhiyun $(call if_changed_dep,cpp_lds_S) 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun# ASN.1 grammar 390*4882a593Smuzhiyun# --------------------------------------------------------------------------- 391*4882a593Smuzhiyunquiet_cmd_asn1_compiler = ASN.1 $@ 392*4882a593Smuzhiyun cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \ 393*4882a593Smuzhiyun $(subst .h,.c,$@) $(subst .c,.h,$@) 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun.PRECIOUS: $(objtree)/$(obj)/%-asn1.c $(objtree)/$(obj)/%-asn1.h 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun$(obj)/%-asn1.c $(obj)/%-asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler 398*4882a593Smuzhiyun $(call cmd,asn1_compiler) 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun# Build the compiled-in targets 401*4882a593Smuzhiyun# --------------------------------------------------------------------------- 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun# To build objects in subdirs, we need to descend into the directories 404*4882a593Smuzhiyun$(sort $(subdir-obj-y)): $(subdir-ym) ; 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun# 407*4882a593Smuzhiyun# Rule to compile a set of .o files into one .o file 408*4882a593Smuzhiyun# 409*4882a593Smuzhiyunifdef builtin-target 410*4882a593Smuzhiyunquiet_cmd_link_o_target = LD $@ 411*4882a593Smuzhiyun# If the list of objects to link is empty, just create an empty built-in.o 412*4882a593Smuzhiyuncmd_link_o_target = $(if $(strip $(obj-y)),\ 413*4882a593Smuzhiyun $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \ 414*4882a593Smuzhiyun $(cmd_secanalysis),\ 415*4882a593Smuzhiyun rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@) 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun$(builtin-target): $(obj-y) FORCE 418*4882a593Smuzhiyun $(call if_changed,link_o_target) 419*4882a593Smuzhiyun 420*4882a593Smuzhiyuntargets += $(builtin-target) 421*4882a593Smuzhiyunendif # builtin-target 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun# 424*4882a593Smuzhiyun# Rule to create modules.order file 425*4882a593Smuzhiyun# 426*4882a593Smuzhiyun# Create commands to either record .ko file or cat modules.order from 427*4882a593Smuzhiyun# a subdirectory 428*4882a593Smuzhiyunmodorder-cmds = \ 429*4882a593Smuzhiyun $(foreach m, $(modorder), \ 430*4882a593Smuzhiyun $(if $(filter %/modules.order, $m), \ 431*4882a593Smuzhiyun cat $m;, echo kernel/$m;)) 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun$(modorder-target): $(subdir-ym) FORCE 434*4882a593Smuzhiyun $(Q)(cat /dev/null; $(modorder-cmds)) > $@ 435*4882a593Smuzhiyun 436*4882a593Smuzhiyun# 437*4882a593Smuzhiyun# Rule to compile a set of .o files into one .a file 438*4882a593Smuzhiyun# 439*4882a593Smuzhiyunifdef lib-target 440*4882a593Smuzhiyunquiet_cmd_link_l_target = AR $@ 441*4882a593Smuzhiyuncmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(lib-y) 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun$(lib-target): $(lib-y) FORCE 444*4882a593Smuzhiyun $(call if_changed,link_l_target) 445*4882a593Smuzhiyun 446*4882a593Smuzhiyuntargets += $(lib-target) 447*4882a593Smuzhiyunendif 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun# 450*4882a593Smuzhiyun# Rule to link composite objects 451*4882a593Smuzhiyun# 452*4882a593Smuzhiyun# Composite objects are specified in kbuild makefile as follows: 453*4882a593Smuzhiyun# <composite-object>-objs := <list of .o files> 454*4882a593Smuzhiyun# or 455*4882a593Smuzhiyun# <composite-object>-y := <list of .o files> 456*4882a593Smuzhiyunlink_multi_deps = \ 457*4882a593Smuzhiyun$(filter $(addprefix $(obj)/, \ 458*4882a593Smuzhiyun$($(subst $(obj)/,,$(@:.o=-objs))) \ 459*4882a593Smuzhiyun$($(subst $(obj)/,,$(@:.o=-y)))), $^) 460*4882a593Smuzhiyun 461*4882a593Smuzhiyunquiet_cmd_link_multi-y = LD $@ 462*4882a593Smuzhiyuncmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis) 463*4882a593Smuzhiyun 464*4882a593Smuzhiyunquiet_cmd_link_multi-m = LD [M] $@ 465*4882a593Smuzhiyuncmd_link_multi-m = $(cmd_link_multi-y) 466*4882a593Smuzhiyun 467*4882a593Smuzhiyun$(multi-used-y): FORCE 468*4882a593Smuzhiyun $(call if_changed,link_multi-y) 469*4882a593Smuzhiyun$(call multi_depend, $(multi-used-y), .o, -objs -y) 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun$(multi-used-m): FORCE 472*4882a593Smuzhiyun $(call if_changed,link_multi-m) 473*4882a593Smuzhiyun @{ echo $(@:.o=.ko); echo $(link_multi_deps); } > $(MODVERDIR)/$(@F:.o=.mod) 474*4882a593Smuzhiyun$(call multi_depend, $(multi-used-m), .o, -objs -y) 475*4882a593Smuzhiyun 476*4882a593Smuzhiyuntargets += $(multi-used-y) $(multi-used-m) 477*4882a593Smuzhiyun 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun# Descending 480*4882a593Smuzhiyun# --------------------------------------------------------------------------- 481*4882a593Smuzhiyun 482*4882a593SmuzhiyunPHONY += $(subdir-ym) 483*4882a593Smuzhiyun$(subdir-ym): 484*4882a593Smuzhiyun $(Q)$(MAKE) $(build)=$@ 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun# Add FORCE to the prequisites of a target to force it to be always rebuilt. 487*4882a593Smuzhiyun# --------------------------------------------------------------------------- 488*4882a593Smuzhiyun 489*4882a593SmuzhiyunPHONY += FORCE 490*4882a593Smuzhiyun 491*4882a593SmuzhiyunFORCE: 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun# Read all saved command lines and dependencies for the $(targets) we 494*4882a593Smuzhiyun# may be building above, using $(if_changed{,_dep}). As an 495*4882a593Smuzhiyun# optimization, we don't need to read them if the target does not 496*4882a593Smuzhiyun# exist, we will rebuild anyway in that case. 497*4882a593Smuzhiyun 498*4882a593Smuzhiyuntargets := $(wildcard $(sort $(targets))) 499*4882a593Smuzhiyuncmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) 500*4882a593Smuzhiyun 501*4882a593Smuzhiyunifneq ($(cmd_files),) 502*4882a593Smuzhiyun include $(cmd_files) 503*4882a593Smuzhiyunendif 504*4882a593Smuzhiyun 505*4882a593Smuzhiyun# Declare the contents of the .PHONY variable as phony. We keep that 506*4882a593Smuzhiyun# information in a variable se we can use it in if_changed and friends. 507*4882a593Smuzhiyun 508*4882a593Smuzhiyun.PHONY: $(PHONY) 509