Makefile.build 19.8 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

39
# For backward compatibility check that these variables do not change
40
41
save-cflags := $(CFLAGS)

Sam Ravnborg's avatar
Sam Ravnborg committed
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
Borislav Petkov's avatar
Borislav Petkov committed
53

Linus Torvalds's avatar
Linus Torvalds committed
54
55
56
57
58
59
60
61
62
include scripts/Makefile.lib

ifdef host-progs
ifneq ($(hostprogs-y),$(host-progs))
$(warning kbuild: $(obj)/Makefile - Usage of host-progs is deprecated. Please replace with hostprogs-y!)
hostprogs-y += $(host-progs)
endif
endif

63
# Do not include host rules unless needed
Emese Revfy's avatar
Emese Revfy committed
64
ifneq ($(hostprogs-y)$(hostprogs-m)$(hostlibs-y)$(hostlibs-m)$(hostcxxlibs-y)$(hostcxxlibs-m),)
Linus Torvalds's avatar
Linus Torvalds committed
65
66
67
68
69
70
71
72
73
include scripts/Makefile.host
endif

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

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

74
ifneq ($(strip $(lib-y) $(lib-m) $(lib-)),)
Linus Torvalds's avatar
Linus Torvalds committed
75
lib-target := $(obj)/lib.a
76
obj-y += $(obj)/lib-ksyms.o
Linus Torvalds's avatar
Linus Torvalds committed
77
78
endif

79
ifneq ($(strip $(obj-y) $(need-builtin)),)
Linus Torvalds's avatar
Linus Torvalds committed
80
81
82
builtin-target := $(obj)/built-in.o
endif

Tejun Heo's avatar
Tejun Heo committed
83
84
modorder-target := $(obj)/modules.order

Linus Torvalds's avatar
Linus Torvalds committed
85
86
87
# We keep a list of all modules in $(MODVERDIR)

__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
Tejun Heo's avatar
Tejun Heo committed
88
	 $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
Linus Torvalds's avatar
Linus Torvalds committed
89
90
91
92
93
94
95
96
97
98
99
100
101
102
	 $(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

103
104
105
106
ifneq ($(KBUILD_ENABLE_EXTRA_GCC_CHECKS),)
  cmd_checkdoc = $(srctree)/scripts/kernel-doc -none $< ;
endif

107
108
109
110
# Do section mismatch analysis for each module/built-in.o
ifdef CONFIG_DEBUG_SECTION_MISMATCH
  cmd_secanalysis = ; scripts/mod/modpost $@
endif
Linus Torvalds's avatar
Linus Torvalds committed
111
112
113
114
115

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

# Default is built-in, unless we know otherwise
116
117
118
modkern_cflags =                                          \
	$(if $(part-of-module),                           \
		$(KBUILD_CFLAGS_MODULE) $(CFLAGS_MODULE), \
119
		$(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL))
Linus Torvalds's avatar
Linus Torvalds committed
120
121
quiet_modtag := $(empty)   $(empty)

122
123
124
125
$(real-objs-m)        : part-of-module := y
$(real-objs-m:.o=.i)  : part-of-module := y
$(real-objs-m:.o=.s)  : part-of-module := y
$(real-objs-m:.o=.lst): part-of-module := y
Linus Torvalds's avatar
Linus Torvalds committed
126
127
128
129
130
131
132
133
134

$(real-objs-m)        : quiet_modtag := [M]
$(real-objs-m:.o=.i)  : quiet_modtag := [M]
$(real-objs-m:.o=.s)  : quiet_modtag := [M]
$(real-objs-m:.o=.lst): quiet_modtag := [M]

$(obj-m)              : quiet_modtag := [M]

# Default for not multi-part modules
135
modname = $(basetarget)
Linus Torvalds's avatar
Linus Torvalds committed
136
137
138
139
140
141
142
143
144
145
146

$(multi-objs-m)         : modname = $(modname-multi)
$(multi-objs-m:.o=.i)   : modname = $(modname-multi)
$(multi-objs-m:.o=.s)   : modname = $(modname-multi)
$(multi-objs-m:.o=.lst) : modname = $(modname-multi)
$(multi-objs-y)         : modname = $(modname-multi)
$(multi-objs-y:.o=.i)   : modname = $(modname-multi)
$(multi-objs-y:.o=.s)   : modname = $(modname-multi)
$(multi-objs-y:.o=.lst) : modname = $(modname-multi)

quiet_cmd_cc_s_c = CC $(quiet_modtag)  $@
147
cmd_cc_s_c       = $(CC) $(c_flags) $(DISABLE_LTO) -fverbose-asm -S -o $@ $<
Linus Torvalds's avatar
Linus Torvalds committed
148

149
$(obj)/%.s: $(src)/%.c FORCE
Linus Torvalds's avatar
Linus Torvalds committed
150
151
	$(call if_changed_dep,cc_s_c)

152
153
quiet_cmd_cpp_i_c = CPP $(quiet_modtag) $@
cmd_cpp_i_c       = $(CPP) $(c_flags) -o $@ $<
Linus Torvalds's avatar
Linus Torvalds committed
154

155
$(obj)/%.i: $(src)/%.c FORCE
156
	$(call if_changed_dep,cpp_i_c)
Linus Torvalds's avatar
Linus Torvalds committed
157

158
159
# These mirror gensymtypes_S and co below, keep them in synch.
cmd_gensymtypes_c =                                                         \
160
    $(CPP) -D__GENKSYMS__ $(c_flags) $< |                                   \
161
162
    $(GENKSYMS) $(if $(1), -T $(2))                                         \
     $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX))             \
