Makefile.build 19.0 KB
Newer Older
1
# SPDX-License-Identifier: GPL-2.0
L
Linus Torvalds 已提交
2 3 4 5 6 7
# ==========================================================================
# Building
# ==========================================================================

src := $(obj)

8
PHONY := __build
L
Linus Torvalds 已提交
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 :=

R
Robert P. J. Day 已提交
34
# Read auto.conf if it exists, otherwise ignore
R
Roman Zippel 已提交
35
-include include/config/auto.conf
L
Linus Torvalds 已提交
36

37 38
include scripts/Kbuild.include

R
Robert P. J. Day 已提交
39
# For backward compatibility check that these variables do not change
40 41
save-cflags := $(CFLAGS)

S
Sam Ravnborg 已提交
42
# The filename Kbuild has precedence over Makefile
43
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
44 45 46 47 48 49
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
include $(kbuild-file)

# If the save-* variables changed error out
ifeq ($(KBUILD_NOPEDANTIC),)
        ifneq ("$(save-cflags)","$(CFLAGS)")
50
                $(error CFLAGS was changed in "$(kbuild-file)". Fix it to use ccflags-y)
51 52
        endif
endif
B
Borislav Petkov 已提交
53

L
Linus Torvalds 已提交
54 55
include scripts/Makefile.lib

R
Robert P. J. Day 已提交
56
# Do not include host rules unless needed
E
Emese Revfy 已提交
57
ifneq ($(hostprogs-y)$(hostprogs-m)$(hostlibs-y)$(hostlibs-m)$(hostcxxlibs-y)$(hostcxxlibs-m),)
L
Linus Torvalds 已提交
58 59 60 61 62 63 64 65 66
include scripts/Makefile.host
endif

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

# ===========================================================================

67
ifneq ($(strip $(lib-y) $(lib-m) $(lib-)),)
L
Linus Torvalds 已提交
68
lib-target := $(obj)/lib.a
69
real-obj-y += $(obj)/lib-ksyms.o
L
Linus Torvalds 已提交
70 71
endif

72
ifneq ($(strip $(real-obj-y) $(need-builtin)),)
73
builtin-target := $(obj)/built-in.a
L
Linus Torvalds 已提交
74 75
endif

T
Tejun Heo 已提交
76 77
modorder-target := $(obj)/modules.order

L
Linus Torvalds 已提交
78 79 80
# We keep a list of all modules in $(MODVERDIR)

__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
T
Tejun Heo 已提交
81
	 $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
L
Linus Torvalds 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94 95
	 $(subdir-ym) $(always)
	@:

# Linus' kernel sanity checking tool
ifneq ($(KBUILD_CHECKSRC),0)
  ifeq ($(KBUILD_CHECKSRC),2)
    quiet_cmd_force_checksrc = CHECK   $<
          cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ;
  else
      quiet_cmd_checksrc     = CHECK   $<
            cmd_checksrc     = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ;
  endif
endif

96 97 98 99
ifneq ($(KBUILD_ENABLE_EXTRA_GCC_CHECKS),)
  cmd_checkdoc = $(srctree)/scripts/kernel-doc -none $< ;
endif

100
# Do section mismatch analysis for each module/built-in.a
101 102 103
ifdef CONFIG_DEBUG_SECTION_MISMATCH
  cmd_secanalysis = ; scripts/mod/modpost $@
endif
L
Linus Torvalds 已提交
104 105 106 107 108

# Compile C sources (.c)
# ---------------------------------------------------------------------------

# Default is built-in, unless we know otherwise
109 110 111
modkern_cflags =                                          \
	$(if $(part-of-module),                           \
		$(KBUILD_CFLAGS_MODULE) $(CFLAGS_MODULE), \
112
		$(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL))
L
Linus Torvalds 已提交
113 114
quiet_modtag := $(empty)   $(empty)

115 116 117 118
$(real-obj-m)        : part-of-module := y
$(real-obj-m:.o=.i)  : part-of-module := y
$(real-obj-m:.o=.s)  : part-of-module := y
$(real-obj-m:.o=.lst): part-of-module := y
L
Linus Torvalds 已提交
119

120 121 122 123
$(real-obj-m)        : quiet_modtag := [M]
$(real-obj-m:.o=.i)  : quiet_modtag := [M]
$(real-obj-m:.o=.s)  : quiet_modtag := [M]
$(real-obj-m:.o=.lst): quiet_modtag := [M]
L
Linus Torvalds 已提交
124

125
$(obj-m)             : quiet_modtag := [M]
L
Linus Torvalds 已提交
126 127

