183d290c5STom Rini# SPDX-License-Identifier: GPL-2.0 222433fc5SMasahiro Yamada# ========================================================================== 322433fc5SMasahiro Yamada# Building 422433fc5SMasahiro Yamada# ========================================================================== 522433fc5SMasahiro Yamada 66825a95bSMasahiro Yamada# Modified for U-Boot 751148790SMasahiro Yamadaprefix := tpl 851148790SMasahiro Yamadasrc := $(patsubst $(prefix)/%,%,$(obj)) 951148790SMasahiro Yamadaifeq ($(obj),$(src)) 1051148790SMasahiro Yamadaprefix := spl 1151148790SMasahiro Yamadasrc := $(patsubst $(prefix)/%,%,$(obj)) 1251148790SMasahiro Yamadaifeq ($(obj),$(src)) 1351148790SMasahiro Yamadaprefix := . 146825a95bSMasahiro Yamadaendif 156825a95bSMasahiro Yamadaendif 1622433fc5SMasahiro Yamada 1722433fc5SMasahiro YamadaPHONY := __build 1822433fc5SMasahiro Yamada__build: 1922433fc5SMasahiro Yamada 2022433fc5SMasahiro Yamada# Init all relevant variables used in kbuild files so 2122433fc5SMasahiro Yamada# 1) they have correct type 2222433fc5SMasahiro Yamada# 2) they do not inherit any value from the environment 2322433fc5SMasahiro Yamadaobj-y := 2422433fc5SMasahiro Yamadaobj-m := 2522433fc5SMasahiro Yamadalib-y := 2622433fc5SMasahiro Yamadalib-m := 2722433fc5SMasahiro Yamadaalways := 2822433fc5SMasahiro Yamadatargets := 2922433fc5SMasahiro Yamadasubdir-y := 3022433fc5SMasahiro Yamadasubdir-m := 3122433fc5SMasahiro YamadaEXTRA_AFLAGS := 3222433fc5SMasahiro YamadaEXTRA_CFLAGS := 3322433fc5SMasahiro YamadaEXTRA_CPPFLAGS := 3422433fc5SMasahiro YamadaEXTRA_LDFLAGS := 3522433fc5SMasahiro Yamadaasflags-y := 3622433fc5SMasahiro Yamadaccflags-y := 3722433fc5SMasahiro Yamadacppflags-y := 3822433fc5SMasahiro Yamadaldflags-y := 3922433fc5SMasahiro Yamada 4022433fc5SMasahiro Yamadasubdir-asflags-y := 4122433fc5SMasahiro Yamadasubdir-ccflags-y := 4222433fc5SMasahiro Yamada 4322433fc5SMasahiro Yamada# Read auto.conf if it exists, otherwise ignore 4451148790SMasahiro Yamada# Modified for U-Boot 45e02ee254SMasahiro Yamada-include include/config/auto.conf 4651148790SMasahiro Yamada-include $(prefix)/include/autoconf.mk 47e02ee254SMasahiro Yamadainclude scripts/Makefile.uncmd_spl 4801072b44SMasahiro Yamada 4922433fc5SMasahiro Yamadainclude scripts/Kbuild.include 5022433fc5SMasahiro Yamada 5122433fc5SMasahiro Yamada# For backward compatibility check that these variables do not change 5222433fc5SMasahiro Yamadasave-cflags := $(CFLAGS) 5322433fc5SMasahiro Yamada 5422433fc5SMasahiro Yamada# The filename Kbuild has precedence over Makefile 5522433fc5SMasahiro Yamadakbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) 5622433fc5SMasahiro Yamadakbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) 5722433fc5SMasahiro Yamadainclude $(kbuild-file) 5822433fc5SMasahiro Yamada 59026f9cf2SMasahiro Yamada# Added for U-Boot 60026f9cf2SMasahiro Yamadaasflags-y += $(PLATFORM_CPPFLAGS) 61026f9cf2SMasahiro Yamadaccflags-y += $(PLATFORM_CPPFLAGS) 62026f9cf2SMasahiro Yamadacppflags-y += $(PLATFORM_CPPFLAGS) 63026f9cf2SMasahiro Yamada 6422433fc5SMasahiro Yamada# If the save-* variables changed error out 6522433fc5SMasahiro Yamadaifeq ($(KBUILD_NOPEDANTIC),) 6622433fc5SMasahiro Yamada ifneq ("$(save-cflags)","$(CFLAGS)") 6722433fc5SMasahiro Yamada $(error CFLAGS was changed in "$(kbuild-file)". Fix it to use ccflags-y) 6822433fc5SMasahiro Yamada endif 6922433fc5SMasahiro Yamadaendif 7022433fc5SMasahiro Yamada 7122433fc5SMasahiro Yamadainclude scripts/Makefile.lib 7222433fc5SMasahiro Yamada 7322433fc5SMasahiro Yamadaifdef host-progs 7422433fc5SMasahiro Yamadaifneq ($(hostprogs-y),$(host-progs)) 7522433fc5SMasahiro Yamada$(warning kbuild: $(obj)/Makefile - Usage of host-progs is deprecated. Please replace with hostprogs-y!) 7622433fc5SMasahiro Yamadahostprogs-y += $(host-progs) 7722433fc5SMasahiro Yamadaendif 7822433fc5SMasahiro Yamadaendif 7922433fc5SMasahiro Yamada 8022433fc5SMasahiro Yamada# Do not include host rules unless needed 8122433fc5SMasahiro Yamadaifneq ($(hostprogs-y)$(hostprogs-m),) 8222433fc5SMasahiro Yamadainclude scripts/Makefile.host 8322433fc5SMasahiro Yamadaendif 8422433fc5SMasahiro Yamada 856825a95bSMasahiro Yamada# Uncommented for U-Boot 866825a95bSMasahiro Yamada# We need to create output dicrectory for SPL and TPL even for in-tree build 876825a95bSMasahiro Yamada#ifneq ($(KBUILD_SRC),) 8822433fc5SMasahiro Yamada# Create output directory if not already present 8922433fc5SMasahiro Yamada_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj)) 9022433fc5SMasahiro Yamada 9122433fc5SMasahiro Yamada# Create directories for object files if directory does not exist 9222433fc5SMasahiro Yamada# Needed when obj-y := dir/file.o syntax is used 9322433fc5SMasahiro Yamada_dummy := $(foreach d,$(obj-dirs), $(shell [ -d $(d) ] || mkdir -p $(d))) 946825a95bSMasahiro Yamada#endif 9522433fc5SMasahiro Yamada 9622433fc5SMasahiro Yamadaifndef obj 9722433fc5SMasahiro Yamada$(warning kbuild: Makefile.build is included improperly) 9822433fc5SMasahiro Yamadaendif 9922433fc5SMasahiro Yamada 10022433fc5SMasahiro Yamada# =========================================================================== 10122433fc5SMasahiro Yamada 102176d0982SMasahiro Yamadaifneq ($(strip $(lib-y) $(lib-m) $(lib-)),) 10322433fc5SMasahiro Yamadalib-target := $(obj)/lib.a 10422433fc5SMasahiro Yamadaendif 10522433fc5SMasahiro Yamada 106176d0982SMasahiro Yamadaifneq ($(strip $(obj-y) $(obj-m) $(obj-) $(subdir-m) $(lib-target)),) 10722433fc5SMasahiro Yamadabuiltin-target := $(obj)/built-in.o 10822433fc5SMasahiro Yamadaendif 10922433fc5SMasahiro Yamada 11022433fc5SMasahiro Yamadamodorder-target := $(obj)/modules.order 11122433fc5SMasahiro Yamada 11222433fc5SMasahiro Yamada# We keep a list of all modules in $(MODVERDIR) 11322433fc5SMasahiro Yamada 11422433fc5SMasahiro Yamada__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \ 11522433fc5SMasahiro Yamada $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \ 11622433fc5SMasahiro Yamada $(subdir-ym) $(always) 11722433fc5SMasahiro Yamada @: 11822433fc5SMasahiro Yamada 11922433fc5SMasahiro Yamada# Linus' kernel sanity checking tool 12022433fc5SMasahiro Yamadaifneq ($(KBUILD_CHECKSRC),0) 12122433fc5SMasahiro Yamada ifeq ($(KBUILD_CHECKSRC),2) 12222433fc5SMasahiro Yamada quiet_cmd_force_checksrc = CHECK $< 12322433fc5SMasahiro Yamada cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ; 12422433fc5SMasahiro Yamada else 12522433fc5SMasahiro Yamada quiet_cmd_checksrc = CHECK $< 12622433fc5SMasahiro Yamada cmd_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ; 12722433fc5SMasahiro Yamada endif 12822433fc5SMasahiro Yamadaendif 12922433fc5SMasahiro Yamada 13022433fc5SMasahiro Yamada# Do section mismatch analysis for each module/built-in.o 13122433fc5SMasahiro Yamadaifdef CONFIG_DEBUG_SECTION_MISMATCH 13222433fc5SMasahiro Yamada cmd_secanalysis = ; scripts/mod/modpost $@ 13322433fc5SMasahiro Yamadaendif 13422433fc5SMasahiro Yamada 13522433fc5SMasahiro Yamada# Compile C sources (.c) 13622433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 13722433fc5SMasahiro Yamada 13822433fc5SMasahiro Yamada# Default is built-in, unless we know otherwise 13922433fc5SMasahiro Yamadamodkern_cflags = \ 14022433fc5SMasahiro Yamada $(if $(part-of-module), \ 14122433fc5SMasahiro Yamada $(KBUILD_CFLAGS_MODULE) $(CFLAGS_MODULE), \ 14222433fc5SMasahiro Yamada $(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL)) 14322433fc5SMasahiro Yamadaquiet_modtag := $(empty) $(empty) 14422433fc5SMasahiro Yamada 14522433fc5SMasahiro Yamada$(real-objs-m) : part-of-module := y 14622433fc5SMasahiro Yamada$(real-objs-m:.o=.i) : part-of-module := y 14722433fc5SMasahiro Yamada$(real-objs-m:.o=.s) : part-of-module := y 14822433fc5SMasahiro Yamada$(real-objs-m:.o=.lst): part-of-module := y 14922433fc5SMasahiro Yamada 15022433fc5SMasahiro Yamada$(real-objs-m) : quiet_modtag := [M] 15122433fc5SMasahiro Yamada$(real-objs-m:.o=.i) : quiet_modtag := [M] 15222433fc5SMasahiro Yamada$(real-objs-m:.o=.s) : quiet_modtag := [M] 15322433fc5SMasahiro Yamada$(real-objs-m:.o=.lst): quiet_modtag := [M] 15422433fc5SMasahiro Yamada 15522433fc5SMasahiro Yamada$(obj-m) : quiet_modtag := [M] 15622433fc5SMasahiro Yamada 15722433fc5SMasahiro Yamada# Default for not multi-part modules 15822433fc5SMasahiro Yamadamodname = $(basetarget) 15922433fc5SMasahiro Yamada 16022433fc5SMasahiro Yamada$(multi-objs-m) : modname = $(modname-multi) 16122433fc5SMasahiro Yamada$(multi-objs-m:.o=.i) : modname = $(modname-multi) 16222433fc5SMasahiro Yamada$(multi-objs-m:.o=.s) : modname = $(modname-multi) 16322433fc5SMasahiro Yamada$(multi-objs-m:.o=.lst) : modname = $(modname-multi) 16422433fc5SMasahiro Yamada$(multi-objs-y) : modname = $(modname-multi) 16522433fc5SMasahiro Yamada$(multi-objs-y:.o=.i) : modname = $(modname-multi) 16622433fc5SMasahiro Yamada$(multi-objs-y:.o=.s) : modname = $(modname-multi) 16722433fc5SMasahiro Yamada$(multi-objs-y:.o=.lst) : modname = $(modname-multi) 16822433fc5SMasahiro Yamada 16922433fc5SMasahiro Yamadaquiet_cmd_cc_s_c = CC $(quiet_modtag) $@ 170598e2d33SMasahiro Yamadacmd_cc_s_c = $(CC) $(c_flags) $(DISABLE_LTO) -fverbose-asm -S -o $@ $< 17122433fc5SMasahiro Yamada 17222433fc5SMasahiro Yamada$(obj)/%.s: $(src)/%.c FORCE 17322433fc5SMasahiro Yamada $(call if_changed_dep,cc_s_c) 17422433fc5SMasahiro Yamada 17522433fc5SMasahiro Yamadaquiet_cmd_cc_i_c = CPP $(quiet_modtag) $@ 17622433fc5SMasahiro Yamadacmd_cc_i_c = $(CPP) $(c_flags) -o $@ $< 17722433fc5SMasahiro Yamada 17822433fc5SMasahiro Yamada$(obj)/%.i: $(src)/%.c FORCE 17922433fc5SMasahiro Yamada $(call if_changed_dep,cc_i_c) 18022433fc5SMasahiro Yamada 18122433fc5SMasahiro Yamadacmd_gensymtypes = \ 18222433fc5SMasahiro Yamada $(CPP) -D__GENKSYMS__ $(c_flags) $< | \ 18322433fc5SMasahiro Yamada $(GENKSYMS) $(if $(1), -T $(2)) \ 18422433fc5SMasahiro Yamada $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \ 18522433fc5SMasahiro Yamada $(if $(KBUILD_PRESERVE),-p) \ 18622433fc5SMasahiro Yamada -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null)) 18722433fc5SMasahiro Yamada 18822433fc5SMasahiro Yamadaquiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@ 18922433fc5SMasahiro Yamadacmd_cc_symtypes_c = \ 19022433fc5SMasahiro Yamada set -e; \ 19122433fc5SMasahiro Yamada $(call cmd_gensymtypes,true,$@) >/dev/null; \ 19222433fc5SMasahiro Yamada test -s $@ || rm -f $@ 19322433fc5SMasahiro Yamada 19422433fc5SMasahiro Yamada$(obj)/%.symtypes : $(src)/%.c FORCE 19522433fc5SMasahiro Yamada $(call cmd,cc_symtypes_c) 19622433fc5SMasahiro Yamada 19722433fc5SMasahiro Yamada# C (.c) files 19822433fc5SMasahiro Yamada# The C file is compiled and updated dependency information is generated. 19922433fc5SMasahiro Yamada# (See cmd_cc_o_c + relevant part of rule_cc_o_c) 20022433fc5SMasahiro Yamada 20122433fc5SMasahiro Yamadaquiet_cmd_cc_o_c = CC $(quiet_modtag) $@ 20222433fc5SMasahiro Yamada 20322433fc5SMasahiro Yamadaifndef CONFIG_MODVERSIONS 20422433fc5SMasahiro Yamadacmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< 20522433fc5SMasahiro Yamada 20622433fc5SMasahiro Yamadaelse 20722433fc5SMasahiro Yamada# When module versioning is enabled the following steps are executed: 20822433fc5SMasahiro Yamada# o compile a .tmp_<file>.o from <file>.c 20922433fc5SMasahiro Yamada# o if .tmp_<file>.o doesn't contain a __ksymtab version, i.e. does 21022433fc5SMasahiro Yamada# not export symbols, we just rename .tmp_<file>.o to <file>.o and 21122433fc5SMasahiro Yamada# are done. 21222433fc5SMasahiro Yamada# o otherwise, we calculate symbol versions using the good old 21322433fc5SMasahiro Yamada# genksyms on the preprocessed source and postprocess them in a way 21422433fc5SMasahiro Yamada# that they are usable as a linker script 21522433fc5SMasahiro Yamada# o generate <file>.o from .tmp_<file>.o using the linker to 21622433fc5SMasahiro Yamada# replace the unresolved symbols __crc_exported_symbol with 21722433fc5SMasahiro Yamada# the actual value of the checksum generated by genksyms 21822433fc5SMasahiro Yamada 21922433fc5SMasahiro Yamadacmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $< 22022433fc5SMasahiro Yamadacmd_modversions = \ 22122433fc5SMasahiro Yamada if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ 22222433fc5SMasahiro Yamada $(call cmd_gensymtypes,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ 22322433fc5SMasahiro Yamada > $(@D)/.tmp_$(@F:.o=.ver); \ 22422433fc5SMasahiro Yamada \ 22522433fc5SMasahiro Yamada $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ 22622433fc5SMasahiro Yamada -T $(@D)/.tmp_$(@F:.o=.ver); \ 22722433fc5SMasahiro Yamada rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \ 22822433fc5SMasahiro Yamada else \ 22922433fc5SMasahiro Yamada mv -f $(@D)/.tmp_$(@F) $@; \ 23022433fc5SMasahiro Yamada fi; 23122433fc5SMasahiro Yamadaendif 23222433fc5SMasahiro Yamada 23322433fc5SMasahiro Yamadaifdef CONFIG_FTRACE_MCOUNT_RECORD 23422433fc5SMasahiro Yamadaifdef BUILD_C_RECORDMCOUNT 23522433fc5SMasahiro Yamadaifeq ("$(origin RECORDMCOUNT_WARN)", "command line") 23622433fc5SMasahiro Yamada RECORDMCOUNT_FLAGS = -w 23722433fc5SMasahiro Yamadaendif 23822433fc5SMasahiro Yamada# Due to recursion, we must skip empty.o. 23922433fc5SMasahiro Yamada# The empty.o file is created in the make process in order to determine 24022433fc5SMasahiro Yamada# the target endianness and word size. It is made before all other C 24122433fc5SMasahiro Yamada# files, including recordmcount. 24222433fc5SMasahiro Yamadasub_cmd_record_mcount = \ 24322433fc5SMasahiro Yamada if [ $(@) != "scripts/mod/empty.o" ]; then \ 24422433fc5SMasahiro Yamada $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)"; \ 24522433fc5SMasahiro Yamada fi; 24622433fc5SMasahiro Yamadarecordmcount_source := $(srctree)/scripts/recordmcount.c \ 24722433fc5SMasahiro Yamada $(srctree)/scripts/recordmcount.h 24822433fc5SMasahiro Yamadaelse 24922433fc5SMasahiro Yamadasub_cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \ 25022433fc5SMasahiro Yamada "$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \ 25122433fc5SMasahiro Yamada "$(if $(CONFIG_64BIT),64,32)" \ 25222433fc5SMasahiro Yamada "$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CFLAGS)" \ 25322433fc5SMasahiro Yamada "$(LD)" "$(NM)" "$(RM)" "$(MV)" \ 25422433fc5SMasahiro Yamada "$(if $(part-of-module),1,0)" "$(@)"; 25522433fc5SMasahiro Yamadarecordmcount_source := $(srctree)/scripts/recordmcount.pl 25622433fc5SMasahiro Yamadaendif 25722433fc5SMasahiro Yamadacmd_record_mcount = \ 25898bd0e0dSMasahiro Yamada if [ "$(findstring $(CC_FLAGS_FTRACE),$(_c_flags))" = \ 25998bd0e0dSMasahiro Yamada "$(CC_FLAGS_FTRACE)" ]; then \ 26022433fc5SMasahiro Yamada $(sub_cmd_record_mcount) \ 26122433fc5SMasahiro Yamada fi; 26222433fc5SMasahiro Yamadaendif 26322433fc5SMasahiro Yamada 26422433fc5SMasahiro Yamadadefine rule_cc_o_c 26522433fc5SMasahiro Yamada $(call echo-cmd,checksrc) $(cmd_checksrc) \ 26622433fc5SMasahiro Yamada $(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \ 26722433fc5SMasahiro Yamada $(cmd_modversions) \ 26822433fc5SMasahiro Yamada $(call echo-cmd,record_mcount) \ 26922433fc5SMasahiro Yamada $(cmd_record_mcount) \ 27022433fc5SMasahiro Yamada scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \ 27122433fc5SMasahiro Yamada $(dot-target).tmp; \ 27222433fc5SMasahiro Yamada rm -f $(depfile); \ 27322433fc5SMasahiro Yamada mv -f $(dot-target).tmp $(dot-target).cmd 27422433fc5SMasahiro Yamadaendef 27522433fc5SMasahiro Yamada 27622433fc5SMasahiro Yamada# Built-in and composite module parts 27722433fc5SMasahiro Yamada$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE 27822433fc5SMasahiro Yamada $(call cmd,force_checksrc) 27922433fc5SMasahiro Yamada $(call if_changed_rule,cc_o_c) 28022433fc5SMasahiro Yamada 28122433fc5SMasahiro Yamada# Single-part modules are special since we need to mark them in $(MODVERDIR) 28222433fc5SMasahiro Yamada 28322433fc5SMasahiro Yamada$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE 28422433fc5SMasahiro Yamada $(call cmd,force_checksrc) 28522433fc5SMasahiro Yamada $(call if_changed_rule,cc_o_c) 28622433fc5SMasahiro Yamada @{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod) 28722433fc5SMasahiro Yamada 28822433fc5SMasahiro Yamadaquiet_cmd_cc_lst_c = MKLST $@ 28922433fc5SMasahiro Yamada cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \ 29022433fc5SMasahiro Yamada $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \ 29122433fc5SMasahiro Yamada System.map $(OBJDUMP) > $@ 29222433fc5SMasahiro Yamada 29322433fc5SMasahiro Yamada$(obj)/%.lst: $(src)/%.c FORCE 29422433fc5SMasahiro Yamada $(call if_changed_dep,cc_lst_c) 29522433fc5SMasahiro Yamada 29622433fc5SMasahiro Yamada# Compile assembler sources (.S) 29722433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 29822433fc5SMasahiro Yamada 29922433fc5SMasahiro Yamadamodkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL) 30022433fc5SMasahiro Yamada 30122433fc5SMasahiro Yamada$(real-objs-m) : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE) 30222433fc5SMasahiro Yamada$(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE) 30322433fc5SMasahiro Yamada 30422433fc5SMasahiro Yamadaquiet_cmd_as_s_S = CPP $(quiet_modtag) $@ 30522433fc5SMasahiro Yamadacmd_as_s_S = $(CPP) $(a_flags) -o $@ $< 30622433fc5SMasahiro Yamada 30722433fc5SMasahiro Yamada$(obj)/%.s: $(src)/%.S FORCE 30822433fc5SMasahiro Yamada $(call if_changed_dep,as_s_S) 30922433fc5SMasahiro Yamada 31022433fc5SMasahiro Yamadaquiet_cmd_as_o_S = AS $(quiet_modtag) $@ 31122433fc5SMasahiro Yamadacmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< 31222433fc5SMasahiro Yamada 31322433fc5SMasahiro Yamada$(obj)/%.o: $(src)/%.S FORCE 31422433fc5SMasahiro Yamada $(call if_changed_dep,as_o_S) 31522433fc5SMasahiro Yamada 31622433fc5SMasahiro Yamadatargets += $(real-objs-y) $(real-objs-m) $(lib-y) 31722433fc5SMasahiro Yamadatargets += $(extra-y) $(MAKECMDGOALS) $(always) 31822433fc5SMasahiro Yamada 31922433fc5SMasahiro Yamada# Linker scripts preprocessor (.lds.S -> .lds) 32022433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 32122433fc5SMasahiro Yamadaquiet_cmd_cpp_lds_S = LDS $@ 32222433fc5SMasahiro Yamada cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \ 32322433fc5SMasahiro Yamada -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $< 32422433fc5SMasahiro Yamada 32522433fc5SMasahiro Yamada$(obj)/%.lds: $(src)/%.lds.S FORCE 32622433fc5SMasahiro Yamada $(call if_changed_dep,cpp_lds_S) 32722433fc5SMasahiro Yamada 32822433fc5SMasahiro Yamada# ASN.1 grammar 32922433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 33022433fc5SMasahiro Yamadaquiet_cmd_asn1_compiler = ASN.1 $@ 33122433fc5SMasahiro Yamada cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \ 33222433fc5SMasahiro Yamada $(subst .h,.c,$@) $(subst .c,.h,$@) 33322433fc5SMasahiro Yamada 33422433fc5SMasahiro Yamada$(obj)/%-asn1.c $(obj)/%-asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler 33522433fc5SMasahiro Yamada $(call cmd,asn1_compiler) 33622433fc5SMasahiro Yamada 33722433fc5SMasahiro Yamada# Build the compiled-in targets 33822433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 33922433fc5SMasahiro Yamada 34022433fc5SMasahiro Yamada# To build objects in subdirs, we need to descend into the directories 34122433fc5SMasahiro Yamada$(sort $(subdir-obj-y)): $(subdir-ym) ; 34222433fc5SMasahiro Yamada 34322433fc5SMasahiro Yamada# 34422433fc5SMasahiro Yamada# Rule to compile a set of .o files into one .o file 34522433fc5SMasahiro Yamada# 34622433fc5SMasahiro Yamadaifdef builtin-target 34722433fc5SMasahiro Yamadaquiet_cmd_link_o_target = LD $@ 34822433fc5SMasahiro Yamada# If the list of objects to link is empty, just create an empty built-in.o 34922433fc5SMasahiro Yamadacmd_link_o_target = $(if $(strip $(obj-y)),\ 350*902902dbSTom Rini $(LD) $(ld_flags) -z noexecstack -r -o $@ $(filter $(obj-y), $^) \ 35122433fc5SMasahiro Yamada $(cmd_secanalysis),\ 35222433fc5SMasahiro Yamada rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@) 35322433fc5SMasahiro Yamada 35422433fc5SMasahiro Yamada$(builtin-target): $(obj-y) FORCE 35522433fc5SMasahiro Yamada $(call if_changed,link_o_target) 35622433fc5SMasahiro Yamada 35722433fc5SMasahiro Yamadatargets += $(builtin-target) 35822433fc5SMasahiro Yamadaendif # builtin-target 35922433fc5SMasahiro Yamada 36022433fc5SMasahiro Yamada# 36122433fc5SMasahiro Yamada# Rule to create modules.order file 36222433fc5SMasahiro Yamada# 36322433fc5SMasahiro Yamada# Create commands to either record .ko file or cat modules.order from 36422433fc5SMasahiro Yamada# a subdirectory 36522433fc5SMasahiro Yamadamodorder-cmds = \ 36622433fc5SMasahiro Yamada $(foreach m, $(modorder), \ 36722433fc5SMasahiro Yamada $(if $(filter %/modules.order, $m), \ 36822433fc5SMasahiro Yamada cat $m;, echo kernel/$m;)) 36922433fc5SMasahiro Yamada 37022433fc5SMasahiro Yamada$(modorder-target): $(subdir-ym) FORCE 37122433fc5SMasahiro Yamada $(Q)(cat /dev/null; $(modorder-cmds)) > $@ 37222433fc5SMasahiro Yamada 37322433fc5SMasahiro Yamada# 37422433fc5SMasahiro Yamada# Rule to compile a set of .o files into one .a file 37522433fc5SMasahiro Yamada# 37622433fc5SMasahiro Yamadaifdef lib-target 37722433fc5SMasahiro Yamadaquiet_cmd_link_l_target = AR $@ 37822433fc5SMasahiro Yamadacmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(lib-y) 37922433fc5SMasahiro Yamada 38022433fc5SMasahiro Yamada$(lib-target): $(lib-y) FORCE 38122433fc5SMasahiro Yamada $(call if_changed,link_l_target) 38222433fc5SMasahiro Yamada 38322433fc5SMasahiro Yamadatargets += $(lib-target) 38422433fc5SMasahiro Yamadaendif 38522433fc5SMasahiro Yamada 38622433fc5SMasahiro Yamada# 38722433fc5SMasahiro Yamada# Rule to link composite objects 38822433fc5SMasahiro Yamada# 38922433fc5SMasahiro Yamada# Composite objects are specified in kbuild makefile as follows: 39022433fc5SMasahiro Yamada# <composite-object>-objs := <list of .o files> 39122433fc5SMasahiro Yamada# or 39222433fc5SMasahiro Yamada# <composite-object>-y := <list of .o files> 39322433fc5SMasahiro Yamadalink_multi_deps = \ 39422433fc5SMasahiro Yamada$(filter $(addprefix $(obj)/, \ 39522433fc5SMasahiro Yamada$($(subst $(obj)/,,$(@:.o=-objs))) \ 39622433fc5SMasahiro Yamada$($(subst $(obj)/,,$(@:.o=-y)))), $^) 39722433fc5SMasahiro Yamada 39822433fc5SMasahiro Yamadaquiet_cmd_link_multi-y = LD $@ 39922433fc5SMasahiro Yamadacmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis) 40022433fc5SMasahiro Yamada 40122433fc5SMasahiro Yamadaquiet_cmd_link_multi-m = LD [M] $@ 40222433fc5SMasahiro Yamadacmd_link_multi-m = $(cmd_link_multi-y) 40322433fc5SMasahiro Yamada 404cb6e7b0dSMasahiro Yamada$(multi-used-y): FORCE 40522433fc5SMasahiro Yamada $(call if_changed,link_multi-y) 406cb6e7b0dSMasahiro Yamada$(call multi_depend, $(multi-used-y), .o, -objs -y) 40722433fc5SMasahiro Yamada 408cb6e7b0dSMasahiro Yamada$(multi-used-m): FORCE 40922433fc5SMasahiro Yamada $(call if_changed,link_multi-m) 41022433fc5SMasahiro Yamada @{ echo $(@:.o=.ko); echo $(link_multi_deps); } > $(MODVERDIR)/$(@F:.o=.mod) 411cb6e7b0dSMasahiro Yamada$(call multi_depend, $(multi-used-m), .o, -objs -y) 41222433fc5SMasahiro Yamada 41322433fc5SMasahiro Yamadatargets += $(multi-used-y) $(multi-used-m) 41422433fc5SMasahiro Yamada 41522433fc5SMasahiro Yamada 416e91610daSEugeniu Rosca# Add intermediate targets: 417e91610daSEugeniu Rosca# When building objects with specific suffix patterns, add intermediate 418e91610daSEugeniu Rosca# targets that the final targets are derived from. 419e91610daSEugeniu Roscaintermediate_targets = $(foreach sfx, $(2), \ 420e91610daSEugeniu Rosca $(patsubst %$(strip $(1)),%$(sfx), \ 421e91610daSEugeniu Rosca $(filter %$(strip $(1)), $(targets)))) 422e91610daSEugeniu Rosca# %.lex.o <- %.lex.c <- %.l 423e91610daSEugeniu Rosca# %.tab.o <- %.tab.[ch] <- %.y 424e91610daSEugeniu Roscatargets += $(call intermediate_targets, .lex.o, .lex.c) \ 425e91610daSEugeniu Rosca $(call intermediate_targets, .tab.o, .tab.c .tab.h) 426e91610daSEugeniu Rosca 42722433fc5SMasahiro Yamada# Descending 42822433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 42922433fc5SMasahiro Yamada 43022433fc5SMasahiro YamadaPHONY += $(subdir-ym) 43122433fc5SMasahiro Yamada$(subdir-ym): 43222433fc5SMasahiro Yamada $(Q)$(MAKE) $(build)=$@ 43322433fc5SMasahiro Yamada 43422433fc5SMasahiro Yamada# Add FORCE to the prequisites of a target to force it to be always rebuilt. 43522433fc5SMasahiro Yamada# --------------------------------------------------------------------------- 43622433fc5SMasahiro Yamada 43722433fc5SMasahiro YamadaPHONY += FORCE 43822433fc5SMasahiro Yamada 43922433fc5SMasahiro YamadaFORCE: 44022433fc5SMasahiro Yamada 44122433fc5SMasahiro Yamada# Read all saved command lines and dependencies for the $(targets) we 44222433fc5SMasahiro Yamada# may be building above, using $(if_changed{,_dep}). As an 44322433fc5SMasahiro Yamada# optimization, we don't need to read them if the target does not 44422433fc5SMasahiro Yamada# exist, we will rebuild anyway in that case. 44522433fc5SMasahiro Yamada 44622433fc5SMasahiro Yamadatargets := $(wildcard $(sort $(targets))) 44722433fc5SMasahiro Yamadacmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) 44822433fc5SMasahiro Yamada 44922433fc5SMasahiro Yamadaifneq ($(cmd_files),) 45022433fc5SMasahiro Yamada include $(cmd_files) 45122433fc5SMasahiro Yamadaendif 45222433fc5SMasahiro Yamada 45322433fc5SMasahiro Yamada# Declare the contents of the .PHONY variable as phony. We keep that 45422433fc5SMasahiro Yamada# information in a variable se we can use it in if_changed and friends. 45522433fc5SMasahiro Yamada 45622433fc5SMasahiro Yamada.PHONY: $(PHONY) 457