163
     $(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS))                             \
164
     $(if $(KBUILD_PRESERVE),-p)                                            \
165
     -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
166

167
quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
168
169
cmd_cc_symtypes_c =                                                         \
    set -e;                                                                 \
170
    $(call cmd_gensymtypes_c,true,$@) >/dev/null;                           \
171
    test -s $@ || rm -f $@
172

173
$(obj)/%.symtypes : $(src)/%.c FORCE
174
	$(call cmd,cc_symtypes_c)
175

176
177
178
179
180
181
182
183
# 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
184
185
186
187
188
189
190
191
192
193
194
# 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:
195
196
197
# 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
Linus Torvalds's avatar
Linus Torvalds committed
198
199
200
#   are done.
# o otherwise, we calculate symbol versions using the good old
#   genksyms on the preprocessed source and postprocess them in a way
201
202
203
204
#   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
Linus Torvalds's avatar
Linus Torvalds committed
205

206
cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
207
208

cmd_modversions_c =								\
209
	if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then		\
210
		$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes))	\
211
212
213
214
215
216
217
		    > $(@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) $@;					\
Linus Torvalds's avatar
Linus Torvalds committed
218
219
220
	fi;
endif

221
ifdef CONFIG_FTRACE_MCOUNT_RECORD
222
ifdef BUILD_C_RECORDMCOUNT
223
224
225
ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
  RECORDMCOUNT_FLAGS = -w
endif
226
227
# Due to recursion, we must skip empty.o.
# The empty.o file is created in the make process in order to determine
228
229
# the target endianness and word size. It is made before all other C
# files, including recordmcount.
Wu Zhangjin's avatar
Wu Zhangjin committed
230
231
sub_cmd_record_mcount =					\
	if [ $(@) != "scripts/mod/empty.o" ]; then	\
232
		$(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)";	\
Wu Zhangjin's avatar
Wu Zhangjin committed
233
	fi;
234
235
recordmcount_source := $(srctree)/scripts/recordmcount.c \
		    $(srctree)/scripts/recordmcount.h
236
else
Wu Zhangjin's avatar
Wu Zhangjin committed
237
sub_cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \
238
	"$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \
239
	"$(if $(CONFIG_64BIT),64,32)" \
240
241
	"$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CFLAGS)" \
	"$(LD)" "$(NM)" "$(RM)" "$(MV)" \
242
	"$(if $(part-of-module),1,0)" "$(@)";