quiet_cmd_cc_s_c = CC $(quiet_modtag)  $@
128
cmd_cc_s_c       = $(CC) $(c_flags) $(DISABLE_LTO) -fverbose-asm -S -o $@ $<
L
Linus Torvalds 已提交
129

130
$(obj)/%.s: $(src)/%.c FORCE
L
Linus Torvalds 已提交
131 132
	$(call if_changed_dep,cc_s_c)

133 134
quiet_cmd_cpp_i_c = CPP $(quiet_modtag) $@
cmd_cpp_i_c       = $(CPP) $(c_flags) -o $@ $<
L
Linus Torvalds 已提交
135

136
$(obj)/%.i: $(src)/%.c FORCE
137
	$(call if_changed_dep,cpp_i_c)
L
Linus Torvalds 已提交
138

139 140
# These mirror gensymtypes_S and co below, keep them in synch.
cmd_gensymtypes_c =                                                         \
S
Sam Ravnborg 已提交
141
    $(CPP) -D__GENKSYMS__ $(c_flags) $< |                                   \
142
    $(GENKSYMS) $(if $(1), -T $(2))                                         \
143
     $(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS))                             \
S
Sam Ravnborg 已提交
144
     $(if $(KBUILD_PRESERVE),-p)                                            \
145
     -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
S
Sam Ravnborg 已提交
146

147
quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
S
Sam Ravnborg 已提交
148 149
cmd_cc_symtypes_c =                                                         \
    set -e;                                                                 \
150
    $(call cmd_gensymtypes_c,true,$@) >/dev/null;                           \
S
Sam Ravnborg 已提交
151
    test -s $@ || rm -f $@
152

153
$(obj)/%.symtypes : $(src)/%.c FORCE
154
	$(call cmd,cc_symtypes_c)
155

156 157 158 159 160 161 162 163
# 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)

L
Linus Torvalds 已提交
164 165 166 167 168 169 170 171 172 173 174
# 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)  $@

ifndef CONFIG_MODVERSIONS
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<

else
# When module versioning is enabled the following steps are executed:
175 176 177
# o compile a .tmp_<file>.o from <file>.c
# o if .tmp_<file>.o doesn't contain a __ksymtab version, i.e. does
#   not export symbols, we just rename .tmp_<file>.o to <file>.o and
L
Linus Torvalds 已提交
178 179 180
#   are done.
# o otherwise, we calculate symbol versions using the good old
#   genksyms on the preprocessed source and postprocess them in a way
181 182 183 184
#   that they are usable as a linker script
# o generate <file>.o from .tmp_<file>.o using the linker to
#   replace the unresolved symbols __crc_exported_symbol with
#   the actual value of the checksum generated by genksyms
L
Linus Torvalds 已提交
185

186
cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
187 188

cmd_modversions_c =								\
189
	if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then		\
190
		$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes))	\
191 192 193 194 195 196 197
		    > $(@D)/.tmp_$(@F:.o=.ver);					\
										\
		$(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) 			\
			-T $(@D)/.tmp_$(@F:.o=.ver);				\
		rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver);		\
	else									\
		mv -f $(@D)/.tmp_$(@F) $@;					\
L
Linus Torvalds 已提交
198 199 200
	fi;
endif

201
ifdef CONFIG_FTRACE_MCOUNT_RECORD
202 203
ifndef CC_USING_RECORD_MCOUNT
# compiler will not generate __mcount_loc use recordmcount or recordmcount.pl
204
ifdef BUILD_C_RECORDMCOUNT
205 206 207
ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
  RECORDMCOUNT_FLAGS = -w
endif
208 209
# Due to recursion, we must skip empty.o.
# The empty.o file is created in the make process in order to determine
210 211
# the target endianness and word size. It is made before all other C
# files, including recordmcount.
W
Wu Zhangjin 已提交
212 213
sub_cmd_record_mcount =					\
	if [ $(@) != "scripts/mod/empty.o" ]; then	\
214
		$(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)";	\
W
Wu Zhangjin 已提交
215
	fi;
216 217
recordmcount_source := $(srctree)/scripts/recordmcount.c \
		    $(srctree)/scripts/recordmcount.h
218
else
W
Wu Zhangjin 已提交
219
sub_cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \
220
	"$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \
221
	"$(if $(CONFIG_64BIT),64,32)" \
222
	"$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CFLAGS)" \
223
	"$(LD) $(LDFLAGS)" "$(NM)" "$(RM)" "$(MV)" \
224
	"$(if $(part-of-module),1,0)" "$(@)";
