Makefile.build 17.5 KB
Newer Older
1
# SPDX-License-Identifier: GPL-2.0
Linus Torvalds's avatar
Linus Torvalds committed
2 3 4 5 6 7
# ==========================================================================
# Building
# ==========================================================================

src := $(obj)

8
PHONY := __build
Linus Torvalds's avatar
Linus Torvalds committed
9 10
__build:

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
# Init all relevant variables used in kbuild files so
# 1) they have correct type
# 2) they do not inherit any value from the environment
obj-y :=
obj-m :=
lib-y :=
lib-m :=
always :=
targets :=
subdir-y :=
subdir-m :=
EXTRA_AFLAGS   :=
EXTRA_CFLAGS   :=
EXTRA_CPPFLAGS :=
EXTRA_LDFLAGS  :=
26 27 28 29
asflags-y  :=
ccflags-y  :=
cppflags-y :=
ldflags-y  :=
30

31 32 33
subdir-asflags-y :=
subdir-ccflags-y :=

34
# Read auto.conf if it exists, otherwise ignore
35
-include include/config/auto.conf
Linus Torvalds's avatar
Linus Torvalds committed
36

37 38
include scripts/Kbuild.include

Sam Ravnborg's avatar
Sam Ravnborg committed
39
# The filename Kbuild has precedence over Makefile
40
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
41 42 43
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
include $(kbuild-file)

Linus Torvalds's avatar
Linus Torvalds committed
44 45
include scripts/Makefile.lib

46
# Do not include host rules unless needed
Emese Revfy's avatar
Emese Revfy committed
47
ifneq ($(hostprogs-y)$(hostprogs-m)$(hostlibs-y)$(hostlibs-m)$(hostcxxlibs-y)$(hostcxxlibs-m),)
Linus Torvalds's avatar
Linus Torvalds committed
48 49 50 51 52 53 54
include scripts/Makefile.host
endif

ifndef obj
$(warning kbuild: Makefile.build is included improperly)
endif

55
ifeq ($(need-modorder),)
56 57 58 59 60 61
ifneq ($(obj-m),)
$(warning $(patsubst %.o,'%.ko',$(obj-m)) will not be built even though obj-m is specified.)
$(warning You cannot use subdir-y/m to visit a module Makefile. Use obj-y/m instead.)
endif
endif

Linus Torvalds's avatar
Linus Torvalds committed
62 63
# ===========================================================================

64
ifneq ($(strip $(lib-y) $(lib-m) $(lib-)),)
Linus Torvalds's avatar
Linus Torvalds committed
65
lib-target := $(obj)/lib.a
66
real-obj-y += $(obj)/lib-ksyms.o
Linus Torvalds's avatar
Linus Torvalds committed
67 68
endif

69
ifneq ($(strip $(real-obj-y) $(need-builtin)),)
70
builtin-target := $(obj)/built-in.a
Linus Torvalds's avatar
Linus Torvalds committed
71 72
endif

73
ifeq ($(CONFIG_MODULES)$(need-modorder),y1)
Tejun Heo's avatar
Tejun Heo committed
74
modorder-target := $(obj)/modules.order
75
endif
Tejun Heo's avatar
Tejun Heo committed
76

77 78
mod-targets := $(patsubst %.o, %.mod, $(obj-m))

Linus Torvalds's avatar
Linus Torvalds committed
79
# Linus' kernel sanity checking tool
80 81
ifeq ($(KBUILD_CHECKSRC),1)
  quiet_cmd_checksrc       = CHECK   $<
82
        cmd_checksrc       = $(CHECK) $(CHECKFLAGS) $(c_flags) $<
83 84
else ifeq ($(KBUILD_CHECKSRC),2)
  quiet_cmd_force_checksrc = CHECK   $<
85
        cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $<
Linus Torvalds's avatar
Linus Torvalds committed
86 87
endif

88
ifneq ($(KBUILD_EXTRA_WARN),)
89
  cmd_checkdoc = $(srctree)/scripts/kernel-doc -none $<
90 91
endif

Linus Torvalds's avatar
Linus Torvalds committed
92 93 94 95
# Compile C sources (.c)
# ---------------------------------------------------------------------------

quiet_cmd_cc_s_c = CC $(quiet_modtag)  $@
96
      cmd_cc_s_c = $(CC) $(filter-out $(DEBUG_CFLAGS), $(c_flags)) $(DISABLE_LTO) -fverbose-asm -S -o $@ $<