243
recordmcount_source := $(srctree)/scripts/recordmcount.pl
244
endif # BUILD_C_RECORDMCOUNT
245
246
247
cmd_record_mcount =						\
	if [ "$(findstring $(CC_FLAGS_FTRACE),$(_c_flags))" =	\
	     "$(CC_FLAGS_FTRACE)" ]; then			\
Wu Zhangjin's avatar
Wu Zhangjin committed
248
249
		$(sub_cmd_record_mcount)			\
	fi;
250
endif # CONFIG_FTRACE_MCOUNT_RECORD
251

252
ifdef CONFIG_STACK_VALIDATION
253
ifneq ($(SKIP_STACK_VALIDATION),1)
254
255
256

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

257
objtool_args = $(if $(CONFIG_UNWINDER_ORC),orc generate,check)
258

259
260
objtool_args += $(if $(part-of-module), --module,)

261
262
263
ifndef CONFIG_FRAME_POINTER
objtool_args += --no-fp
endif
264
265
ifdef CONFIG_GCOV_KERNEL
objtool_args += --no-unreachable
266
267
else
objtool_args += $(call cc-ifversion, -lt, 0405, --no-unreachable)
268
endif
269
270
271
272
ifdef CONFIG_RETPOLINE
  objtool_args += --retpoline
endif

273

274
275
276
277
278
279
ifdef CONFIG_MODVERSIONS
objtool_o = $(@D)/.tmp_$(@F)
else
objtool_o = $(@)
endif

280
281
282
283
284
# '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), \
285
	$(__objtool_obj) $(objtool_args) "$(objtool_o)";)
286
287
288
289
objtool_obj = $(if $(patsubst y%,, \
	$(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \
	$(__objtool_obj))

290
endif # SKIP_STACK_VALIDATION
291
292
endif # CONFIG_STACK_VALIDATION

293
294
295
296
297
# 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)

Linus Torvalds's avatar
Linus Torvalds committed
298
define rule_cc_o_c
299
	$(call echo-cmd,checksrc) $(cmd_checksrc)			  \
300
	$(call cmd_and_fixdep,cc_o_c)					  \
301
	$(cmd_checkdoc)							  \
302
	$(call echo-cmd,objtool) $(cmd_objtool)				  \
303
	$(cmd_modversions_c)						  \
304
	$(call echo-cmd,record_mcount) $(cmd_record_mcount)
Linus Torvalds's avatar
Linus Torvalds committed
305
306
endef

307
define rule_as_o_S
308
	$(call cmd_and_fixdep,as_o_S)					  \
309
310
	$(call echo-cmd,objtool) $(cmd_objtool)				  \
	$(cmd_modversions_S)
311
312
endef

313
314
315
316
317
318
319
# List module undefined symbols (or empty line if not enabled)
ifdef CONFIG_TRIM_UNUSED_KSYMS
cmd_undef_syms = $(NM) $@ | sed -n 's/^ \+U //p' | xargs echo
else
cmd_undef_syms = echo
endif

Linus Torvalds's avatar
Linus Torvalds committed
320
# Built-in and composite module parts
321
$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
Linus Torvalds's avatar
Linus Torvalds committed
322
323
324
325
326
	$(call cmd,force_checksrc)
	$(call if_changed_rule,cc_o_c)

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

327
$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
Linus Torvalds's avatar
Linus Torvalds committed
328
329
	$(call cmd,force_checksrc)
	$(call if_changed_rule,cc_o_c)
330
331
	@{ echo $(@:.o=.ko); echo $@; \
	   $(cmd_undef_syms); } > $(MODVERDIR)/$(@F:.o=.mod)
Linus Torvalds's avatar
Linus Torvalds committed
332
333
334
335
336
337

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

338
$(obj)/%.lst: $(src)/%.c FORCE
Linus Torvalds's avatar
Linus Torvalds committed
339
340
341
342
343
	$(call if_changed_dep,cc_lst_c)

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

344
modkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL)
Linus Torvalds's avatar
Linus Torvalds committed
345

346
347
$(real-objs-m)      : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
$(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
Linus Torvalds's avatar
Linus Torvalds committed
348

349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
# .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) $< |                                                  \
364
365
     grep "\<___EXPORT_SYMBOL\>" |                                          \
     sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ) | \
366
367
368
    $(CPP) -D__GENKSYMS__ $(c_flags) -xc - |                                \
    $(GENKSYMS) $(if $(1), -T $(2))                                         \
     $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX))             \