225
recordmcount_source := $(srctree)/scripts/recordmcount.pl
226
endif # BUILD_C_RECORDMCOUNT
227 228 229
cmd_record_mcount =						\
	if [ "$(findstring $(CC_FLAGS_FTRACE),$(_c_flags))" =	\
	     "$(CC_FLAGS_FTRACE)" ]; then			\
W
Wu Zhangjin 已提交
230 231
		$(sub_cmd_record_mcount)			\
	fi;
232
endif # CC_USING_RECORD_MCOUNT
233
endif # CONFIG_FTRACE_MCOUNT_RECORD
234

235
ifdef CONFIG_STACK_VALIDATION
236
ifneq ($(SKIP_STACK_VALIDATION),1)
237 238 239

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

240
objtool_args = $(if $(CONFIG_UNWINDER_ORC),orc generate,check)
241

242 243
objtool_args += $(if $(part-of-module), --module,)

244 245 246
ifndef CONFIG_FRAME_POINTER
objtool_args += --no-fp
endif
247 248
ifdef CONFIG_GCOV_KERNEL
objtool_args += --no-unreachable
249 250
else
objtool_args += $(call cc-ifversion, -lt, 0405, --no-unreachable)
251
endif
252
ifdef CONFIG_RETPOLINE
253
ifneq ($(RETPOLINE_CFLAGS),)
254 255
  objtool_args += --retpoline
endif
256
endif
257

258

259 260 261 262 263 264
ifdef CONFIG_MODVERSIONS
objtool_o = $(@D)/.tmp_$(@F)
else
objtool_o = $(@)
endif

265 266 267 268 269
# '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), \
270
	$(__objtool_obj) $(objtool_args) "$(objtool_o)";)
271 272 273 274
objtool_obj = $(if $(patsubst y%,, \
	$(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \
	$(__objtool_obj))

275
endif # SKIP_STACK_VALIDATION
276 277
endif # CONFIG_STACK_VALIDATION

278 279 280 281 282
# 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)

L
Linus Torvalds 已提交
283
define rule_cc_o_c
284
	$(call echo-cmd,checksrc) $(cmd_checksrc)			  \
285
	$(call cmd_and_fixdep,cc_o_c)					  \
286
	$(cmd_checkdoc)							  \
287
	$(call echo-cmd,objtool) $(cmd_objtool)				  \
288
	$(cmd_modversions_c)						  \
289
	$(call echo-cmd,record_mcount) $(cmd_record_mcount)
L
Linus Torvalds 已提交
290 291
endef

292
define rule_as_o_S
293
	$(call cmd_and_fixdep,as_o_S)					  \
294 295
	$(call echo-cmd,objtool) $(cmd_objtool)				  \
	$(cmd_modversions_S)
296 297
endef

298 299
# List module undefined symbols (or empty line if not enabled)
ifdef CONFIG_TRIM_UNUSED_KSYMS
300
cmd_undef_syms = $(NM) $@ | sed -n 's/^  *U //p' | xargs echo
301 302 303 304
else
cmd_undef_syms = echo
endif

L
Linus Torvalds 已提交
305
# Built-in and composite module parts
306
$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
L
Linus Torvalds 已提交
307 308 309 310 311
	$(call cmd,force_checksrc)
	$(call if_changed_rule,cc_o_c)

# Single-part modules are special since we need to mark them in $(MODVERDIR)

312
$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
L
Linus Torvalds 已提交
313 314
	$(call cmd,force_checksrc)
	$(call if_changed_rule,cc_o_c)
315 316
	@{ echo $(@:.o=.ko); echo $@; \
	   $(cmd_undef_syms); } > $(MODVERDIR)/$(@F:.o=.mod)
L
Linus Torvalds 已提交
317 318 319 320 321 322

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) > $@

323
$(obj)/%.lst: $(src)/%.c FORCE
L
Linus Torvalds 已提交
324 325 326 327 328
	$(call if_changed_dep,cc_lst_c)

# Compile assembler sources (.S)
# ---------------------------------------------------------------------------

329
modkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL)
L
Linus Torvalds 已提交
330

331 332
$(real-obj-m)      : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
$(real-obj-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
L
Linus Torvalds 已提交
333

334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
# .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 =                                                         \
    (echo "\#include <linux/kernel.h>" ;                                    \
     echo "\#include <asm/asm-prototypes.h>" ;                              \
    $(CPP) $(a_flags) $< |                                                  \
349 350
     grep "\<___EXPORT_SYMBOL\>" |                                          \
     sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ) | \
351 352
    $(CPP) -D__GENKSYMS__ $(c_flags) -xc - |                                \
    $(GENKSYMS) $(if $(1), -T $(2))                                         \
353
     $(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS))                             \
