1b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0 21da177e4SLinus Torvalds# ========================================================================== 31da177e4SLinus Torvalds# Building 41da177e4SLinus Torvalds# ========================================================================== 51da177e4SLinus Torvalds 61da177e4SLinus Torvaldssrc := $(obj) 71da177e4SLinus Torvalds 84f193362SPaul SmithPHONY := __build 91da177e4SLinus Torvalds__build: 101da177e4SLinus Torvalds 11d72e5edbSSam Ravnborg# Init all relevant variables used in kbuild files so 12d72e5edbSSam Ravnborg# 1) they have correct type 13d72e5edbSSam Ravnborg# 2) they do not inherit any value from the environment 14d72e5edbSSam Ravnborgobj-y := 15d72e5edbSSam Ravnborgobj-m := 16d72e5edbSSam Ravnborglib-y := 17d72e5edbSSam Ravnborglib-m := 185f2fb52fSMasahiro Yamadaalways-y := 195f2fb52fSMasahiro Yamadaalways-m := 20d72e5edbSSam Ravnborgtargets := 21d72e5edbSSam Ravnborgsubdir-y := 22d72e5edbSSam Ravnborgsubdir-m := 23d72e5edbSSam RavnborgEXTRA_AFLAGS := 24d72e5edbSSam RavnborgEXTRA_CFLAGS := 25d72e5edbSSam RavnborgEXTRA_CPPFLAGS := 26d72e5edbSSam RavnborgEXTRA_LDFLAGS := 27f77bf014SSam Ravnborgasflags-y := 28f77bf014SSam Ravnborgccflags-y := 29f77bf014SSam Ravnborgcppflags-y := 30f77bf014SSam Ravnborgldflags-y := 31d72e5edbSSam Ravnborg 32720097d8SSam Ravnborgsubdir-asflags-y := 33720097d8SSam Ravnborgsubdir-ccflags-y := 34720097d8SSam Ravnborg 353156fd05SRobert P. J. Day# Read auto.conf if it exists, otherwise ignore 36c955ccafSRoman Zippel-include include/config/auto.conf 371da177e4SLinus Torvalds 383204a7fbSMasahiro Yamadainclude $(srctree)/scripts/Kbuild.include 3957fd251cSMasahiro Yamadainclude $(srctree)/scripts/Makefile.compiler 4020a468b5SSam Ravnborg 412a691470SSam Ravnborg# The filename Kbuild has precedence over Makefile 42db8c1a7bSSam Ravnborgkbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) 435c816641SMasahiro Yamadainclude $(or $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Makefile) 441da177e4SLinus Torvalds 453204a7fbSMasahiro Yamadainclude $(srctree)/scripts/Makefile.lib 461da177e4SLinus Torvalds 4785569d19SMasahiro Yamada# Do not include hostprogs rules unless needed. 4885569d19SMasahiro Yamada# $(sort ...) is used here to remove duplicated words and excessive spaces. 4985569d19SMasahiro Yamadahostprogs := $(sort $(hostprogs)) 5042640b13SMasahiro Yamadaifneq ($(hostprogs),) 513204a7fbSMasahiro Yamadainclude $(srctree)/scripts/Makefile.host 521da177e4SLinus Torvaldsendif 531da177e4SLinus Torvalds 547f3a59dbSMasahiro Yamada# Do not include userprogs rules unless needed. 5585569d19SMasahiro Yamada# $(sort ...) is used here to remove duplicated words and excessive spaces. 567f3a59dbSMasahiro Yamadauserprogs := $(sort $(userprogs)) 577f3a59dbSMasahiro Yamadaifneq ($(userprogs),) 583204a7fbSMasahiro Yamadainclude $(srctree)/scripts/Makefile.userprogs 597f3a59dbSMasahiro Yamadaendif 607f3a59dbSMasahiro Yamada 611da177e4SLinus Torvaldsifndef obj 621da177e4SLinus Torvalds$(warning kbuild: Makefile.build is included improperly) 631da177e4SLinus Torvaldsendif 641da177e4SLinus Torvalds 65394053f4SMasahiro Yamadaifeq ($(need-modorder),) 66c07d8d47SMasahiro Yamadaifneq ($(obj-m),) 67c07d8d47SMasahiro Yamada$(warning $(patsubst %.o,'%.ko',$(obj-m)) will not be built even though obj-m is specified.) 68c07d8d47SMasahiro Yamada$(warning You cannot use subdir-y/m to visit a module Makefile. Use obj-y/m instead.) 69c07d8d47SMasahiro Yamadaendif 70c07d8d47SMasahiro Yamadaendif 71c07d8d47SMasahiro Yamada 721da177e4SLinus Torvalds# =========================================================================== 731da177e4SLinus Torvalds 74454753d9SMasahiro Yamada# subdir-builtin and subdir-modorder may contain duplications. Use $(sort ...) 75aaa385baSMasahiro Yamadasubdir-builtin := $(sort $(filter %/built-in.a, $(real-obj-y))) 76b2c88554SMasahiro Yamadasubdir-modorder := $(sort $(filter %/modules.order, $(obj-m))) 776ba3bcb0SMasahiro Yamada 78f3908ab3SMasahiro Yamadatargets-for-builtin := $(extra-y) 79f3908ab3SMasahiro Yamada 80a4954fd7SMasahiro Yamadaifneq ($(strip $(lib-y) $(lib-m) $(lib-)),) 81f3908ab3SMasahiro Yamadatargets-for-builtin += $(obj)/lib.a 821da177e4SLinus Torvaldsendif 831da177e4SLinus Torvalds 8456d58936SMasahiro Yamadaifdef need-builtin 85f3908ab3SMasahiro Yamadatargets-for-builtin += $(obj)/built-in.a 861da177e4SLinus Torvaldsendif 871da177e4SLinus Torvalds 88fc93a4cdSMasahiro Yamadatargets-for-modules := $(foreach x, o mod $(if $(CONFIG_TRIM_UNUSED_KSYMS), usyms), \ 899413e764SMasahiro Yamada $(patsubst %.o, %.$x, $(filter %.o, $(obj-m)))) 90f3908ab3SMasahiro Yamada 91d31ed5d7SPeter Zijlstraifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),) 92d31ed5d7SPeter Zijlstratargets-for-modules += $(patsubst %.o, %.prelink.o, $(filter %.o, $(obj-m))) 93850ded46SSami Tolvanenendif 94850ded46SSami Tolvanen 95b480fec9SMasahiro Yamadaifdef need-modorder 96f3908ab3SMasahiro Yamadatargets-for-modules += $(obj)/modules.order 971d8001efSMasahiro Yamadaendif 98551559e1STejun Heo 99f3908ab3SMasahiro Yamadatargets += $(targets-for-builtin) $(targets-for-modules) 1009f69a496SMasahiro Yamada 1011da177e4SLinus Torvalds# Linus' kernel sanity checking tool 1027d0ea252SMasahiro Yamadaifeq ($(KBUILD_CHECKSRC),1) 1031da177e4SLinus Torvalds quiet_cmd_checksrc = CHECK $< 104e5d28910SMasahiro Yamada cmd_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< 1057d0ea252SMasahiro Yamadaelse ifeq ($(KBUILD_CHECKSRC),2) 1067d0ea252SMasahiro Yamada quiet_cmd_force_checksrc = CHECK $< 107e5d28910SMasahiro Yamada cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< 1081da177e4SLinus Torvaldsendif 1091da177e4SLinus Torvalds 110e27128dbSMasahiro Yamadaifneq ($(KBUILD_EXTRA_WARN),) 111e5d28910SMasahiro Yamada cmd_checkdoc = $(srctree)/scripts/kernel-doc -none $< 1123a025e1dSMatthew Wilcoxendif 1133a025e1dSMatthew Wilcox 1141da177e4SLinus Torvalds# Compile C sources (.c) 1151da177e4SLinus Torvalds# --------------------------------------------------------------------------- 1161da177e4SLinus Torvalds 1171da177e4SLinus Torvaldsquiet_cmd_cc_s_c = CC $(quiet_modtag) $@ 118dc5723b0SSami Tolvanen cmd_cc_s_c = $(CC) $(filter-out $(DEBUG_CFLAGS) $(CC_FLAGS_LTO), $(c_flags)) -fverbose-asm -S -o $@ $< 1191da177e4SLinus Torvalds 120767e581dSSam Ravnborg$(obj)/%.s: $(src)/%.c FORCE 1211da177e4SLinus Torvalds $(call if_changed_dep,cc_s_c) 1221da177e4SLinus Torvalds 12323d43848SMasahiro Yamadaquiet_cmd_cpp_i_c = CPP $(quiet_modtag) $@ 12423d43848SMasahiro Yamadacmd_cpp_i_c = $(CPP) $(c_flags) -o $@ $< 1251da177e4SLinus Torvalds 126767e581dSSam Ravnborg$(obj)/%.i: $(src)/%.c FORCE 12723d43848SMasahiro Yamada $(call if_changed_dep,cpp_i_c) 1281da177e4SLinus Torvalds 129f43e31d5SMasahiro Yamadagenksyms = scripts/genksyms/genksyms \ 130f43e31d5SMasahiro Yamada $(if $(1), -T $(2)) \ 131f43e31d5SMasahiro Yamada $(if $(CONFIG_MODULE_REL_CRCS), -R) \ 13237a8d9f6SSam Ravnborg $(if $(KBUILD_PRESERVE), -p) \ 133f43e31d5SMasahiro Yamada -r $(or $(wildcard $(2:.symtypes=.symref)), /dev/null) 134f43e31d5SMasahiro Yamada 135f43e31d5SMasahiro Yamada# These mirror gensymtypes_S and co below, keep them in synch. 136f43e31d5SMasahiro Yamadacmd_gensymtypes_c = $(CPP) -D__GENKSYMS__ $(c_flags) $< | $(genksyms) 13737a8d9f6SSam Ravnborg 13815fde675SAndreas Gruenbacherquiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@ 139dc6dc3e7SMasahiro Yamada cmd_cc_symtypes_c = $(call cmd_gensymtypes_c,true,$@) >/dev/null 14015fde675SAndreas Gruenbacher 141767e581dSSam Ravnborg$(obj)/%.symtypes : $(src)/%.c FORCE 14264e6c1e1SAndreas Gruenbacher $(call cmd,cc_symtypes_c) 14315fde675SAndreas Gruenbacher 144433db3e2SVinícius Tinti# LLVM assembly 145433db3e2SVinícius Tinti# Generate .ll files from .c 146433db3e2SVinícius Tintiquiet_cmd_cc_ll_c = CC $(quiet_modtag) $@ 147433db3e2SVinícius Tinti cmd_cc_ll_c = $(CC) $(c_flags) -emit-llvm -S -o $@ $< 148433db3e2SVinícius Tinti 149433db3e2SVinícius Tinti$(obj)/%.ll: $(src)/%.c FORCE 150433db3e2SVinícius Tinti $(call if_changed_dep,cc_ll_c) 151433db3e2SVinícius Tinti 1521da177e4SLinus Torvalds# C (.c) files 1531da177e4SLinus Torvalds# The C file is compiled and updated dependency information is generated. 1541da177e4SLinus Torvalds# (See cmd_cc_o_c + relevant part of rule_cc_o_c) 1551da177e4SLinus Torvalds 1561da177e4SLinus Torvaldsquiet_cmd_cc_o_c = CC $(quiet_modtag) $@ 15792594d56SMasahiro Yamada cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< $(cmd_objtool) 1581da177e4SLinus Torvalds 159ee3e46b7SMasahiro Yamadaifdef CONFIG_MODVERSIONS 1601da177e4SLinus Torvalds# When module versioning is enabled the following steps are executed: 161ee3e46b7SMasahiro Yamada# o compile a <file>.o from <file>.c 162ee3e46b7SMasahiro Yamada# o if <file>.o doesn't contain a __ksymtab version, i.e. does 163ee3e46b7SMasahiro Yamada# not export symbols, it's done. 1641da177e4SLinus Torvalds# o otherwise, we calculate symbol versions using the good old 1651da177e4SLinus Torvalds# genksyms on the preprocessed source and postprocess them in a way 1662ea03891SSam Ravnborg# that they are usable as a linker script 167ee3e46b7SMasahiro Yamada# o generate .tmp_<file>.o from <file>.o using the linker to 1682ea03891SSam Ravnborg# replace the unresolved symbols __crc_exported_symbol with 1692ea03891SSam Ravnborg# the actual value of the checksum generated by genksyms 170ee3e46b7SMasahiro Yamada# o remove .tmp_<file>.o to <file>.o 1714efca4edSNicholas Piggin 17238e89184SSami Tolvanen# Generate .o.symversions files for each .o with exported symbols, and link these 17338e89184SSami Tolvanen# to the kernel and/or modules at the end. 1748017ce50SMasahiro Yamadagen_symversions = \ 17538e89184SSami Tolvanen if $(NM) $@ 2>/dev/null | grep -q __ksymtab; then \ 1768017ce50SMasahiro Yamada $(call cmd_gensymtypes_$(1),$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ 17738e89184SSami Tolvanen > $@.symversions; \ 178a8390ba9SMasahiro Yamada else \ 179a8390ba9SMasahiro Yamada rm -f $@.symversions; \ 180e5d28910SMasahiro Yamada fi 1818017ce50SMasahiro Yamada 1828017ce50SMasahiro Yamadacmd_gen_symversions_c = $(call gen_symversions,c) 1838017ce50SMasahiro Yamada 1848017ce50SMasahiro Yamadacmd_modversions = \ 1858017ce50SMasahiro Yamada if [ -r $@.symversions ]; then \ 1868017ce50SMasahiro Yamada $(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \ 1878017ce50SMasahiro Yamada -T $@.symversions; \ 1888017ce50SMasahiro Yamada mv -f $(@D)/.tmp_$(@F) $@; \ 1898017ce50SMasahiro Yamada fi 19038e89184SSami Tolvanenendif 1911da177e4SLinus Torvalds 1923b15cdc1SSami Tolvanenifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT 19307d04081SVasily Gorbik# compiler will not generate __mcount_loc use recordmcount or recordmcount.pl 19472441cb1SSteven Rostedtifdef BUILD_C_RECORDMCOUNT 19585356f80SSteven Rostedtifeq ("$(origin RECORDMCOUNT_WARN)", "command line") 19685356f80SSteven Rostedt RECORDMCOUNT_FLAGS = -w 19785356f80SSteven Rostedtendif 198d7b4d6deSSteven Rostedt# Due to recursion, we must skip empty.o. 199d7b4d6deSSteven Rostedt# The empty.o file is created in the make process in order to determine 200d7b4d6deSSteven Rostedt# the target endianness and word size. It is made before all other C 201d7b4d6deSSteven Rostedt# files, including recordmcount. 20245677454SWu Zhangjinsub_cmd_record_mcount = \ 20345677454SWu Zhangjin if [ $(@) != "scripts/mod/empty.o" ]; then \ 20485356f80SSteven Rostedt $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)"; \ 205d7b4d6deSSteven Rostedt fi; 206d6971822SMichal Marekrecordmcount_source := $(srctree)/scripts/recordmcount.c \ 207d6971822SMichal Marek $(srctree)/scripts/recordmcount.h 20872441cb1SSteven Rostedtelse 2094317ee3bSMasahiro Yamadasub_cmd_record_mcount = perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \ 210e6299d26SWu Zhangjin "$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \ 211b3acf29aSSteven Rostedt "$(if $(CONFIG_64BIT),64,32)" \ 2125a4630aaSJoel Stanley "$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS)" \ 213d503ac53SMasahiro Yamada "$(LD) $(KBUILD_LDFLAGS)" "$(NM)" "$(RM)" "$(MV)" \ 21418c167fdSShaohua Li "$(if $(part-of-module),1,0)" "$(@)"; 215d6971822SMichal Marekrecordmcount_source := $(srctree)/scripts/recordmcount.pl 216312a3d09SCao jinendif # BUILD_C_RECORDMCOUNT 2171a49b2fdSJoe Lawrencecmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)), \ 2181a49b2fdSJoe Lawrence $(sub_cmd_record_mcount)) 2193b15cdc1SSami Tolvanenendif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT 2208da3821bSSteven Rostedt 221b9ab5ebbSJosh Poimboeufifdef CONFIG_STACK_VALIDATION 2228f0c32c7SMasahiro Yamada 2235c4859e7SMasahiro Yamadaobjtool := $(objtree)/tools/objtool/objtool 2245c4859e7SMasahiro Yamada 2258f0c32c7SMasahiro Yamadaobjtool_args = \ 2268f0c32c7SMasahiro Yamada $(if $(CONFIG_UNWINDER_ORC),orc generate,check) \ 2278f0c32c7SMasahiro Yamada $(if $(part-of-module), --module) \ 228ed53a0d9SPeter Zijlstra $(if $(CONFIG_X86_KERNEL_IBT), --lto --ibt) \ 2298f0c32c7SMasahiro Yamada $(if $(CONFIG_FRAME_POINTER),, --no-fp) \ 2308f0c32c7SMasahiro Yamada $(if $(CONFIG_GCOV_KERNEL)$(CONFIG_LTO_CLANG), --no-unreachable)\ 2318f0c32c7SMasahiro Yamada $(if $(CONFIG_RETPOLINE), --retpoline) \ 2328f0c32c7SMasahiro Yamada $(if $(CONFIG_X86_SMAP), --uaccess) \ 233e463a09aSPeter Zijlstra $(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) \ 234e463a09aSPeter Zijlstra $(if $(CONFIG_SLS), --sls) 2358f0c32c7SMasahiro Yamada 236d31ed5d7SPeter Zijlstracmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@) 237d31ed5d7SPeter Zijlstracmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd) 23890a35349SMasahiro Yamada 23990a35349SMasahiro Yamadaendif # CONFIG_STACK_VALIDATION 24090a35349SMasahiro Yamada 241d31ed5d7SPeter Zijlstraifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),) 24290a35349SMasahiro Yamada 24390a35349SMasahiro Yamada# Skip objtool for LLVM bitcode 24490a35349SMasahiro Yamada$(obj)/%.o: objtool-enabled := 24590a35349SMasahiro Yamada 24690a35349SMasahiro Yamadaelse 247b9ab5ebbSJosh Poimboeuf 248b9ab5ebbSJosh Poimboeuf# 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory 249b9ab5ebbSJosh Poimboeuf# 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file 250b9ab5ebbSJosh Poimboeuf# 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file 251918a6b7fSMasahiro Yamada 25290a35349SMasahiro Yamada$(obj)/%.o: objtool-enabled = $(if $(filter-out y%, \ 253918a6b7fSMasahiro Yamada $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n),y) 254918a6b7fSMasahiro Yamada 25590a35349SMasahiro Yamadaendif 256b9ab5ebbSJosh Poimboeuf 257bbda5ec6SMasahiro Yamadaifdef CONFIG_TRIM_UNUSED_KSYMS 258bbda5ec6SMasahiro Yamadacmd_gen_ksymdeps = \ 259e5d28910SMasahiro Yamada $(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd 260bbda5ec6SMasahiro Yamadaendif 261bbda5ec6SMasahiro Yamada 2621da177e4SLinus Torvaldsdefine rule_cc_o_c 2633a2429e1SMasahiro Yamada $(call cmd_and_fixdep,cc_o_c) 2643a2429e1SMasahiro Yamada $(call cmd,gen_ksymdeps) 2650c33f125SLuc Van Oostenryck $(call cmd,checksrc) 2663a2429e1SMasahiro Yamada $(call cmd,checkdoc) 267ef62588cSMasahiro Yamada $(call cmd,gen_objtooldep) 2688017ce50SMasahiro Yamada $(call cmd,gen_symversions_c) 2698017ce50SMasahiro Yamada $(if $(CONFIG_LTO_CLANG),,$(call cmd,modversions)) 2703a2429e1SMasahiro Yamada $(call cmd,record_mcount) 2711da177e4SLinus Torvaldsendef 2721da177e4SLinus Torvalds 273b9ab5ebbSJosh Poimboeufdefine rule_as_o_S 2743a2429e1SMasahiro Yamada $(call cmd_and_fixdep,as_o_S) 2753a2429e1SMasahiro Yamada $(call cmd,gen_ksymdeps) 276ef62588cSMasahiro Yamada $(call cmd,gen_objtooldep) 2777cfa2fcbSMasahiro Yamada $(call cmd,gen_symversions_S) 2787cfa2fcbSMasahiro Yamada $(call cmd,modversions) 279b9ab5ebbSJosh Poimboeufendef 280b9ab5ebbSJosh Poimboeuf 2811da177e4SLinus Torvalds# Built-in and composite module parts 282ef62588cSMasahiro Yamada$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE 2831da177e4SLinus Torvalds $(call if_changed_rule,cc_o_c) 2840c33f125SLuc Van Oostenryck $(call cmd,force_checksrc) 2851da177e4SLinus Torvalds 286d31ed5d7SPeter Zijlstraifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),) 287850ded46SSami Tolvanen# Module .o files may contain LLVM bitcode, compile them into native code 288850ded46SSami Tolvanen# before ELF processing 289d31ed5d7SPeter Zijlstraquiet_cmd_cc_prelink_modules = LD [M] $@ 290d31ed5d7SPeter Zijlstra cmd_cc_prelink_modules = \ 291850ded46SSami Tolvanen $(LD) $(ld_flags) -r -o $@ \ 292d31ed5d7SPeter Zijlstra $(shell [ -s $(@:.prelink.o=.o.symversions) ] && \ 293d31ed5d7SPeter Zijlstra echo -T $(@:.prelink.o=.o.symversions)) \ 29490a35349SMasahiro Yamada --whole-archive $(filter-out FORCE,$^) \ 29590a35349SMasahiro Yamada $(cmd_objtool) 296850ded46SSami Tolvanen 297d31ed5d7SPeter Zijlstra# objtool was skipped for LLVM bitcode, run it now that we have compiled 298d31ed5d7SPeter Zijlstra# modules into native code 299d31ed5d7SPeter Zijlstra$(obj)/%.prelink.o: objtool-enabled = y 300d31ed5d7SPeter Zijlstra$(obj)/%.prelink.o: part-of-module := y 301d31ed5d7SPeter Zijlstra 302d31ed5d7SPeter Zijlstra$(obj)/%.prelink.o: $(obj)/%.o FORCE 303d31ed5d7SPeter Zijlstra $(call if_changed,cc_prelink_modules) 304850ded46SSami Tolvanenendif 305850ded46SSami Tolvanen 30622f26f21SMasahiro Yamadacmd_mod = echo $(addprefix $(obj)/, $(call real-search, $*.o, .o, -objs -y -m)) | \ 30722f26f21SMasahiro Yamada $(AWK) -v RS='( |\n)' '!x[$$0]++' > $@ 3089f69a496SMasahiro Yamada 309fc93a4cdSMasahiro Yamada$(obj)/%.mod: FORCE 3109f69a496SMasahiro Yamada $(call if_changed,mod) 3119f69a496SMasahiro Yamada 3129413e764SMasahiro Yamada# List module undefined symbols 3139413e764SMasahiro Yamadacmd_undefined_syms = $(NM) $< | sed -n 's/^ *U //p' > $@ 3149413e764SMasahiro Yamada 3159413e764SMasahiro Yamada$(obj)/%.usyms: $(obj)/%$(mod-prelink-ext).o FORCE 3169413e764SMasahiro Yamada $(call if_changed,undefined_syms) 3179413e764SMasahiro Yamada 3181da177e4SLinus Torvaldsquiet_cmd_cc_lst_c = MKLST $@ 3191da177e4SLinus Torvalds cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \ 3201da177e4SLinus Torvalds $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \ 3211da177e4SLinus Torvalds System.map $(OBJDUMP) > $@ 3221da177e4SLinus Torvalds 323767e581dSSam Ravnborg$(obj)/%.lst: $(src)/%.c FORCE 3241da177e4SLinus Torvalds $(call if_changed_dep,cc_lst_c) 3251da177e4SLinus Torvalds 3261da177e4SLinus Torvalds# Compile assembler sources (.S) 3271da177e4SLinus Torvalds# --------------------------------------------------------------------------- 3281da177e4SLinus Torvalds 3294efca4edSNicholas Piggin# .S file exports must have their C prototypes defined in asm/asm-prototypes.h 3304efca4edSNicholas Piggin# or a file that it includes, in order to get versioned symbols. We build a 3314efca4edSNicholas Piggin# dummy C file that includes asm-prototypes and the EXPORT_SYMBOL lines from 3324efca4edSNicholas Piggin# the .S file (with trailing ';'), and run genksyms on that, to extract vers. 3334efca4edSNicholas Piggin# 3344efca4edSNicholas Piggin# This is convoluted. The .S file must first be preprocessed to run guards and 3354efca4edSNicholas Piggin# expand names, then the resulting exports must be constructed into plain 3364efca4edSNicholas Piggin# EXPORT_SYMBOL(symbol); to build our dummy C file, and that gets preprocessed 3374efca4edSNicholas Piggin# to make the genksyms input. 3384efca4edSNicholas Piggin# 3394efca4edSNicholas Piggin# These mirror gensymtypes_c and co above, keep them in synch. 3404efca4edSNicholas Piggincmd_gensymtypes_S = \ 341b79c6aa6SMasahiro Yamada { echo "\#include <linux/kernel.h>" ; \ 3424efca4edSNicholas Piggin echo "\#include <asm/asm-prototypes.h>" ; \ 3434efca4edSNicholas Piggin $(CPP) $(a_flags) $< | \ 344cc6acc11SNicholas Piggin grep "\<___EXPORT_SYMBOL\>" | \ 345b79c6aa6SMasahiro Yamada sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ; } | \ 346f43e31d5SMasahiro Yamada $(CPP) -D__GENKSYMS__ $(c_flags) -xc - | $(genksyms) 3474efca4edSNicholas Piggin 3484efca4edSNicholas Pigginquiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@ 349dc6dc3e7SMasahiro Yamada cmd_cc_symtypes_S = $(call cmd_gensymtypes_S,true,$@) >/dev/null 3504efca4edSNicholas Piggin 3514efca4edSNicholas Piggin$(obj)/%.symtypes : $(src)/%.S FORCE 3524efca4edSNicholas Piggin $(call cmd,cc_symtypes_S) 3534efca4edSNicholas Piggin 3544efca4edSNicholas Piggin 355e0f41e52SMasahiro Yamadaquiet_cmd_cpp_s_S = CPP $(quiet_modtag) $@ 356e0f41e52SMasahiro Yamadacmd_cpp_s_S = $(CPP) $(a_flags) -o $@ $< 3571da177e4SLinus Torvalds 358767e581dSSam Ravnborg$(obj)/%.s: $(src)/%.S FORCE 359e0f41e52SMasahiro Yamada $(call if_changed_dep,cpp_s_S) 3601da177e4SLinus Torvalds 3611da177e4SLinus Torvaldsquiet_cmd_as_o_S = AS $(quiet_modtag) $@ 36292594d56SMasahiro Yamada cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< $(cmd_objtool) 3631da177e4SLinus Torvalds 3642ff2b7ecSMasahiro Yamadaifdef CONFIG_ASM_MODVERSIONS 3654efca4edSNicholas Piggin 3664efca4edSNicholas Piggin# versioning matches the C process described above, with difference that 3674efca4edSNicholas Piggin# we parse asm-prototypes.h C header to get function definitions. 3684efca4edSNicholas Piggin 3697cfa2fcbSMasahiro Yamadacmd_gen_symversions_S = $(call gen_symversions,S) 3707cfa2fcbSMasahiro Yamada 3714efca4edSNicholas Pigginendif 3724efca4edSNicholas Piggin 373ef62588cSMasahiro Yamada$(obj)/%.o: $(src)/%.S FORCE 374b9ab5ebbSJosh Poimboeuf $(call if_changed_rule,as_o_S) 3751da177e4SLinus Torvalds 376b2c88554SMasahiro Yamadatargets += $(filter-out $(subdir-builtin), $(real-obj-y)) 377b2c88554SMasahiro Yamadatargets += $(filter-out $(subdir-modorder), $(real-obj-m)) 378bcf0c664SMasahiro Yamadatargets += $(real-dtb-y) $(lib-y) $(always-y) $(MAKECMDGOALS) 3791da177e4SLinus Torvalds 3801da177e4SLinus Torvalds# Linker scripts preprocessor (.lds.S -> .lds) 3811da177e4SLinus Torvalds# --------------------------------------------------------------------------- 3821da177e4SLinus Torvaldsquiet_cmd_cpp_lds_S = LDS $@ 3835cb0512cSLinus Torvalds cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \ 38442f29a25STim Abbott -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $< 3851da177e4SLinus Torvalds 386767e581dSSam Ravnborg$(obj)/%.lds: $(src)/%.lds.S FORCE 3871da177e4SLinus Torvalds $(call if_changed_dep,cpp_lds_S) 3881da177e4SLinus Torvalds 3894520c6a4SDavid Howells# ASN.1 grammar 3904520c6a4SDavid Howells# --------------------------------------------------------------------------- 39149d5089dSMasahiro Yamadaquiet_cmd_asn1_compiler = ASN.1 $(basename $@).[ch] 3924520c6a4SDavid Howells cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \ 39349d5089dSMasahiro Yamada $(basename $@).c $(basename $@).h 3944520c6a4SDavid Howells 3954fa8bc94SMasahiro Yamada$(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler 3964520c6a4SDavid Howells $(call cmd,asn1_compiler) 3974520c6a4SDavid Howells 3981da177e4SLinus Torvalds# Build the compiled-in targets 3991da177e4SLinus Torvalds# --------------------------------------------------------------------------- 4001da177e4SLinus Torvalds 4011da177e4SLinus Torvalds# To build objects in subdirs, we need to descend into the directories 402aaa385baSMasahiro Yamada$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ; 403454753d9SMasahiro Yamada$(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ; 4041da177e4SLinus Torvalds 40538e89184SSami Tolvanen# combine symversions for later processing 40638e89184SSami Tolvanenifeq ($(CONFIG_LTO_CLANG) $(CONFIG_MODVERSIONS),y y) 40738e89184SSami Tolvanen cmd_update_lto_symversions = \ 40838e89184SSami Tolvanen rm -f $@.symversions \ 40938e89184SSami Tolvanen $(foreach n, $(filter-out FORCE,$^), \ 4101d11053dSLecopzer Chen $(if $(shell test -s $(n).symversions && echo y), \ 41138e89184SSami Tolvanen ; cat $(n).symversions >> $@.symversions)) 41238e89184SSami Tolvanenelse 41338e89184SSami Tolvanen cmd_update_lto_symversions = echo >/dev/null 41438e89184SSami Tolvanenendif 41538e89184SSami Tolvanen 4161da177e4SLinus Torvalds# 417dee94953SMasahiro Yamada# Rule to compile a set of .o files into one .a file (without symbol table) 4181da177e4SLinus Torvalds# 419a5967db9SStephen Rothwell 4205e18f029SMasahiro Yamadaquiet_cmd_ar_builtin = AR $@ 42113dc8c02SMasahiro Yamada cmd_ar_builtin = rm -f $@; $(AR) cDPrST $@ $(real-prereqs) 4221da177e4SLinus Torvalds 42338e89184SSami Tolvanenquiet_cmd_ar_and_symver = AR $@ 42438e89184SSami Tolvanen cmd_ar_and_symver = $(cmd_update_lto_symversions); $(cmd_ar_builtin) 42538e89184SSami Tolvanen 426e578edc7SMasahiro Yamada$(obj)/built-in.a: $(real-obj-y) FORCE 42738e89184SSami Tolvanen $(call if_changed,ar_and_symver) 4281da177e4SLinus Torvalds 4291da177e4SLinus Torvalds# 430551559e1STejun Heo# Rule to create modules.order file 431551559e1STejun Heo# 432551559e1STejun Heo# Create commands to either record .ko file or cat modules.order from 433551559e1STejun Heo# a subdirectory 434b2c88554SMasahiro Yamada# Add $(obj-m) as the prerequisite to avoid updating the timestamp of 435b2c88554SMasahiro Yamada# modules.order unless contained modules are updated. 436b2c88554SMasahiro Yamada 437b2c88554SMasahiro Yamadacmd_modules_order = { $(foreach m, $(real-prereqs), \ 438b2c88554SMasahiro Yamada $(if $(filter %/modules.order, $m), cat $m, echo $(patsubst %.o,%.ko,$m));) :; } \ 439e0e1b1ecSMasahiro Yamada | $(AWK) '!x[$$0]++' - > $@ 440551559e1STejun Heo 441b2c88554SMasahiro Yamada$(obj)/modules.order: $(obj-m) FORCE 442b2c88554SMasahiro Yamada $(call if_changed,modules_order) 443b2c88554SMasahiro Yamada 444551559e1STejun Heo# 445dee94953SMasahiro Yamada# Rule to compile a set of .o files into one .a file (with symbol table) 4461da177e4SLinus Torvalds# 44738e89184SSami Tolvanenquiet_cmd_ar_lib = AR $@ 44838e89184SSami Tolvanen cmd_ar_lib = $(cmd_update_lto_symversions); $(cmd_ar) 44938e89184SSami Tolvanen 450e578edc7SMasahiro Yamada$(obj)/lib.a: $(lib-y) FORCE 45138e89184SSami Tolvanen $(call if_changed,ar_lib) 4521da177e4SLinus Torvalds 453d31ed5d7SPeter Zijlstraifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),) 454dc5723b0SSami Tolvanenquiet_cmd_link_multi-m = AR [M] $@ 455dc5723b0SSami Tolvanencmd_link_multi-m = \ 45638e89184SSami Tolvanen $(cmd_update_lto_symversions); \ 457dc5723b0SSami Tolvanen rm -f $@; \ 458*feb7d79fSMasahiro Yamada $(AR) cDPrsT $@ @$(patsubst %.o,%.mod,$@) 459dc5723b0SSami Tolvanenelse 4601da177e4SLinus Torvaldsquiet_cmd_link_multi-m = LD [M] $@ 461*feb7d79fSMasahiro Yamada cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ @$(patsubst %.o,%.mod,$@) 462dc5723b0SSami Tolvanenendif 4631da177e4SLinus Torvalds 464*feb7d79fSMasahiro Yamada$(multi-obj-m): %.o: %.mod FORCE 4651da177e4SLinus Torvalds $(call if_changed,link_multi-m) 466a6601e01SMasahiro Yamada$(call multi_depend, $(multi-obj-m), .o, -objs -y -m) 4671da177e4SLinus Torvalds 468591f6689SMasahiro Yamadatargets := $(filter-out $(PHONY), $(targets)) 4691da177e4SLinus Torvalds 470b23d1a24SMasahiro Yamada# Add intermediate targets: 471b23d1a24SMasahiro Yamada# When building objects with specific suffix patterns, add intermediate 472b23d1a24SMasahiro Yamada# targets that the final targets are derived from. 473b23d1a24SMasahiro Yamadaintermediate_targets = $(foreach sfx, $(2), \ 474b23d1a24SMasahiro Yamada $(patsubst %$(strip $(1)),%$(sfx), \ 475b23d1a24SMasahiro Yamada $(filter %$(strip $(1)), $(targets)))) 47654a702f7SMasahiro Yamada# %.asn1.o <- %.asn1.[ch] <- %.asn1 477a7f92419SMasahiro Yamada# %.dtb.o <- %.dtb.S <- %.dtb <- %.dts 478b23d1a24SMasahiro Yamada# %.lex.o <- %.lex.c <- %.l 479b23d1a24SMasahiro Yamada# %.tab.o <- %.tab.[ch] <- %.y 48054a702f7SMasahiro Yamadatargets += $(call intermediate_targets, .asn1.o, .asn1.c .asn1.h) \ 48154a702f7SMasahiro Yamada $(call intermediate_targets, .dtb.o, .dtb.S .dtb) \ 482a7f92419SMasahiro Yamada $(call intermediate_targets, .lex.o, .lex.c) \ 483b23d1a24SMasahiro Yamada $(call intermediate_targets, .tab.o, .tab.c .tab.h) 484b23d1a24SMasahiro Yamada 485394053f4SMasahiro Yamada# Build 486394053f4SMasahiro Yamada# --------------------------------------------------------------------------- 487394053f4SMasahiro Yamada 488394053f4SMasahiro Yamadaifdef single-build 489394053f4SMasahiro Yamada 49020312629SMasahiro YamadaKBUILD_SINGLE_TARGETS := $(filter $(obj)/%, $(KBUILD_SINGLE_TARGETS)) 49120312629SMasahiro Yamada 492394053f4SMasahiro Yamadacurdir-single := $(sort $(foreach x, $(KBUILD_SINGLE_TARGETS), \ 493394053f4SMasahiro Yamada $(if $(filter $(x) $(basename $(x)).o, $(targets)), $(x)))) 494394053f4SMasahiro Yamada 495394053f4SMasahiro Yamada# Handle single targets without any rule: show "Nothing to be done for ..." or 496394053f4SMasahiro Yamada# "No rule to make target ..." depending on whether the target exists. 497394053f4SMasahiro Yamadaunknown-single := $(filter-out $(addsuffix /%, $(subdir-ym)), \ 49820312629SMasahiro Yamada $(filter-out $(curdir-single), $(KBUILD_SINGLE_TARGETS))) 499394053f4SMasahiro Yamada 5002dffd23fSMasahiro Yamadasingle-subdirs := $(foreach d, $(subdir-ym), \ 5012dffd23fSMasahiro Yamada $(if $(filter $(d)/%, $(KBUILD_SINGLE_TARGETS)), $(d))) 5022dffd23fSMasahiro Yamada 5032dffd23fSMasahiro Yamada__build: $(curdir-single) $(single-subdirs) 504394053f4SMasahiro Yamadaifneq ($(unknown-single),) 505394053f4SMasahiro Yamada $(Q)$(MAKE) -f /dev/null $(unknown-single) 506394053f4SMasahiro Yamadaendif 507394053f4SMasahiro Yamada @: 508394053f4SMasahiro Yamada 509394053f4SMasahiro Yamadaifeq ($(curdir-single),) 510394053f4SMasahiro Yamada# Nothing to do in this directory. Do not include any .*.cmd file for speed-up 511394053f4SMasahiro Yamadatargets := 512394053f4SMasahiro Yamadaelse 513394053f4SMasahiro Yamadatargets += $(curdir-single) 514394053f4SMasahiro Yamadaendif 515394053f4SMasahiro Yamada 516394053f4SMasahiro Yamadaelse 517394053f4SMasahiro Yamada 518f3908ab3SMasahiro Yamada__build: $(if $(KBUILD_BUILTIN), $(targets-for-builtin)) \ 519f3908ab3SMasahiro Yamada $(if $(KBUILD_MODULES), $(targets-for-modules)) \ 5205f2fb52fSMasahiro Yamada $(subdir-ym) $(always-y) 521394053f4SMasahiro Yamada @: 522394053f4SMasahiro Yamada 523394053f4SMasahiro Yamadaendif 524394053f4SMasahiro Yamada 5251da177e4SLinus Torvalds# Descending 5261da177e4SLinus Torvalds# --------------------------------------------------------------------------- 5271da177e4SLinus Torvalds 5284f193362SPaul SmithPHONY += $(subdir-ym) 5291da177e4SLinus Torvalds$(subdir-ym): 530d9f78edfSMasahiro Yamada $(Q)$(MAKE) $(build)=$@ \ 531394053f4SMasahiro Yamada $(if $(filter $@/, $(KBUILD_SINGLE_TARGETS)),single-build=) \ 532aaa385baSMasahiro Yamada need-builtin=$(if $(filter $@/built-in.a, $(subdir-builtin)),1) \ 533454753d9SMasahiro Yamada need-modorder=$(if $(filter $@/modules.order, $(subdir-modorder)),1) 5341da177e4SLinus Torvalds 5351da177e4SLinus Torvalds# Add FORCE to the prequisites of a target to force it to be always rebuilt. 5361da177e4SLinus Torvalds# --------------------------------------------------------------------------- 5371da177e4SLinus Torvalds 5384f193362SPaul SmithPHONY += FORCE 5391da177e4SLinus Torvalds 5401da177e4SLinus TorvaldsFORCE: 5411da177e4SLinus Torvalds 5421da177e4SLinus Torvalds# Read all saved command lines and dependencies for the $(targets) we 5431da177e4SLinus Torvalds# may be building above, using $(if_changed{,_dep}). As an 5441da177e4SLinus Torvalds# optimization, we don't need to read them if the target does not 5451da177e4SLinus Torvalds# exist, we will rebuild anyway in that case. 5461da177e4SLinus Torvalds 547392885eeSMasahiro Yamadaexisting-targets := $(wildcard $(sort $(targets))) 5481da177e4SLinus Torvalds 549392885eeSMasahiro Yamada-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) 5504f193362SPaul Smith 5518a78756eSMasahiro Yamada# Create directories for object files if they do not exist 552cc8a51caSMasahiro Yamadaobj-dirs := $(sort $(patsubst %/,%, $(dir $(targets)))) 553392885eeSMasahiro Yamada# If targets exist, their directories apparently exist. Skip mkdir. 554392885eeSMasahiro Yamadaexisting-dirs := $(sort $(patsubst %/,%, $(dir $(existing-targets)))) 555392885eeSMasahiro Yamadaobj-dirs := $(strip $(filter-out $(existing-dirs), $(obj-dirs))) 556c4da7ed0SMasahiro Yamadaifneq ($(obj-dirs),) 5578a78756eSMasahiro Yamada$(shell mkdir -p $(obj-dirs)) 5588a78756eSMasahiro Yamadaendif 5598a78756eSMasahiro Yamada 5604f193362SPaul Smith.PHONY: $(PHONY) 561