122433fc5SMasahiro Yamada# ========================================================================== 222433fc5SMasahiro Yamada# Building 322433fc5SMasahiro Yamada# ========================================================================== 422433fc5SMasahiro Yamada 5*6825a95bSMasahiro Yamada# Modified for U-Boot 6*6825a95bSMasahiro Yamadaifeq ($(CONFIG_TPL_BUILD),y) 7*6825a95bSMasahiro Yamada src := $(patsubst tpl/%,%,$(obj)) 8*6825a95bSMasahiro Yamadaelse 9*6825a95bSMasahiro Yamada ifeq ($(CONFIG_SPL_BUILD),y) 10*6825a95bSMasahiro Yamada src := $(patsubst spl/%,%,$(obj)) 11*6825a95bSMasahiro Yamada else 1222433fc5SMasahiro Yamada src := $(obj) 13*6825a95bSMasahiro Yamada endif 14*6825a95bSMasahiro Yamadaendif 1522433fc5SMasahiro Yamada 1622433fc5SMasahiro YamadaPHONY := __build 1722433fc5SMasahiro Yamada__build: 1822433fc5SMasahiro Yamada 1922433fc5SMasahiro Yamada# Init all relevant variables used in kbuild files so 2022433fc5SMasahiro Yamada# 1) they have correct type 2122433fc5SMasahiro Yamada# 2) they do not inherit any value from the environment 2222433fc5SMasahiro Yamadaobj-y := 2322433fc5SMasahiro Yamadaobj-m := 2422433fc5SMasahiro Yamadalib-y := 2522433fc5SMasahiro Yamadalib-m := 2622433fc5SMasahiro Yamadaalways := 2722433fc5SMasahiro Yamadatargets := 2822433fc5SMasahiro Yamadasubdir-y := 2922433fc5SMasahiro Yamadasubdir-m := 3022433fc5SMasahiro YamadaEXTRA_AFLAGS := 3122433fc5SMasahiro YamadaEXTRA_CFLAGS := 3222433fc5SMasahiro YamadaEXTRA_CPPFLAGS := 3322433fc5SMasahiro YamadaEXTRA_LDFLAGS := 3422433fc5SMasahiro Yamadaasflags-y := 3522433fc5SMasahiro Yamadaccflags-y := 3622433fc5SMasahiro Yamadacppflags-y := 3722433fc5SMasahiro Yamadaldflags-y := 3822433fc5SMasahiro Yamada 3922433fc5SMasahiro Yamadasubdir-asflags-y := 4022433fc5SMasahiro Yamadasubdir-ccflags-y := 4122433fc5SMasahiro Yamada 4222433fc5SMasahiro Yamada# Read auto.conf if it exists, otherwise ignore 4322433fc5SMasahiro Yamada-include include/config/auto.conf 4422433fc5SMasahiro Yamada 4522433fc5SMasahiro Yamadainclude scripts/Kbuild.include 4622433fc5SMasahiro Yamada 47*6825a95bSMasahiro Yamada# Added for U-Boot 48*6825a95bSMasahiro Yamada# We must include config.mk after Kbuild.include 49*6825a95bSMasahiro Yamada# so that some config.mk can use cc-option. 50*6825a95bSMasahiro Yamadainclude config.mk 51*6825a95bSMasahiro Yamada 5222433fc5SMasahiro Yamada# For backward compatibility check that these variables do not change 5322433fc5SMasahiro Yamadasave-cflags := $(CFLAGS) 5422433fc5SMasahiro Yamada 5522433fc5SMasahiro Yamada# The filename Kbuild has precedence over Makefile 5622433fc5SMasahiro Yamadakbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) 5722433fc5SMasahiro Yamadakbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) 5822433fc5SMasahiro Yamadainclude $(kbuild-file) 5922433fc5SMasahiro Yamada 6022433fc5SMasahiro Yamada# If the save-* variables changed error out 6122433fc5SMasahiro Yamadaifeq ($(KBUILD_NOPEDANTIC),) 6222433fc5SMasahiro Yamada ifneq ("$(save-cflags)","$(CFLAGS)") 6322433fc5SMasahiro Yamada $(error CFLAGS was changed in "$(kbuild-file)". Fix it to use ccflags-y) 6422433fc5SMasahiro Yamada endif 6522433fc5SMasahiro Yamadaendif 6622433fc5SMasahiro Yamada 6722433fc5SMasahiro Yamada# 6822433fc5SMasahiro Yamada# make W=... settings 6922433fc5SMasahiro Yamada# 7022433fc5SMasahiro Yamada# W=1 - warnings that may be relevant and does not occur too often 7122433fc5SMasahiro Yamada# W=2 - warnings that occur quite often but may still be relevant 7222433fc5SMasahiro Yamada# W=3 - the more obscure warnings, can most likely be ignored 7322433fc5SMasahiro Yamada# 7422433fc5SMasahiro Yamada# $(call cc-option, -W...) handles gcc -W.. options which 7522433fc5SMasahiro Yamada# are not supported by all versions of the compiler 7622433fc5SMasahiro Yamadaifdef KBUILD_ENABLE_EXTRA_GCC_CHECKS 7722433fc5SMasahiro Yamadawarning- := $(empty) 7822433fc5SMasahiro Yamada 7922433fc5SMasahiro Yamadawarning-1 := -Wextra -Wunused -Wno-unused-parameter 8022433fc5SMasahiro Yamadawarning-1 += -Wmissing-declarations 8122433fc5SMasahiro Yamadawarning-1 += -Wmissing-format-attribute 8222433fc5SMasahiro Yamadawarning-1 += -Wmissing-prototypes 8322433fc5SMasahiro Yamadawarning-1 += -Wold-style-definition 8422433fc5SMasahiro Yamadawarning-1 += $(call cc-option, -Wmissing-include-dirs) 8522433fc5SMasahiro Yamadawarning-1 += $(call cc-option, -Wunused-but-set-variable) 8622433fc5SMasahiro Yamadawarning-1 += $(call cc-disable-warning, missing-field-initializers) 8722433fc5SMasahiro Yamada 8822433fc5SMasahiro Yamadawarning-2 := -Waggregate-return 8922433fc5SMasahiro Yamadawarning-2 += -Wcast-align 9022433fc5SMasahiro Yamadawarning-2 += -Wdisabled-optimization 9122433fc5SMasahiro Yamadawarning-2 += -Wnested-externs 9222433fc5SMasahiro Yamadawarning-2 += -Wshadow 9322433fc5SMasahiro Yamadawarning-2 += $(call cc-option, -Wlogical-op) 9422433fc5SMasahiro Yamadawarning-2 += $(call cc-option, -Wmissing-field-initializers) 9522433fc5SMasahiro Yamada 9622433fc5SMasahiro Yamadawarning-3 := -Wbad-function-cast 9722433fc5SMasahiro Yamadawarning-3 += -Wcast-qual 9822433fc5SMasahiro Yamadawarning-3 += -Wconversion 9922433fc5SMasahiro Yamadawarning-3 += -Wpacked 10022433fc5SMasahiro Yamadawarning-3 += -Wpadded 10122433fc5SMasahiro Yamadawarning-3 += -Wpointer-arith 10222433fc5SMasahiro Yamadawarning-3 += -Wredundant-decls 10322433fc5SMasahiro Yamadawarning-3 += -Wswitch-default 10422433fc5SMasahiro Yamadawarning-3 += $(call cc-option, -Wpacked-bitfield-compat) 10522433fc5SMasahiro Yamadawarning-3 += $(call cc-option, -Wvla) 10622433fc5SMasahiro Yamada 10722433fc5SMasahiro Yamadawarning := $(warning-$(findstring 1, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS))) 10822433fc5SMasahiro Yamadawarning += $(warning-$(findstring 2, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS))) 10922433fc5SMasahiro Yamadawarning += $(warning-$(findstring 3, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS))) 11022433fc5SMasahiro Yamada 11122433fc5SMasahiro Yamadaifeq ("$(strip $(warning))","") 11222433fc5SMasahiro Yamada $(error W=$(KBUILD_ENABLE_EXTRA_GCC_CHECKS) is unknown) 11322433fc5SMasahiro Yamadaendif 11422433fc5SMasahiro Yamada 11522433fc5SMasahiro YamadaKBUILD_CFLAGS += $(warning) 11622433fc5SMasahiro Yamadaendif 11722433fc5SMasahiro Yamada 11822433fc5SMasahiro Yamadainclude scripts/Makefile.lib 11922433fc5SMasahiro Yamada 12022433fc5SMasahiro Yamadaifdef host-progs 12122433fc5SMasahiro Yamadaifneq ($(hostprogs-y),$(host-progs)) 12222433fc5SMasahiro Yamada$(warning kbuild: $(obj)/Makefile - Usage of host-progs is deprecated. Please replace with hostprogs-y!) 12322433fc5SMasahiro Yamadahostprogs-y += $(host-progs) 12422433fc5SMasahiro Yamadaendif 12522433fc5SMasahiro Yamadaendif 12622433fc5SMasahiro Yamada 12722433fc5SMasahiro Yamada# Do not include host rules unless needed 12822433fc5SMasahiro Yamadaifneq ($(hostprogs-y)$(hostprogs-m),) 12922433fc5SMasahiro Yamadainclude scripts/Makefile.host 13022433fc5SMasahiro Yamadaendif 13122433fc5SMasahiro Yamada 132*6825a95bSMasahiro Yamada# Uncommented for U-Boot 133*6825a95bSMasahiro Yamada# We need to create output dicrectory for SPL and TPL even for in-tree build 134*6825a95bSMasahiro Yamada#ifneq ($(KBUILD_SRC),) 13522433fc5SMasahiro Yamada# Create output directory if not already present 13622433fc5SMasahiro Yamada_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj)) 13722433fc5SMasahiro Yamada 13822433fc5SMasahiro Yamada# Create directories for object files if directory does not exist 13922433fc5SMasahiro Yamada# Needed when obj-y := dir/file.o syntax is used 14022433fc5SMasahiro Yamada_dummy := $(foreach d,$(obj-dirs), $(shell [ -d $(d) ] || mkdir -p $(d))) 141*6825a95bSMasahiro Yamada#endif 14222433fc5SMasahiro Yamada 14322433fc5SMasahiro Yamadaifndef obj 14422433fc5SMasahiro Yamada$(warning kbuild: Makefile.build is included improperly) 14522433fc5SMasahiro Yamadaendif 14622433fc5SMasahiro Yamada 14722433fc5SMasahiro Yamada# =========================================================================== 14822433fc5SMasahiro Yamada 14922433fc5SMasahiro Yamadaifneq ($(strip $(lib-y) $(lib-m) $(lib-n) $(lib-)),) 15022433fc5SMasahiro Yamadalib-target := $(obj)/lib.a 15122433fc5SMasahiro Yamadaendif 15222433fc5SMasahiro Yamada 15322433fc5SMasahiro Yamadaifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(subdir-m) $(lib-target)),) 15422433fc5SMasahiro Yamadabuiltin-target := $(obj)/built-in.o 15522433fc5SMasahiro Yamadaendif 15622433fc5SMasahiro Yamada 15722433fc5SMasahiro Yamadamodorder-target := $(obj)/modules.order 15822433fc5SMasahiro Yamada 15922433fc5SMasahiro Yamada# We keep a list of all modules in $(MODVERDIR) 16022433fc5SMasahiro Yamada 16122433fc5SMasahiro Yamada__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \ 16222433fc5SMasahiro Yamada $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \ 16322433fc5SMasahiro Yamada $(subdir-ym) $(always) 16422433fc5SMasahiro Yamada @: 16522433fc5SMasahiro Yamada 16622433fc5SMasahiro Yamada# Linus' kernel sanity checking tool 16722433fc5SMasahiro Yamadaifneq ($(KBUILD_CHECKSRC),0) 16822433fc5SMasahiro Yamada ifeq ($(KBUILD_CHECKSRC),2) 16922433fc5SMasahiro Yamada quiet_cmd_force_checksrc = CHECK $< 17022433fc5SMasahiro Yamada cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ; 17122433fc5SMasahiro Yamada else 17222433fc5SMasahiro Yamada quiet_cmd_checksrc = CHECK $< 17322433fc5SMasahiro Yamada cmd_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ; 17422433fc5SMasahiro Yamada endif 17522433fc5SMasahiro Yamadaendif 17622433fc5SMasahiro Yamada 17722433fc5SMasahiro Yamada# Do section mismatch analysis for each module/built-in.o 17822433fc5SMasahiro Yamadaifdef CONFIG_DEBUG_SECTION_MISMATCH 17922433fc5SMasahiro Yamada cmd_secanalysis = ; scripts/mod/modpost $@ 18022433fc5SMasahiro Yamadaendif 18122433fc5SMasahiro Yamada 18222433fc5SMasahiro Yamada# Compile C sources (.c) 18322433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 18422433fc5SMasahiro Yamada 18522433fc5SMasahiro Yamada# Default is built-in, unless we know otherwise 18622433fc5SMasahiro Yamadamodkern_cflags = \ 18722433fc5SMasahiro Yamada $(if $(part-of-module), \ 18822433fc5SMasahiro Yamada $(KBUILD_CFLAGS_MODULE) $(CFLAGS_MODULE), \ 18922433fc5SMasahiro Yamada $(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL)) 19022433fc5SMasahiro Yamadaquiet_modtag := $(empty) $(empty) 19122433fc5SMasahiro Yamada 19222433fc5SMasahiro Yamada$(real-objs-m) : part-of-module := y 19322433fc5SMasahiro Yamada$(real-objs-m:.o=.i) : part-of-module := y 19422433fc5SMasahiro Yamada$(real-objs-m:.o=.s) : part-of-module := y 19522433fc5SMasahiro Yamada$(real-objs-m:.o=.lst): part-of-module := y 19622433fc5SMasahiro Yamada 19722433fc5SMasahiro Yamada$(real-objs-m) : quiet_modtag := [M] 19822433fc5SMasahiro Yamada$(real-objs-m:.o=.i) : quiet_modtag := [M] 19922433fc5SMasahiro Yamada$(real-objs-m:.o=.s) : quiet_modtag := [M] 20022433fc5SMasahiro Yamada$(real-objs-m:.o=.lst): quiet_modtag := [M] 20122433fc5SMasahiro Yamada 20222433fc5SMasahiro Yamada$(obj-m) : quiet_modtag := [M] 20322433fc5SMasahiro Yamada 20422433fc5SMasahiro Yamada# Default for not multi-part modules 20522433fc5SMasahiro Yamadamodname = $(basetarget) 20622433fc5SMasahiro Yamada 20722433fc5SMasahiro Yamada$(multi-objs-m) : modname = $(modname-multi) 20822433fc5SMasahiro Yamada$(multi-objs-m:.o=.i) : modname = $(modname-multi) 20922433fc5SMasahiro Yamada$(multi-objs-m:.o=.s) : modname = $(modname-multi) 21022433fc5SMasahiro Yamada$(multi-objs-m:.o=.lst) : modname = $(modname-multi) 21122433fc5SMasahiro Yamada$(multi-objs-y) : modname = $(modname-multi) 21222433fc5SMasahiro Yamada$(multi-objs-y:.o=.i) : modname = $(modname-multi) 21322433fc5SMasahiro Yamada$(multi-objs-y:.o=.s) : modname = $(modname-multi) 21422433fc5SMasahiro Yamada$(multi-objs-y:.o=.lst) : modname = $(modname-multi) 21522433fc5SMasahiro Yamada 21622433fc5SMasahiro Yamadaquiet_cmd_cc_s_c = CC $(quiet_modtag) $@ 21722433fc5SMasahiro Yamadacmd_cc_s_c = $(CC) $(c_flags) -fverbose-asm -S -o $@ $< 21822433fc5SMasahiro Yamada 21922433fc5SMasahiro Yamada$(obj)/%.s: $(src)/%.c FORCE 22022433fc5SMasahiro Yamada $(call if_changed_dep,cc_s_c) 22122433fc5SMasahiro Yamada 22222433fc5SMasahiro Yamadaquiet_cmd_cc_i_c = CPP $(quiet_modtag) $@ 22322433fc5SMasahiro Yamadacmd_cc_i_c = $(CPP) $(c_flags) -o $@ $< 22422433fc5SMasahiro Yamada 22522433fc5SMasahiro Yamada$(obj)/%.i: $(src)/%.c FORCE 22622433fc5SMasahiro Yamada $(call if_changed_dep,cc_i_c) 22722433fc5SMasahiro Yamada 22822433fc5SMasahiro Yamadacmd_gensymtypes = \ 22922433fc5SMasahiro Yamada $(CPP) -D__GENKSYMS__ $(c_flags) $< | \ 23022433fc5SMasahiro Yamada $(GENKSYMS) $(if $(1), -T $(2)) \ 23122433fc5SMasahiro Yamada $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \ 23222433fc5SMasahiro Yamada $(if $(KBUILD_PRESERVE),-p) \ 23322433fc5SMasahiro Yamada -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null)) 23422433fc5SMasahiro Yamada 23522433fc5SMasahiro Yamadaquiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@ 23622433fc5SMasahiro Yamadacmd_cc_symtypes_c = \ 23722433fc5SMasahiro Yamada set -e; \ 23822433fc5SMasahiro Yamada $(call cmd_gensymtypes,true,$@) >/dev/null; \ 23922433fc5SMasahiro Yamada test -s $@ || rm -f $@ 24022433fc5SMasahiro Yamada 24122433fc5SMasahiro Yamada$(obj)/%.symtypes : $(src)/%.c FORCE 24222433fc5SMasahiro Yamada $(call cmd,cc_symtypes_c) 24322433fc5SMasahiro Yamada 24422433fc5SMasahiro Yamada# C (.c) files 24522433fc5SMasahiro Yamada# The C file is compiled and updated dependency information is generated. 24622433fc5SMasahiro Yamada# (See cmd_cc_o_c + relevant part of rule_cc_o_c) 24722433fc5SMasahiro Yamada 24822433fc5SMasahiro Yamadaquiet_cmd_cc_o_c = CC $(quiet_modtag) $@ 24922433fc5SMasahiro Yamada 25022433fc5SMasahiro Yamadaifndef CONFIG_MODVERSIONS 25122433fc5SMasahiro Yamadacmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< 25222433fc5SMasahiro Yamada 25322433fc5SMasahiro Yamadaelse 25422433fc5SMasahiro Yamada# When module versioning is enabled the following steps are executed: 25522433fc5SMasahiro Yamada# o compile a .tmp_<file>.o from <file>.c 25622433fc5SMasahiro Yamada# o if .tmp_<file>.o doesn't contain a __ksymtab version, i.e. does 25722433fc5SMasahiro Yamada# not export symbols, we just rename .tmp_<file>.o to <file>.o and 25822433fc5SMasahiro Yamada# are done. 25922433fc5SMasahiro Yamada# o otherwise, we calculate symbol versions using the good old 26022433fc5SMasahiro Yamada# genksyms on the preprocessed source and postprocess them in a way 26122433fc5SMasahiro Yamada# that they are usable as a linker script 26222433fc5SMasahiro Yamada# o generate <file>.o from .tmp_<file>.o using the linker to 26322433fc5SMasahiro Yamada# replace the unresolved symbols __crc_exported_symbol with 26422433fc5SMasahiro Yamada# the actual value of the checksum generated by genksyms 26522433fc5SMasahiro Yamada 26622433fc5SMasahiro Yamadacmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $< 26722433fc5SMasahiro Yamadacmd_modversions = \ 26822433fc5SMasahiro Yamada if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ 26922433fc5SMasahiro Yamada $(call cmd_gensymtypes,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ 27022433fc5SMasahiro Yamada > $(@D)/.tmp_$(@F:.o=.ver); \ 27122433fc5SMasahiro Yamada \ 27222433fc5SMasahiro Yamada $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ 27322433fc5SMasahiro Yamada -T $(@D)/.tmp_$(@F:.o=.ver); \ 27422433fc5SMasahiro Yamada rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \ 27522433fc5SMasahiro Yamada else \ 27622433fc5SMasahiro Yamada mv -f $(@D)/.tmp_$(@F) $@; \ 27722433fc5SMasahiro Yamada fi; 27822433fc5SMasahiro Yamadaendif 27922433fc5SMasahiro Yamada 28022433fc5SMasahiro Yamadaifdef CONFIG_FTRACE_MCOUNT_RECORD 28122433fc5SMasahiro Yamadaifdef BUILD_C_RECORDMCOUNT 28222433fc5SMasahiro Yamadaifeq ("$(origin RECORDMCOUNT_WARN)", "command line") 28322433fc5SMasahiro Yamada RECORDMCOUNT_FLAGS = -w 28422433fc5SMasahiro Yamadaendif 28522433fc5SMasahiro Yamada# Due to recursion, we must skip empty.o. 28622433fc5SMasahiro Yamada# The empty.o file is created in the make process in order to determine 28722433fc5SMasahiro Yamada# the target endianness and word size. It is made before all other C 28822433fc5SMasahiro Yamada# files, including recordmcount. 28922433fc5SMasahiro Yamadasub_cmd_record_mcount = \ 29022433fc5SMasahiro Yamada if [ $(@) != "scripts/mod/empty.o" ]; then \ 29122433fc5SMasahiro Yamada $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)"; \ 29222433fc5SMasahiro Yamada fi; 29322433fc5SMasahiro Yamadarecordmcount_source := $(srctree)/scripts/recordmcount.c \ 29422433fc5SMasahiro Yamada $(srctree)/scripts/recordmcount.h 29522433fc5SMasahiro Yamadaelse 29622433fc5SMasahiro Yamadasub_cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \ 29722433fc5SMasahiro Yamada "$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \ 29822433fc5SMasahiro Yamada "$(if $(CONFIG_64BIT),64,32)" \ 29922433fc5SMasahiro Yamada "$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CFLAGS)" \ 30022433fc5SMasahiro Yamada "$(LD)" "$(NM)" "$(RM)" "$(MV)" \ 30122433fc5SMasahiro Yamada "$(if $(part-of-module),1,0)" "$(@)"; 30222433fc5SMasahiro Yamadarecordmcount_source := $(srctree)/scripts/recordmcount.pl 30322433fc5SMasahiro Yamadaendif 30422433fc5SMasahiro Yamadacmd_record_mcount = \ 30522433fc5SMasahiro Yamada if [ "$(findstring -pg,$(_c_flags))" = "-pg" ]; then \ 30622433fc5SMasahiro Yamada $(sub_cmd_record_mcount) \ 30722433fc5SMasahiro Yamada fi; 30822433fc5SMasahiro Yamadaendif 30922433fc5SMasahiro Yamada 31022433fc5SMasahiro Yamadadefine rule_cc_o_c 31122433fc5SMasahiro Yamada $(call echo-cmd,checksrc) $(cmd_checksrc) \ 31222433fc5SMasahiro Yamada $(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \ 31322433fc5SMasahiro Yamada $(cmd_modversions) \ 31422433fc5SMasahiro Yamada $(call echo-cmd,record_mcount) \ 31522433fc5SMasahiro Yamada $(cmd_record_mcount) \ 31622433fc5SMasahiro Yamada scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \ 31722433fc5SMasahiro Yamada $(dot-target).tmp; \ 31822433fc5SMasahiro Yamada rm -f $(depfile); \ 31922433fc5SMasahiro Yamada mv -f $(dot-target).tmp $(dot-target).cmd 32022433fc5SMasahiro Yamadaendef 32122433fc5SMasahiro Yamada 32222433fc5SMasahiro Yamada# Built-in and composite module parts 32322433fc5SMasahiro Yamada$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE 32422433fc5SMasahiro Yamada $(call cmd,force_checksrc) 32522433fc5SMasahiro Yamada $(call if_changed_rule,cc_o_c) 32622433fc5SMasahiro Yamada 32722433fc5SMasahiro Yamada# Single-part modules are special since we need to mark them in $(MODVERDIR) 32822433fc5SMasahiro Yamada 32922433fc5SMasahiro Yamada$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE 33022433fc5SMasahiro Yamada $(call cmd,force_checksrc) 33122433fc5SMasahiro Yamada $(call if_changed_rule,cc_o_c) 33222433fc5SMasahiro Yamada @{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod) 33322433fc5SMasahiro Yamada 33422433fc5SMasahiro Yamadaquiet_cmd_cc_lst_c = MKLST $@ 33522433fc5SMasahiro Yamada cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \ 33622433fc5SMasahiro Yamada $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \ 33722433fc5SMasahiro Yamada System.map $(OBJDUMP) > $@ 33822433fc5SMasahiro Yamada 33922433fc5SMasahiro Yamada$(obj)/%.lst: $(src)/%.c FORCE 34022433fc5SMasahiro Yamada $(call if_changed_dep,cc_lst_c) 34122433fc5SMasahiro Yamada 34222433fc5SMasahiro Yamada# Compile assembler sources (.S) 34322433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 34422433fc5SMasahiro Yamada 34522433fc5SMasahiro Yamadamodkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL) 34622433fc5SMasahiro Yamada 34722433fc5SMasahiro Yamada$(real-objs-m) : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE) 34822433fc5SMasahiro Yamada$(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE) 34922433fc5SMasahiro Yamada 35022433fc5SMasahiro Yamadaquiet_cmd_as_s_S = CPP $(quiet_modtag) $@ 35122433fc5SMasahiro Yamadacmd_as_s_S = $(CPP) $(a_flags) -o $@ $< 35222433fc5SMasahiro Yamada 35322433fc5SMasahiro Yamada$(obj)/%.s: $(src)/%.S FORCE 35422433fc5SMasahiro Yamada $(call if_changed_dep,as_s_S) 35522433fc5SMasahiro Yamada 35622433fc5SMasahiro Yamadaquiet_cmd_as_o_S = AS $(quiet_modtag) $@ 35722433fc5SMasahiro Yamadacmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< 35822433fc5SMasahiro Yamada 35922433fc5SMasahiro Yamada$(obj)/%.o: $(src)/%.S FORCE 36022433fc5SMasahiro Yamada $(call if_changed_dep,as_o_S) 36122433fc5SMasahiro Yamada 36222433fc5SMasahiro Yamadatargets += $(real-objs-y) $(real-objs-m) $(lib-y) 36322433fc5SMasahiro Yamadatargets += $(extra-y) $(MAKECMDGOALS) $(always) 36422433fc5SMasahiro Yamada 36522433fc5SMasahiro Yamada# Linker scripts preprocessor (.lds.S -> .lds) 36622433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 36722433fc5SMasahiro Yamadaquiet_cmd_cpp_lds_S = LDS $@ 36822433fc5SMasahiro Yamada cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \ 36922433fc5SMasahiro Yamada -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $< 37022433fc5SMasahiro Yamada 37122433fc5SMasahiro Yamada$(obj)/%.lds: $(src)/%.lds.S FORCE 37222433fc5SMasahiro Yamada $(call if_changed_dep,cpp_lds_S) 37322433fc5SMasahiro Yamada 37422433fc5SMasahiro Yamada# ASN.1 grammar 37522433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 37622433fc5SMasahiro Yamadaquiet_cmd_asn1_compiler = ASN.1 $@ 37722433fc5SMasahiro Yamada cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \ 37822433fc5SMasahiro Yamada $(subst .h,.c,$@) $(subst .c,.h,$@) 37922433fc5SMasahiro Yamada 38022433fc5SMasahiro Yamada.PRECIOUS: $(objtree)/$(obj)/%-asn1.c $(objtree)/$(obj)/%-asn1.h 38122433fc5SMasahiro Yamada 38222433fc5SMasahiro Yamada$(obj)/%-asn1.c $(obj)/%-asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler 38322433fc5SMasahiro Yamada $(call cmd,asn1_compiler) 38422433fc5SMasahiro Yamada 38522433fc5SMasahiro Yamada# Build the compiled-in targets 38622433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 38722433fc5SMasahiro Yamada 38822433fc5SMasahiro Yamada# To build objects in subdirs, we need to descend into the directories 38922433fc5SMasahiro Yamada$(sort $(subdir-obj-y)): $(subdir-ym) ; 39022433fc5SMasahiro Yamada 39122433fc5SMasahiro Yamada# 39222433fc5SMasahiro Yamada# Rule to compile a set of .o files into one .o file 39322433fc5SMasahiro Yamada# 39422433fc5SMasahiro Yamadaifdef builtin-target 39522433fc5SMasahiro Yamadaquiet_cmd_link_o_target = LD $@ 39622433fc5SMasahiro Yamada# If the list of objects to link is empty, just create an empty built-in.o 39722433fc5SMasahiro Yamadacmd_link_o_target = $(if $(strip $(obj-y)),\ 39822433fc5SMasahiro Yamada $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \ 39922433fc5SMasahiro Yamada $(cmd_secanalysis),\ 40022433fc5SMasahiro Yamada rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@) 40122433fc5SMasahiro Yamada 40222433fc5SMasahiro Yamada$(builtin-target): $(obj-y) FORCE 40322433fc5SMasahiro Yamada $(call if_changed,link_o_target) 40422433fc5SMasahiro Yamada 40522433fc5SMasahiro Yamadatargets += $(builtin-target) 40622433fc5SMasahiro Yamadaendif # builtin-target 40722433fc5SMasahiro Yamada 40822433fc5SMasahiro Yamada# 40922433fc5SMasahiro Yamada# Rule to create modules.order file 41022433fc5SMasahiro Yamada# 41122433fc5SMasahiro Yamada# Create commands to either record .ko file or cat modules.order from 41222433fc5SMasahiro Yamada# a subdirectory 41322433fc5SMasahiro Yamadamodorder-cmds = \ 41422433fc5SMasahiro Yamada $(foreach m, $(modorder), \ 41522433fc5SMasahiro Yamada $(if $(filter %/modules.order, $m), \ 41622433fc5SMasahiro Yamada cat $m;, echo kernel/$m;)) 41722433fc5SMasahiro Yamada 41822433fc5SMasahiro Yamada$(modorder-target): $(subdir-ym) FORCE 41922433fc5SMasahiro Yamada $(Q)(cat /dev/null; $(modorder-cmds)) > $@ 42022433fc5SMasahiro Yamada 42122433fc5SMasahiro Yamada# 42222433fc5SMasahiro Yamada# Rule to compile a set of .o files into one .a file 42322433fc5SMasahiro Yamada# 42422433fc5SMasahiro Yamadaifdef lib-target 42522433fc5SMasahiro Yamadaquiet_cmd_link_l_target = AR $@ 42622433fc5SMasahiro Yamadacmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(lib-y) 42722433fc5SMasahiro Yamada 42822433fc5SMasahiro Yamada$(lib-target): $(lib-y) FORCE 42922433fc5SMasahiro Yamada $(call if_changed,link_l_target) 43022433fc5SMasahiro Yamada 43122433fc5SMasahiro Yamadatargets += $(lib-target) 43222433fc5SMasahiro Yamadaendif 43322433fc5SMasahiro Yamada 43422433fc5SMasahiro Yamada# 43522433fc5SMasahiro Yamada# Rule to link composite objects 43622433fc5SMasahiro Yamada# 43722433fc5SMasahiro Yamada# Composite objects are specified in kbuild makefile as follows: 43822433fc5SMasahiro Yamada# <composite-object>-objs := <list of .o files> 43922433fc5SMasahiro Yamada# or 44022433fc5SMasahiro Yamada# <composite-object>-y := <list of .o files> 44122433fc5SMasahiro Yamadalink_multi_deps = \ 44222433fc5SMasahiro Yamada$(filter $(addprefix $(obj)/, \ 44322433fc5SMasahiro Yamada$($(subst $(obj)/,,$(@:.o=-objs))) \ 44422433fc5SMasahiro Yamada$($(subst $(obj)/,,$(@:.o=-y)))), $^) 44522433fc5SMasahiro Yamada 44622433fc5SMasahiro Yamadaquiet_cmd_link_multi-y = LD $@ 44722433fc5SMasahiro Yamadacmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis) 44822433fc5SMasahiro Yamada 44922433fc5SMasahiro Yamadaquiet_cmd_link_multi-m = LD [M] $@ 45022433fc5SMasahiro Yamadacmd_link_multi-m = $(cmd_link_multi-y) 45122433fc5SMasahiro Yamada 45222433fc5SMasahiro Yamada# We would rather have a list of rules like 45322433fc5SMasahiro Yamada# foo.o: $(foo-objs) 45422433fc5SMasahiro Yamada# but that's not so easy, so we rather make all composite objects depend 45522433fc5SMasahiro Yamada# on the set of all their parts 45622433fc5SMasahiro Yamada$(multi-used-y) : %.o: $(multi-objs-y) FORCE 45722433fc5SMasahiro Yamada $(call if_changed,link_multi-y) 45822433fc5SMasahiro Yamada 45922433fc5SMasahiro Yamada$(multi-used-m) : %.o: $(multi-objs-m) FORCE 46022433fc5SMasahiro Yamada $(call if_changed,link_multi-m) 46122433fc5SMasahiro Yamada @{ echo $(@:.o=.ko); echo $(link_multi_deps); } > $(MODVERDIR)/$(@F:.o=.mod) 46222433fc5SMasahiro Yamada 46322433fc5SMasahiro Yamadatargets += $(multi-used-y) $(multi-used-m) 46422433fc5SMasahiro Yamada 46522433fc5SMasahiro Yamada 46622433fc5SMasahiro Yamada# Descending 46722433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 46822433fc5SMasahiro Yamada 46922433fc5SMasahiro YamadaPHONY += $(subdir-ym) 47022433fc5SMasahiro Yamada$(subdir-ym): 47122433fc5SMasahiro Yamada $(Q)$(MAKE) $(build)=$@ 47222433fc5SMasahiro Yamada 47322433fc5SMasahiro Yamada# Add FORCE to the prequisites of a target to force it to be always rebuilt. 47422433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 47522433fc5SMasahiro Yamada 47622433fc5SMasahiro YamadaPHONY += FORCE 47722433fc5SMasahiro Yamada 47822433fc5SMasahiro YamadaFORCE: 47922433fc5SMasahiro Yamada 48022433fc5SMasahiro Yamada# Read all saved command lines and dependencies for the $(targets) we 48122433fc5SMasahiro Yamada# may be building above, using $(if_changed{,_dep}). As an 48222433fc5SMasahiro Yamada# optimization, we don't need to read them if the target does not 48322433fc5SMasahiro Yamada# exist, we will rebuild anyway in that case. 48422433fc5SMasahiro Yamada 48522433fc5SMasahiro Yamadatargets := $(wildcard $(sort $(targets))) 48622433fc5SMasahiro Yamadacmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) 48722433fc5SMasahiro Yamada 48822433fc5SMasahiro Yamadaifneq ($(cmd_files),) 48922433fc5SMasahiro Yamada include $(cmd_files) 49022433fc5SMasahiro Yamadaendif 49122433fc5SMasahiro Yamada 49222433fc5SMasahiro Yamada# Declare the contents of the .PHONY variable as phony. We keep that 49322433fc5SMasahiro Yamada# information in a variable se we can use it in if_changed and friends. 49422433fc5SMasahiro Yamada 49522433fc5SMasahiro Yamada.PHONY: $(PHONY) 496