354 355 356 357 358 359 360 361 362 363 364 365 366
     $(if $(KBUILD_PRESERVE),-p)                                            \
     -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))

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

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


367 368
quiet_cmd_cpp_s_S = CPP $(quiet_modtag) $@
cmd_cpp_s_S       = $(CPP) $(a_flags) -o $@ $<
L
Linus Torvalds 已提交
369

370
$(obj)/%.s: $(src)/%.S FORCE
371
	$(call if_changed_dep,cpp_s_S)
L
Linus Torvalds 已提交
372 373

quiet_cmd_as_o_S = AS $(quiet_modtag)  $@
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404

ifndef CONFIG_MODVERSIONS
cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<

else

ASM_PROTOTYPES := $(wildcard $(srctree)/arch/$(SRCARCH)/include/asm/asm-prototypes.h)

ifeq ($(ASM_PROTOTYPES),)
cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<

else

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

cmd_as_o_S = $(CC) $(a_flags) -c -o $(@D)/.tmp_$(@F) $<

cmd_modversions_S =								\
	if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then		\
		$(call cmd_gensymtypes_S,$(KBUILD_SYMTYPES),$(@:.o=.symtypes))	\
		    > $(@D)/.tmp_$(@F:.o=.ver);					\
										\
		$(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) 			\
			-T $(@D)/.tmp_$(@F:.o=.ver);				\
		rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver);		\
	else									\
		mv -f $(@D)/.tmp_$(@F) $@;					\
	fi;
endif
endif
L
Linus Torvalds 已提交
405

406
$(obj)/%.o: $(src)/%.S $(objtool_dep) FORCE
407
	$(call if_changed_rule,as_o_S)
L
Linus Torvalds 已提交
408

409
targets += $(filter-out $(subdir-obj-y), $(real-obj-y)) $(real-obj-m) $(lib-y)
L
Linus Torvalds 已提交
410 411 412 413 414
targets += $(extra-y) $(MAKECMDGOALS) $(always)

# Linker scripts preprocessor (.lds.S -> .lds)
# ---------------------------------------------------------------------------
quiet_cmd_cpp_lds_S = LDS     $@
415
      cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \
416
	                     -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
L
Linus Torvalds 已提交
417

418
$(obj)/%.lds: $(src)/%.lds.S FORCE
L
Linus Torvalds 已提交
419 420
	$(call if_changed_dep,cpp_lds_S)

421 422 423 424 425 426
# ASN.1 grammar
# ---------------------------------------------------------------------------
quiet_cmd_asn1_compiler = ASN.1   $@
      cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \
				$(subst .h,.c,$@) $(subst .c,.h,$@)

