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