Linus Torvalds's avatar
Linus Torvalds committed
97

98
$(obj)/%.s: $(src)/%.c FORCE
Linus Torvalds's avatar
Linus Torvalds committed
99 100
	$(call if_changed_dep,cc_s_c)

101 102
quiet_cmd_cpp_i_c = CPP $(quiet_modtag) $@
cmd_cpp_i_c       = $(CPP) $(c_flags) -o $@ $<
Linus Torvalds's avatar
Linus Torvalds committed
103

104
$(obj)/%.i: $(src)/%.c FORCE
105
	$(call if_changed_dep,cpp_i_c)
Linus Torvalds's avatar
Linus Torvalds committed
106

107 108
# These mirror gensymtypes_S and co below, keep them in synch.
cmd_gensymtypes_c =                                                         \
109
    $(CPP) -D__GENKSYMS__ $(c_flags) $< |                                   \
110
    scripts/genksyms/genksyms $(if $(1), -T $(2))                           \
111
     $(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS))                             \
112
     $(if $(KBUILD_PRESERVE),-p)                                            \
113
     -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
114

115
quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
116
cmd_cc_symtypes_c =                                                         \
117
    $(call cmd_gensymtypes_c,true,$@) >/dev/null;                           \
118
    test -s $@ || rm -f $@
119

120
$(obj)/%.symtypes : $(src)/%.c FORCE
121
	$(call cmd,cc_symtypes_c)
122

123 124 125 126 127 128 129 130
# LLVM assembly
# Generate .ll files from .c
quiet_cmd_cc_ll_c = CC $(quiet_modtag)  $@
      cmd_cc_ll_c = $(CC) $(c_flags) -emit-llvm -S -o $@ $<

$(obj)/%.ll: $(src)/%.c FORCE
	$(call if_changed_dep,cc_ll_c)

Linus Torvalds's avatar
Linus Torvalds committed
131 132 133 134 135
# C (.c) files
# The C file is compiled and updated dependency information is generated.
# (See cmd_cc_o_c + relevant part of rule_cc_o_c)

quiet_cmd_cc_o_c = CC $(quiet_modtag)  $@
136
      cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
Linus Torvalds's avatar
Linus Torvalds committed
137

138
ifdef CONFIG_MODVERSIONS
Linus Torvalds's avatar
Linus Torvalds committed
139
# When module versioning is enabled the following steps are executed:
140 141 142
# o compile a <file>.o from <file>.c
# o if <file>.o doesn't contain a __ksymtab version, i.e. does
#   not export symbols, it's done.
Linus Torvalds's avatar
Linus Torvalds committed
143 144
# o otherwise, we calculate symbol versions using the good old
#   genksyms on the preprocessed source and postprocess them in a way
145
#   that they are usable as a linker script
146
# o generate .tmp_<file>.o from <file>.o using the linker to
147 148
#   replace the unresolved symbols __crc_exported_symbol with
#   the actual value of the checksum generated by genksyms
149
# o remove .tmp_<file>.o to <file>.o
150 151

cmd_modversions_c =								\
152
	if $(OBJDUMP) -h $@ | grep -q __ksymtab; then				\
153
		$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes))	\
154 155
		    > $(@D)/.tmp_$(@F:.o=.ver);					\
										\
156
		$(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ 		\
157 158
			-T $(@D)/.tmp_$(@F:.o=.ver);				\
		mv -f $(@D)/.tmp_$(@F) $@;					\
159
		rm -f $(@D)/.tmp_$(@F:.o=.ver);					\
160
	fi
Linus Torvalds's avatar
Linus Torvalds committed
161 162
endif

163
ifdef CONFIG_FTRACE_MCOUNT_RECORD
164 165
ifndef CC_USING_RECORD_MCOUNT
# compiler will not generate __mcount_loc use recordmcount or recordmcount.pl
166
ifdef BUILD_C_RECORDMCOUNT
167 168 169
ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
  RECORDMCOUNT_FLAGS = -w
endif
170 171
# Due to recursion, we must skip empty.o.
# The empty.o file is created in the make process in order to determine
172 173
# the target endianness and word size. It is made before all other C
# files, including recordmcount.
Wu Zhangjin's avatar
Wu Zhangjin committed
174 175
sub_cmd_record_mcount =					\
	if [ $(@) != "scripts/mod/empty.o" ]; then	\
176
		$(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)";	\
Wu Zhangjin's avatar
Wu Zhangjin committed
177
	fi;
178 179
recordmcount_source := $(srctree)/scripts/recordmcount.c \
		    $(srctree)/scripts/recordmcount.h
180
else
181
sub_cmd_record_mcount = perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \
182
	"$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \
183
	"$(if $(CONFIG_64BIT),64,32)" \
184
	"$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS)" \
185
	"$(LD) $(KBUILD_LDFLAGS)" "$(NM)" "$(RM)" "$(MV)" \
186
	"$(if $(part-of-module),1,0)" "$(@)";
187
recordmcount_source := $(srctree)/scripts/recordmcount.pl
188
endif # BUILD_C_RECORDMCOUNT
189 190
cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)),	\
	$(sub_cmd_record_mcount))