427
$(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
428 429
	$(call cmd,asn1_compiler)

L
Linus Torvalds 已提交
430 431 432 433 434 435 436 437 438 439
# Build the compiled-in targets
# ---------------------------------------------------------------------------

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

#
# Rule to compile a set of .o files into one .o file
#
ifdef builtin-target
440

441
# built-in.a archives are made with no symbol table or index which
442
# makes them small and fast, but unable to be used by the linker.
443
# scripts/link-vmlinux.sh builds an aggregate built-in.a with a symbol
444
# table and index.
445 446 447
quiet_cmd_ar_builtin = AR      $@
      cmd_ar_builtin = rm -f $@; \
                     $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(filter $(real-obj-y), $^)
L
Linus Torvalds 已提交
448

449
$(builtin-target): $(real-obj-y) FORCE
450
	$(call if_changed,ar_builtin)
L
Linus Torvalds 已提交
451 452 453 454

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

T
Tejun Heo 已提交
455 456 457 458 459 460 461 462 463 464 465 466 467
#
# Rule to create modules.order file
#
# Create commands to either record .ko file or cat modules.order from
# a subdirectory
modorder-cmds =						\
	$(foreach m, $(modorder),			\
		$(if $(filter %/modules.order, $m),	\
			cat $m;, echo kernel/$m;))

$(modorder-target): $(subdir-ym) FORCE
	$(Q)(cat /dev/null; $(modorder-cmds)) > $@

L
Linus Torvalds 已提交
468 469 470 471 472
#
# Rule to compile a set of .o files into one .a file
#
ifdef lib-target
quiet_cmd_link_l_target = AR      $@
473

474 475
# lib target archives do get a symbol table and index
cmd_link_l_target = rm -f $@; $(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(lib-y)
L
Linus Torvalds 已提交
476 477 478 479 480

$(lib-target): $(lib-y) FORCE
	$(call if_changed,link_l_target)

targets += $(lib-target)
481 482 483 484 485 486

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

quiet_cmd_export_list = EXPORTS $@
cmd_export_list = $(OBJDUMP) -h $< | \
487
	sed -ne '/___ksymtab/s/.*+\([^ ]*\).*/EXTERN(\1)/p' >$(ksyms-lds);\
488
	rm -f $(dummy-object);\
489
	echo | $(CC) $(a_flags) -c -o $(dummy-object) -x assembler -;\
490 491 492 493 494
	$(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)
495 496 497

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

L
Linus Torvalds 已提交
498 499 500 501 502 503 504 505 506
endif

#
# Rule to link composite objects
#
#  Composite objects are specified in kbuild makefile as follows:
#    <composite-object>-objs := <list of .o files>
#  or
#    <composite-object>-y    := <list of .o files>
507 508 509
#  or
#    <composite-object>-m    := <list of .o files>
#  The -m syntax only works if <composite object> is a module
L
Linus Torvalds 已提交
510 511 512
link_multi_deps =                     \
$(filter $(addprefix $(obj)/,         \
$($(subst $(obj)/,,$(@:.o=-objs)))    \
513 514
$($(subst $(obj)/,,$(@:.o=-y)))       \
$($(subst $(obj)/,,$(@:.o=-m)))), $^)
515

L
Linus Torvalds 已提交
516
quiet_cmd_link_multi-m = LD [M]  $@
517
cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
L
Linus Torvalds 已提交
518

519
$(multi-used-m): FORCE
L
Linus Torvalds 已提交
520
	$(call if_changed,link_multi-m)
521 522
	@{ echo $(@:.o=.ko); echo $(link_multi_deps); \
	   $(cmd_undef_syms); } > $(MODVERDIR)/$(@F:.o=.mod)
523
$(call multi_depend, $(multi-used-m), .o, -objs -y -m)
L
Linus Torvalds 已提交
524

525
targets += $(multi-used-m)
526
targets := $(filter-out $(PHONY), $(targets))
L
Linus Torvalds 已提交
527

528 529 530 531 532 533
# 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))))
534
# %.asn1.o <- %.asn1.[ch] <- %.asn1
535
# %.dtb.o <- %.dtb.S <- %.dtb <- %.dts
536 537
# %.lex.o <- %.lex.c <- %.l
# %.tab.o <- %.tab.[ch] <- %.y
538 539
targets += $(call intermediate_targets, .asn1.o, .asn1.c .asn1.h) \
	   $(call intermediate_targets, .dtb.o, .dtb.S .dtb) \
540
	   $(call intermediate_targets, .lex.o, .lex.c) \
541 542
	   $(call intermediate_targets, .tab.o, .tab.c .tab.h)

L
Linus Torvalds 已提交
543 544 545
# Descending
# ---------------------------------------------------------------------------

546
PHONY += $(subdir-ym)
L
Linus Torvalds 已提交
547
$(subdir-ym):
548
	$(Q)$(MAKE) $(build)=$@ need-builtin=$(if $(findstring $@,$(subdir-obj-y)),1)
L
Linus Torvalds 已提交
549 550 551 552

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

553
PHONY += FORCE
L
Linus Torvalds 已提交
554 555 556 557 558 559 560 561

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.

562
cmd_files := $(wildcard $(foreach f,$(sort $(targets)),$(dir $(f)).$(notdir $(f)).cmd))
L
Linus Torvalds 已提交
563 564 565 566

ifneq ($(cmd_files),)
  include $(cmd_files)
endif
567

568 569 570
ifneq ($(KBUILD_SRC),)
# Create directories for object files if they do not exist
obj-dirs := $(sort $(obj) $(patsubst %/,%, $(dir $(targets))))
571 572 573 574
# If cmd_files exist, their directories apparently exist.  Skip mkdir.
exist-dirs := $(sort $(patsubst %/,%, $(dir $(cmd_files))))
obj-dirs := $(strip $(filter-out $(exist-dirs), $(obj-dirs)))
ifneq ($(obj-dirs),)
575 576
$(shell mkdir -p $(obj-dirs))
endif
577
endif
578

579 580 581 582
# Some files contained in $(targets) are intermediate artifacts.
# We never want them to be removed automatically.
.SECONDARY: $(targets)

583
.PHONY: $(PHONY)