1# ========================================================================== 2# Building 3# ========================================================================== 4 5src := $(obj) 6 7.PHONY: __build 8__build: 9 10# Read .config if it exist, otherwise ignore 11-include .config 12 13include $(if $(wildcard $(obj)/Kbuild), $(obj)/Kbuild, $(obj)/Makefile) 14 15include scripts/Makefile.lib 16 17ifdef host-progs 18ifneq ($(hostprogs-y),$(host-progs)) 19$(warning kbuild: $(obj)/Makefile - Usage of host-progs is deprecated. Please replace with hostprogs-y!) 20hostprogs-y += $(host-progs) 21endif 22endif 23 24# Do not include host rules unles needed 25ifneq ($(hostprogs-y)$(hostprogs-m),) 26include scripts/Makefile.host 27endif 28 29ifneq ($(KBUILD_SRC),) 30# Create output directory if not already present 31_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj)) 32 33# Create directories for object files if directory does not exist 34# Needed when obj-y := dir/file.o syntax is used 35_dummy := $(foreach d,$(obj-dirs), $(shell [ -d $(d) ] || mkdir -p $(d))) 36endif 37 38 39ifdef EXTRA_TARGETS 40$(warning kbuild: $(obj)/Makefile - Usage of EXTRA_TARGETS is obsolete in 2.6. Please fix!) 41endif 42 43ifdef build-targets 44$(warning kbuild: $(obj)/Makefile - Usage of build-targets is obsolete in 2.6. Please fix!) 45endif 46 47ifdef export-objs 48$(warning kbuild: $(obj)/Makefile - Usage of export-objs is obsolete in 2.6. Please fix!) 49endif 50 51ifdef O_TARGET 52$(warning kbuild: $(obj)/Makefile - Usage of O_TARGET := $(O_TARGET) is obsolete in 2.6. Please fix!) 53endif 54 55ifdef L_TARGET 56$(error kbuild: $(obj)/Makefile - Use of L_TARGET is replaced by lib-y in 2.6. Please fix!) 57endif 58 59ifdef list-multi 60$(warning kbuild: $(obj)/Makefile - list-multi := $(list-multi) is obsolete in 2.6. Please fix!) 61endif 62 63ifndef obj 64$(warning kbuild: Makefile.build is included improperly) 65endif 66 67# =========================================================================== 68 69ifneq ($(strip $(lib-y) $(lib-m) $(lib-n) $(lib-)),) 70lib-target := $(obj)/lib.a 71endif 72 73ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(lib-target)),) 74builtin-target := $(obj)/built-in.o 75endif 76 77# We keep a list of all modules in $(MODVERDIR) 78 79__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \ 80 $(if $(KBUILD_MODULES),$(obj-m)) \ 81 $(subdir-ym) $(always) 82 @: 83 84# Linus' kernel sanity checking tool 85ifneq ($(KBUILD_CHECKSRC),0) 86 CHECKFLAGS += -I$(shell $(CC) -print-file-name=include) 87 ifeq ($(KBUILD_CHECKSRC),2) 88 quiet_cmd_force_checksrc = CHECK $< 89 cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ; 90 else 91 quiet_cmd_checksrc = CHECK $< 92 cmd_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ; 93 endif 94endif 95 96 97# Compile C sources (.c) 98# --------------------------------------------------------------------------- 99 100# Default is built-in, unless we know otherwise 101modkern_cflags := $(CFLAGS_KERNEL) 102quiet_modtag := $(empty) $(empty) 103 104$(real-objs-m) : modkern_cflags := $(CFLAGS_MODULE) 105$(real-objs-m:.o=.i) : modkern_cflags := $(CFLAGS_MODULE) 106$(real-objs-m:.o=.s) : modkern_cflags := $(CFLAGS_MODULE) 107$(real-objs-m:.o=.lst): modkern_cflags := $(CFLAGS_MODULE) 108 109$(real-objs-m) : quiet_modtag := [M] 110$(real-objs-m:.o=.i) : quiet_modtag := [M] 111$(real-objs-m:.o=.s) : quiet_modtag := [M] 112$(real-objs-m:.o=.lst): quiet_modtag := [M] 113 114$(obj-m) : quiet_modtag := [M] 115 116# Default for not multi-part modules 117modname = $(*F) 118 119$(multi-objs-m) : modname = $(modname-multi) 120$(multi-objs-m:.o=.i) : modname = $(modname-multi) 121$(multi-objs-m:.o=.s) : modname = $(modname-multi) 122$(multi-objs-m:.o=.lst) : modname = $(modname-multi) 123$(multi-objs-y) : modname = $(modname-multi) 124$(multi-objs-y:.o=.i) : modname = $(modname-multi) 125$(multi-objs-y:.o=.s) : modname = $(modname-multi) 126$(multi-objs-y:.o=.lst) : modname = $(modname-multi) 127 128quiet_cmd_cc_s_c = CC $(quiet_modtag) $@ 129cmd_cc_s_c = $(CC) $(c_flags) -S -o $@ $< 130 131%.s: %.c FORCE 132 $(call if_changed_dep,cc_s_c) 133 134quiet_cmd_cc_i_c = CPP $(quiet_modtag) $@ 135cmd_cc_i_c = $(CPP) $(c_flags) -o $@ $< 136 137%.i: %.c FORCE 138 $(call if_changed_dep,cc_i_c) 139 140# C (.c) files 141# The C file is compiled and updated dependency information is generated. 142# (See cmd_cc_o_c + relevant part of rule_cc_o_c) 143 144quiet_cmd_cc_o_c = CC $(quiet_modtag) $@ 145 146ifndef CONFIG_MODVERSIONS 147cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< 148 149else 150# When module versioning is enabled the following steps are executed: 151# o compile a .tmp_<file>.o from <file>.c 152# o if .tmp_<file>.o doesn't contain a __ksymtab version, i.e. does 153# not export symbols, we just rename .tmp_<file>.o to <file>.o and 154# are done. 155# o otherwise, we calculate symbol versions using the good old 156# genksyms on the preprocessed source and postprocess them in a way 157# that they are usable as a linker script 158# o generate <file>.o from .tmp_<file>.o using the linker to 159# replace the unresolved symbols __crc_exported_symbol with 160# the actual value of the checksum generated by genksyms 161 162cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $< 163cmd_modversions = \ 164 if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ 165 $(CPP) -D__GENKSYMS__ $(c_flags) $< \ 166 | $(GENKSYMS) \ 167 > $(@D)/.tmp_$(@F:.o=.ver); \ 168 \ 169 $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ 170 -T $(@D)/.tmp_$(@F:.o=.ver); \ 171 rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \ 172 else \ 173 mv $(@D)/.tmp_$(@F) $@; \ 174 fi; 175endif 176 177define rule_cc_o_c 178 $(if $($(quiet)cmd_checksrc),echo ' $($(quiet)cmd_checksrc)';) \ 179 $(cmd_checksrc) \ 180 $(if $($(quiet)cmd_cc_o_c),echo ' $($(quiet)cmd_cc_o_c)';) \ 181 $(cmd_cc_o_c); \ 182 $(cmd_modversions) \ 183 scripts/basic/fixdep $(depfile) $@ '$(cmd_cc_o_c)' > $(@D)/.$(@F).tmp; \ 184 rm -f $(depfile); \ 185 mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd 186endef 187 188# Built-in and composite module parts 189 190%.o: %.c FORCE 191 $(call cmd,force_checksrc) 192 $(call if_changed_rule,cc_o_c) 193 194# Single-part modules are special since we need to mark them in $(MODVERDIR) 195 196$(single-used-m): %.o: %.c FORCE 197 $(call cmd,force_checksrc) 198 $(call if_changed_rule,cc_o_c) 199 @{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod) 200 201quiet_cmd_cc_lst_c = MKLST $@ 202 cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \ 203 $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \ 204 System.map $(OBJDUMP) > $@ 205 206%.lst: %.c FORCE 207 $(call if_changed_dep,cc_lst_c) 208 209# Compile assembler sources (.S) 210# --------------------------------------------------------------------------- 211 212modkern_aflags := $(AFLAGS_KERNEL) 213 214$(real-objs-m) : modkern_aflags := $(AFLAGS_MODULE) 215$(real-objs-m:.o=.s): modkern_aflags := $(AFLAGS_MODULE) 216 217quiet_cmd_as_s_S = CPP $(quiet_modtag) $@ 218cmd_as_s_S = $(CPP) $(a_flags) -o $@ $< 219 220%.s: %.S FORCE 221 $(call if_changed_dep,as_s_S) 222 223quiet_cmd_as_o_S = AS $(quiet_modtag) $@ 224cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< 225 226%.o: %.S FORCE 227 $(call if_changed_dep,as_o_S) 228 229targets += $(real-objs-y) $(real-objs-m) $(lib-y) 230targets += $(extra-y) $(MAKECMDGOALS) $(always) 231 232# Linker scripts preprocessor (.lds.S -> .lds) 233# --------------------------------------------------------------------------- 234quiet_cmd_cpp_lds_S = LDS $@ 235 cmd_cpp_lds_S = $(CPP) $(cpp_flags) -D__ASSEMBLY__ -o $@ $< 236 237%.lds: %.lds.S FORCE 238 $(call if_changed_dep,cpp_lds_S) 239 240# Build the compiled-in targets 241# --------------------------------------------------------------------------- 242 243# To build objects in subdirs, we need to descend into the directories 244$(sort $(subdir-obj-y)): $(subdir-ym) ; 245 246# 247# Rule to compile a set of .o files into one .o file 248# 249ifdef builtin-target 250quiet_cmd_link_o_target = LD $@ 251# If the list of objects to link is empty, just create an empty built-in.o 252cmd_link_o_target = $(if $(strip $(obj-y)),\ 253 $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^),\ 254 rm -f $@; $(AR) rcs $@) 255 256$(builtin-target): $(obj-y) FORCE 257 $(call if_changed,link_o_target) 258 259targets += $(builtin-target) 260endif # builtin-target 261 262# 263# Rule to compile a set of .o files into one .a file 264# 265ifdef lib-target 266quiet_cmd_link_l_target = AR $@ 267cmd_link_l_target = rm -f $@; $(AR) $(EXTRA_ARFLAGS) rcs $@ $(lib-y) 268 269$(lib-target): $(lib-y) FORCE 270 $(call if_changed,link_l_target) 271 272targets += $(lib-target) 273endif 274 275# 276# Rule to link composite objects 277# 278# Composite objects are specified in kbuild makefile as follows: 279# <composite-object>-objs := <list of .o files> 280# or 281# <composite-object>-y := <list of .o files> 282link_multi_deps = \ 283$(filter $(addprefix $(obj)/, \ 284$($(subst $(obj)/,,$(@:.o=-objs))) \ 285$($(subst $(obj)/,,$(@:.o=-y)))), $^) 286 287quiet_cmd_link_multi-y = LD $@ 288cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) 289 290quiet_cmd_link_multi-m = LD [M] $@ 291cmd_link_multi-m = $(LD) $(ld_flags) $(LDFLAGS_MODULE) -o $@ $(link_multi_deps) 292 293# We would rather have a list of rules like 294# foo.o: $(foo-objs) 295# but that's not so easy, so we rather make all composite objects depend 296# on the set of all their parts 297$(multi-used-y) : %.o: $(multi-objs-y) FORCE 298 $(call if_changed,link_multi-y) 299 300$(multi-used-m) : %.o: $(multi-objs-m) FORCE 301 $(call if_changed,link_multi-m) 302 @{ echo $(@:.o=.ko); echo $(link_multi_deps); } > $(MODVERDIR)/$(@F:.o=.mod) 303 304targets += $(multi-used-y) $(multi-used-m) 305 306 307# Descending 308# --------------------------------------------------------------------------- 309 310.PHONY: $(subdir-ym) 311$(subdir-ym): 312 $(Q)$(MAKE) $(build)=$@ 313 314# Add FORCE to the prequisites of a target to force it to be always rebuilt. 315# --------------------------------------------------------------------------- 316 317.PHONY: FORCE 318 319FORCE: 320 321# Read all saved command lines and dependencies for the $(targets) we 322# may be building above, using $(if_changed{,_dep}). As an 323# optimization, we don't need to read them if the target does not 324# exist, we will rebuild anyway in that case. 325 326targets := $(wildcard $(sort $(targets))) 327cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) 328 329ifneq ($(cmd_files),) 330 include $(cmd_files) 331endif 332