369
     $(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS))                             \
370
371
372
373
374
375
376
377
378
379
380
381
382
     $(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)


383
384
quiet_cmd_cpp_s_S = CPP $(quiet_modtag) $@
cmd_cpp_s_S       = $(CPP) $(a_flags) -o $@ $<
Linus Torvalds's avatar
Linus Torvalds committed
385

386
$(obj)/%.s: $(src)/%.S FORCE
387
	$(call if_changed_dep,cpp_s_S)
Linus Torvalds's avatar
Linus Torvalds committed
388
389

quiet_cmd_as_o_S = AS $(quiet_modtag)  $@
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420

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
Linus Torvalds's avatar
Linus Torvalds committed
421

422
$(obj)/%.o: $(src)/%.S $(objtool_dep) FORCE
423
	$(call if_changed_rule,as_o_S)
Linus Torvalds's avatar
Linus Torvalds committed
424
425
426
427
428
429
430

targets += $(real-objs-y) $(real-objs-m) $(lib-y)
targets += $(extra-y) $(MAKECMDGOALS) $(always)

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

434
$(obj)/%.lds: $(src)/%.lds.S FORCE
Linus Torvalds's avatar
Linus Torvalds committed
435
436
	$(call if_changed_dep,cpp_lds_S)

437
438
439
440
441
442
443
444
445
446
447
# ASN.1 grammar
# ---------------------------------------------------------------------------
quiet_cmd_asn1_compiler = ASN.1   $@
      cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \
				$(subst .h,.c,$@) $(subst .c,.h,$@)

.PRECIOUS: $(objtree)/$(obj)/%-asn1.c $(objtree)/$(obj)/%-asn1.h

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

Linus Torvalds's avatar
Linus Torvalds committed
448
449
450
451
452
453
454
455
456
457
# 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
458
459

ifdef CONFIG_THIN_ARCHIVES
460
461
  cmd_make_builtin = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS)
  cmd_make_empty_builtin = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS)
462
463
464
465
466
467
468
  quiet_cmd_link_o_target = AR      $@
else
  cmd_make_builtin = $(LD) $(ld_flags) -r -o
  cmd_make_empty_builtin = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS)
  quiet_cmd_link_o_target = LD      $@
endif

Linus Torvalds's avatar
Linus Torvalds committed
469
470
# If the list of objects to link is empty, just create an empty built-in.o
cmd_link_o_target = $(if $(strip $(obj-y)),\
471
		      $(cmd_make_builtin) $@ $(filter $(obj-y), $^) \
472
		      $(cmd_secanalysis),\
473
		      $(cmd_make_empty_builtin) $@)
Linus Torvalds's avatar
Linus Torvalds committed
474
475
476
477
478
479
480

$(builtin-target): $(obj-y) FORCE
	$(call if_changed,link_o_target)

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

Tejun Heo's avatar
Tejun Heo committed
481
482
483
484
485
486
487
488
489
490
491
492
493
#
# 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)) > $@

Linus Torvalds's avatar
Linus Torvalds committed
494
495
496
497
498
#
# Rule to compile a set of .o files into one .a file
#
ifdef lib-target
quiet_cmd_link_l_target = AR      $@
499
500