191
endif # CC_USING_RECORD_MCOUNT
192
endif # CONFIG_FTRACE_MCOUNT_RECORD
193

194
ifdef CONFIG_STACK_VALIDATION
195
ifneq ($(SKIP_STACK_VALIDATION),1)
196 197 198

__objtool_obj := $(objtree)/tools/objtool/objtool

199
objtool_args = $(if $(CONFIG_UNWINDER_ORC),orc generate,check)
200

201 202
objtool_args += $(if $(part-of-module), --module,)

203 204 205
ifndef CONFIG_FRAME_POINTER
objtool_args += --no-fp
endif
206 207 208
ifdef CONFIG_GCOV_KERNEL
objtool_args += --no-unreachable
endif
209 210 211
ifdef CONFIG_RETPOLINE
  objtool_args += --retpoline
endif
212 213 214
ifdef CONFIG_X86_SMAP
  objtool_args += --uaccess
endif
215

216 217 218 219 220
# 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file
cmd_objtool = $(if $(patsubst y%,, \
	$(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \
221
	$(__objtool_obj) $(objtool_args) $@)
222 223 224 225
objtool_obj = $(if $(patsubst y%,, \
	$(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \
	$(__objtool_obj))

226
endif # SKIP_STACK_VALIDATION
227 228
endif # CONFIG_STACK_VALIDATION

229 230 231 232 233
# Rebuild all objects when objtool changes, or is enabled/disabled.
objtool_dep = $(objtool_obj)					\
	      $(wildcard include/config/orc/unwinder.h		\
			 include/config/stack/validation.h)

234 235
ifdef CONFIG_TRIM_UNUSED_KSYMS
cmd_gen_ksymdeps = \
236
	$(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd
237 238
endif

Linus Torvalds's avatar
Linus Torvalds committed
239
define rule_cc_o_c
240 241 242 243 244 245 246
	$(call cmd,checksrc)
	$(call cmd_and_fixdep,cc_o_c)
	$(call cmd,gen_ksymdeps)
	$(call cmd,checkdoc)
	$(call cmd,objtool)
	$(call cmd,modversions_c)
	$(call cmd,record_mcount)
Linus Torvalds's avatar
Linus Torvalds committed
247 248
endef

249
define rule_as_o_S
250 251 252 253
	$(call cmd_and_fixdep,as_o_S)
	$(call cmd,gen_ksymdeps)
	$(call cmd,objtool)
	$(call cmd,modversions_S)
254 255
endef

256 257
# List module undefined symbols (or empty line if not enabled)
ifdef CONFIG_TRIM_UNUSED_KSYMS
258
cmd_undef_syms = $(NM) $< | sed -n 's/^  *U //p' | xargs echo
259 260 261 262
else
cmd_undef_syms = echo
endif

Linus Torvalds's avatar
Linus Torvalds committed
263
# Built-in and composite module parts
264
$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
Linus Torvalds's avatar
Linus Torvalds committed
265 266 267
	$(call cmd,force_checksrc)
	$(call if_changed_rule,cc_o_c)

268 269 270 271 272 273 274 275 276
cmd_mod = { \
	echo $(if $($*-objs)$($*-y)$($*-m), $(addprefix $(obj)/, $($*-objs) $($*-y) $($*-m)), $(@:.mod=.o)); \
	$(cmd_undef_syms); \
	} > $@

$(obj)/%.mod: $(obj)/%.o FORCE
	$(call if_changed,mod)

targets += $(mod-targets)
Linus Torvalds's avatar
Linus Torvalds committed
277 278 279 280 281 282

quiet_cmd_cc_lst_c = MKLST   $@
      cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
		     $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
				     System.map $(OBJDUMP) > $@

283
$(obj)/%.lst: $(src)/%.c FORCE
Linus Torvalds's avatar
Linus Torvalds committed
284 285
	$(call if_changed_dep,cc_lst_c)

286
# header test (header-test-y, header-test-m target)
287 288
# ---------------------------------------------------------------------------

289 290
quiet_cmd_cc_s_h = CC      $@
      cmd_cc_s_h = $(CC) $(c_flags) -S -o $@ -x c /dev/null -include $<
291

292 293
$(obj)/%.h.s: $(src)/%.h FORCE
	$(call if_changed_dep,cc_s_h)
294

Linus Torvalds's avatar
Linus Torvalds committed
295 296 297
# Compile assembler sources (.S)
# ---------------------------------------------------------------------------

298 299 300 301 302 303 304 305 306 307 308 309
# .S file exports must have their C prototypes defined in asm/asm-prototypes.h
# or a file that it includes, in order to get versioned symbols. We build a
# dummy C file that includes asm-prototypes and the EXPORT_SYMBOL lines from
# the .S file (with trailing ';'), and run genksyms on that, to extract vers.
#
# This is convoluted. The .S file must first be preprocessed to run guards and
# expand names, then the resulting exports must be constructed into plain
# EXPORT_SYMBOL(symbol); to build our dummy C file, and that gets preprocessed
# to make the genksyms input.
#
# These mirror gensymtypes_c and co above, keep them in synch.
cmd_gensymtypes_S =                                                         \
310
   { echo "\#include <linux/kernel.h>" ;                                    \
311 312
     echo "\#include <asm/asm-prototypes.h>" ;                              \
    $(CPP) $(a_flags) $< |                                                  \
313
     grep "\<___EXPORT_SYMBOL\>" |                                          \
314
     sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ; } | \
315
    $(CPP) -D__GENKSYMS__ $(c_flags) -xc - |                                \
316
    scripts/genksyms/genksyms $(if $(1), -T $(2))                           \
317
     $(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS))                             \
318 319 320 321 322 323 324 325 326 327 328 329
     $(if $(KBUILD_PRESERVE),-p)                                            \
     -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))

quiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@
cmd_cc_symtypes_S =                                                         \
    $(call cmd_gensymtypes_S,true,$@) >/dev/null;                           \
    test -s $@ || rm -f $@

$(obj)/%.symtypes : $(src)/%.S FORCE
	$(call cmd,cc_symtypes_S)


330 331
quiet_cmd_cpp_s_S = CPP $(quiet_modtag) $@
cmd_cpp_s_S       = $(CPP) $(a_flags) -o $@ $<
Linus Torvalds's avatar
Linus Torvalds committed
332

333
$(obj)/%.s: $(src)/%.S FORCE
334
	$(call if_changed_dep,cpp_s_S)
Linus Torvalds's avatar
Linus Torvalds committed
335 336

quiet_cmd_as_o_S = AS $(quiet_modtag)  $@
337
      cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
338

339
ifdef CONFIG_ASM_MODVERSIONS
340 341 342 343 344

# versioning matches the C process described above, with difference that
# we parse asm-prototypes.h C header to get function definitions.

cmd_modversions_S =								\
345
	if $(OBJDUMP) -h $@ | grep -q __ksymtab; then				\
346 347 348
		$(call cmd_gensymtypes_S,$(KBUILD_SYMTYPES),$(@:.o=.symtypes))	\
		    > $(@D)/.tmp_$(@F:.o=.ver);					\
										\
349
		$(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ 		\
350 351
			-T $(@D)/.tmp_$(@F:.o=.ver);				\
		mv -f $(@D)/.tmp_$(@F) $@;					\
352
		rm -f $(@D)/.tmp_$(@F:.o=.ver);					\
353
	fi
354
endif
Linus Torvalds's avatar
Linus Torvalds committed
355

356
$(obj)/%.o: $(src)/%.S $(objtool_dep) FORCE
357
	$(call if_changed_rule,as_o_S)
Linus Torvalds's avatar
Linus Torvalds committed
358

359
targets += $(filter-out $(subdir-obj-y), $(real-obj-y)) $(real-obj-m) $(lib-y)
Linus Torvalds's avatar
Linus Torvalds committed
360 361 362 363 364
targets += $(extra-y) $(MAKECMDGOALS) $(always)

# Linker scripts preprocessor (.lds.S -> .lds)
# ---------------------------------------------------------------------------
quiet_cmd_cpp_lds_S = LDS     $@
365
      cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \
366
	                     -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
Linus Torvalds's avatar
Linus Torvalds committed
367

368
$(obj)/%.lds: $(src)/%.lds.S FORCE
Linus Torvalds's avatar
Linus Torvalds committed
369 370
	$(call if_changed_dep,cpp_lds_S)

371 372
# ASN.1 grammar
# ---------------------------------------------------------------------------
373
quiet_cmd_asn1_compiler = ASN.1   $(basename $@).[ch]
374
      cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \
375
				$(basename $@).c $(basename $@).h
376

377
$(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
378 379
	$(call cmd,asn1_compiler)

Linus Torvalds's avatar
Linus Torvalds committed
380 381 382 383 384 385 386
# Build the compiled-in targets
# ---------------------------------------------------------------------------

# To build objects in subdirs, we need to descend into the directories
$(sort $(subdir-obj-y)): $(subdir-ym) ;

#
387
# Rule to compile a set of .o files into one .a file (without symbol table)
Linus Torvalds's avatar
Linus Torvalds committed
388 389
#
ifdef builtin-target
390

391
quiet_cmd_ar_builtin = AR      $@
392
      cmd_ar_builtin = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(real-prereqs)
Linus Torvalds's avatar
Linus Torvalds committed
393

394
$(builtin-target): $(real-obj-y) FORCE
395
	$(call if_changed,ar_builtin)
Linus Torvalds's avatar
Linus Torvalds committed
396 397 398 399

targets += $(builtin-target)
endif # builtin-target

Tejun Heo's avatar
Tejun Heo committed
400 401 402 403 404 405
#
# Rule to create modules.order file
#
# Create commands to either record .ko file or cat modules.order from
# a subdirectory
$(modorder-target): $(subdir-ym) FORCE
406 407 408
	$(Q){ $(foreach m, $(modorder), \
	$(if $(filter %/modules.order, $m), cat $m, echo $m);) :; } \
	| $(AWK) '!x[$$0]++' - > $@
Tejun Heo's avatar
Tejun Heo committed
409

Linus Torvalds's avatar
Linus Torvalds committed
410
#
411
# Rule to compile a set of .o files into one .a file (with symbol table)
Linus Torvalds's avatar
Linus Torvalds committed
412 413 414 415
#
ifdef lib-target

$(lib-target): $(lib-y) FORCE
416
	$(call if_changed,ar)
Linus Torvalds's avatar
Linus Torvalds committed
417 418

targets += $(lib-target)
419 420 421 422 423 424

dummy-object = $(obj)/.lib_exports.o
ksyms-lds = $(dot-target).lds

quiet_cmd_export_list = EXPORTS $@
cmd_export_list = $(OBJDUMP) -h $< | \
425
	sed -ne '/___ksymtab/s/.*+\([^ ]*\).*/EXTERN(\1)/p' >$(ksyms-lds);\
426
	rm -f $(dummy-object);\
427
	echo | $(CC) $(a_flags) -c -o $(dummy-object) -x assembler -;\
428 429 430 431 432
	$(LD) $(ld_flags) -r -o $@ -T $(ksyms-lds) $(dummy-object);\
	rm $(dummy-object) $(ksyms-lds)

$(obj)/lib-ksyms.o: $(lib-target) FORCE
	$(call if_changed,export_list)
433 434 435

targets += $(obj)/lib-ksyms.o

Linus Torvalds's avatar
Linus Torvalds committed
436 437
endif

438 439 440 441
# NOTE:
# Do not replace $(filter %.o,^) with $(real-prereqs). When a single object
# module is turned into a multi object module, $^ will contain header file
# dependencies recorded in the .*.cmd file.
Linus Torvalds's avatar
Linus Torvalds committed
442
quiet_cmd_link_multi-m = LD [M]  $@
443
      cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o,$^)
Linus Torvalds's avatar
Linus Torvalds committed
444

445
$(multi-used-m): FORCE
Linus Torvalds's avatar
Linus Torvalds committed
446
	$(call if_changed,link_multi-m)
447
$(call multi_depend, $(multi-used-m), .o, -objs -y -m)
Linus Torvalds's avatar
Linus Torvalds committed
448

449
targets += $(multi-used-m)
450
targets := $(filter-out $(PHONY), $(targets))
Linus Torvalds's avatar
Linus Torvalds committed
451

452 453 454 455 456 457
# Add intermediate targets:
# When building objects with specific suffix patterns, add intermediate
# targets that the final targets are derived from.
intermediate_targets = $(foreach sfx, $(2), \
				$(patsubst %$(strip $(1)),%$(sfx), \
					$(filter %$(strip $(1)), $(targets))))
458
# %.asn1.o <- %.asn1.[ch] <- %.asn1
459
# %.dtb.o <- %.dtb.S <- %.dtb <- %.dts
460 461
# %.lex.o <- %.lex.c <- %.l
# %.tab.o <- %.tab.[ch] <- %.y
462 463
targets += $(call intermediate_targets, .asn1.o, .asn1.c .asn1.h) \
	   $(call intermediate_targets, .dtb.o, .dtb.S .dtb) \
464
	   $(call intermediate_targets, .lex.o, .lex.c) \
465 466
	   $(call intermediate_targets, .tab.o, .tab.c .tab.h)

467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
# Build
# ---------------------------------------------------------------------------

ifdef single-build

curdir-single := $(sort $(foreach x, $(KBUILD_SINGLE_TARGETS), \
			$(if $(filter $(x) $(basename $(x)).o, $(targets)), $(x))))

# Handle single targets without any rule: show "Nothing to be done for ..." or
# "No rule to make target ..." depending on whether the target exists.
unknown-single := $(filter-out $(addsuffix /%, $(subdir-ym)), \
			$(filter $(obj)/%, \
				$(filter-out $(curdir-single), \
					$(KBUILD_SINGLE_TARGETS))))

__build: $(curdir-single) $(subdir-ym)
ifneq ($(unknown-single),)
	$(Q)$(MAKE) -f /dev/null $(unknown-single)
endif
	@:

ifeq ($(curdir-single),)
# Nothing to do in this directory. Do not include any .*.cmd file for speed-up
targets :=
else
targets += $(curdir-single)
endif

else

__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
	 $(if $(KBUILD_MODULES),$(obj-m) $(mod-targets) $(modorder-target)) \
	 $(subdir-ym) $(always)
	@:

endif

Linus Torvalds's avatar
Linus Torvalds committed
504 505 506
# Descending
# ---------------------------------------------------------------------------

507
PHONY += $(subdir-ym)
Linus Torvalds's avatar
Linus Torvalds committed
508
$(subdir-ym):
509
	$(Q)$(MAKE) $(build)=$@ \
510
	$(if $(filter $@/, $(KBUILD_SINGLE_TARGETS)),single-build=) \
511 512
	need-builtin=$(if $(filter $@/built-in.a, $(subdir-obj-y)),1) \
	need-modorder=$(if $(need-modorder),$(if $(filter $@/modules.order, $(modorder)),1))
Linus Torvalds's avatar
Linus Torvalds committed
513 514 515 516

# Add FORCE to the prequisites of a target to force it to be always rebuilt.
# ---------------------------------------------------------------------------

517
PHONY += FORCE
Linus Torvalds's avatar
Linus Torvalds committed
518 519 520 521 522 523 524 525

FORCE:

# Read all saved command lines and dependencies for the $(targets) we
# may be building above, using $(if_changed{,_dep}). As an
# optimization, we don't need to read them if the target does not
# exist, we will rebuild anyway in that case.

526
existing-targets := $(wildcard $(sort $(targets)))
Linus Torvalds's avatar
Linus Torvalds committed
527

528
-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
529

530
ifdef building_out_of_srctree
531 532
# Create directories for object files if they do not exist
obj-dirs := $(sort $(obj) $(patsubst %/,%, $(dir $(targets))))
533 534 535
# If targets exist, their directories apparently exist. Skip mkdir.
existing-dirs := $(sort $(patsubst %/,%, $(dir $(existing-targets))))
obj-dirs := $(strip $(filter-out $(existing-dirs), $(obj-dirs)))
536
ifneq ($(obj-dirs),)
537 538
$(shell mkdir -p $(obj-dirs))
endif
539
endif
540

541
.PHONY: $(PHONY)