ifdef CONFIG_THIN_ARCHIVES
501
  cmd_link_l_target = rm -f $@; $(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(lib-y)
502
503
504
else
  cmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(lib-y)
endif
Linus Torvalds's avatar
Linus Torvalds committed
505
506
507
508
509

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

targets += $(lib-target)
510
511
512
513
514
515
516
517
518
519
520

dummy-object = $(obj)/.lib_exports.o
ksyms-lds = $(dot-target).lds
ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
ref_prefix = EXTERN(_
else
ref_prefix = EXTERN(
endif

quiet_cmd_export_list = EXPORTS $@
cmd_export_list = $(OBJDUMP) -h $< | \
521
	sed -ne '/___ksymtab/s/.*+\([^ ]*\).*/$(ref_prefix)\1)/p' >$(ksyms-lds);\
522
	rm -f $(dummy-object);\
523
	echo | $(CC) $(a_flags) -c -o $(dummy-object) -x assembler -;\
524
525
526
527
528
	$(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)
529
530
531

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

Linus Torvalds's avatar
Linus Torvalds committed
532
533
534
535
536
537
538
539
540
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>
541
542
543
#  or
#    <composite-object>-m    := <list of .o files>
#  The -m syntax only works if <composite object> is a module
Linus Torvalds's avatar
Linus Torvalds committed
544
545
546
link_multi_deps =                     \
$(filter $(addprefix $(obj)/,         \
$($(subst $(obj)/,,$(@:.o=-objs)))    \
547
548
$($(subst $(obj)/,,$(@:.o=-y)))       \
$($(subst $(obj)/,,$(@:.o=-m)))), $^)
549

550
551
552
553
cmd_link_multi-link = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)

ifdef CONFIG_THIN_ARCHIVES
  quiet_cmd_link_multi-y = AR      $@
554
  cmd_link_multi-y = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(link_multi_deps)
555
556
557
558
else
  quiet_cmd_link_multi-y = LD      $@
  cmd_link_multi-y = $(cmd_link_multi-link)
endif
Linus Torvalds's avatar
Linus Torvalds committed
559
560

quiet_cmd_link_multi-m = LD [M]  $@
561
cmd_link_multi-m = $(cmd_link_multi-link)
Linus Torvalds's avatar
Linus Torvalds committed
562

563
$(multi-used-y): FORCE
Linus Torvalds's avatar
Linus Torvalds committed
564
	$(call if_changed,link_multi-y)
565
$(call multi_depend, $(multi-used-y), .o, -objs -y)
Linus Torvalds's avatar
Linus Torvalds committed
566

567
$(multi-used-m): FORCE
Linus Torvalds's avatar
Linus Torvalds committed
568
	$(call if_changed,link_multi-m)
569
570
	@{ echo $(@:.o=.ko); echo $(link_multi_deps); \
	   $(cmd_undef_syms); } > $(MODVERDIR)/$(@F:.o=.mod)
571
$(call multi_depend, $(multi-used-m), .o, -objs -y -m)
Linus Torvalds's avatar
Linus Torvalds committed
572
573

targets += $(multi-used-y) $(multi-used-m)
574
targets := $(filter-out $(PHONY), $(targets))
Linus Torvalds's avatar
Linus Torvalds committed
575
576
577
578

# Descending
# ---------------------------------------------------------------------------

579
PHONY += $(subdir-ym)
Linus Torvalds's avatar
Linus Torvalds committed
580
$(subdir-ym):
581
	$(Q)$(MAKE) $(build)=$@ need-builtin=$(if $(findstring $@,$(subdir-obj-y)),1)
Linus Torvalds's avatar
Linus Torvalds committed
582
583
584
585

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

586
PHONY += FORCE
Linus Torvalds's avatar
Linus Torvalds committed
587
588
589
590
591
592
593
594

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.

595
cmd_files := $(wildcard $(foreach f,$(sort $(targets)),$(dir $(f)).$(notdir $(f)).cmd))
Linus Torvalds's avatar
Linus Torvalds committed
596
597
598
599

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

601
602
603
ifneq ($(KBUILD_SRC),)
# Create directories for object files if they do not exist
obj-dirs := $(sort $(obj) $(patsubst %/,%, $(dir $(targets))))
604
605
606
607
# 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),)
608
609
$(shell mkdir -p $(obj-dirs))
endif
610
endif
611

612
613
614
615
# Declare the contents of the .PHONY variable as phony.  We keep that
# information in a variable se we can use it in if_changed and friends.

.PHONY: $(PHONY)