blob: 003bc263105ae3fc5a92e671faa8654ac6809fa5 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001# ==========================================================================
2# Building
3# ==========================================================================
4
5src := $(obj)
6
Paul Smith4f193362006-03-05 17:14:10 -05007PHONY := __build
Linus Torvalds1da177e2005-04-16 15:20:36 -07008__build:
9
Sam Ravnborgd72e5ed2007-05-28 22:47:48 +020010# Init all relevant variables used in kbuild files so
11# 1) they have correct type
12# 2) they do not inherit any value from the environment
13obj-y :=
14obj-m :=
15lib-y :=
16lib-m :=
17always :=
18targets :=
19subdir-y :=
20subdir-m :=
21EXTRA_AFLAGS :=
22EXTRA_CFLAGS :=
23EXTRA_CPPFLAGS :=
24EXTRA_LDFLAGS :=
Sam Ravnborgf77bf012007-10-15 22:25:06 +020025asflags-y :=
26ccflags-y :=
27cppflags-y :=
28ldflags-y :=
Sam Ravnborgd72e5ed2007-05-28 22:47:48 +020029
Sam Ravnborg720097d2009-04-19 11:04:26 +020030subdir-asflags-y :=
31subdir-ccflags-y :=
32
Robert P. J. Day3156fd02008-02-18 04:48:20 -050033# Read auto.conf if it exists, otherwise ignore
Roman Zippelc955cca2006-06-08 22:12:39 -070034-include include/config/auto.conf
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
Sam Ravnborg20a468b2006-01-22 13:34:15 +010036include scripts/Kbuild.include
37
Robert P. J. Day3156fd02008-02-18 04:48:20 -050038# For backward compatibility check that these variables do not change
Sam Ravnborg0c53c8e2007-10-14 22:26:53 +020039save-cflags := $(CFLAGS)
40
Sam Ravnborg2a691472005-07-25 20:26:04 +000041# The filename Kbuild has precedence over Makefile
Sam Ravnborgdb8c1a72005-07-27 22:11:01 +020042kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
Sam Ravnborg0c53c8e2007-10-14 22:26:53 +020043kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
44include $(kbuild-file)
Linus Torvalds1da177e2005-04-16 15:20:36 -070045
Sam Ravnborg0c53c8e2007-10-14 22:26:53 +020046# If the save-* variables changed error out
47ifeq ($(KBUILD_NOPEDANTIC),)
48 ifneq ("$(save-cflags)","$(CFLAGS)")
Arnaud Lacombe49c57d22011-08-15 01:07:13 -040049 $(error CFLAGS was changed in "$(kbuild-file)". Fix it to use ccflags-y)
Sam Ravnborg0c53c8e2007-10-14 22:26:53 +020050 endif
51endif
Borislav Petkov4a5838a2011-03-01 09:35:29 +010052
53#
Sam Ravnborg28bc20d2011-04-27 22:15:27 +020054# make W=... settings
Borislav Petkov4a5838a2011-03-01 09:35:29 +010055#
Sam Ravnborg28bc20d2011-04-27 22:15:27 +020056# W=1 - warnings that may be relevant and does not occur too often
57# W=2 - warnings that occur quite often but may still be relevant
58# W=3 - the more obscure warnings, can most likely be ignored
59#
60# $(call cc-option, -W...) handles gcc -W.. options which
Borislav Petkov4a5838a2011-03-01 09:35:29 +010061# are not supported by all versions of the compiler
62ifdef KBUILD_ENABLE_EXTRA_GCC_CHECKS
Michal Mareka6de5532011-04-29 14:45:31 +020063warning- := $(empty)
64
Sam Ravnborg28bc20d2011-04-27 22:15:27 +020065warning-1 := -Wextra -Wunused -Wno-unused-parameter
66warning-1 += -Wmissing-declarations
67warning-1 += -Wmissing-format-attribute
Jan-Simon Möller3d3d6b82012-11-14 10:39:57 +010068warning-1 += $(call cc-option, -Wmissing-prototypes)
Sam Ravnborg28bc20d2011-04-27 22:15:27 +020069warning-1 += -Wold-style-definition
70warning-1 += $(call cc-option, -Wmissing-include-dirs)
Dave Jonesaf0e5d52011-04-21 17:28:13 -040071warning-1 += $(call cc-option, -Wunused-but-set-variable)
Kirill A. Shutemovf858ee82012-01-24 05:10:14 +020072warning-1 += $(call cc-disable-warning, missing-field-initializers)
Sam Ravnborg28bc20d2011-04-27 22:15:27 +020073
Jan-Simon Möller3d3d6b82012-11-14 10:39:57 +010074# Clang
75warning-1 += $(call cc-disable-warning, initializer-overrides)
76warning-1 += $(call cc-disable-warning, unused-value)
77warning-1 += $(call cc-disable-warning, format)
78warning-1 += $(call cc-disable-warning, unknown-warning-option)
79warning-1 += $(call cc-disable-warning, sign-compare)
80warning-1 += $(call cc-disable-warning, format-zero-length)
81warning-1 += $(call cc-disable-warning, uninitialized)
82warning-1 += $(call cc-option, -fcatch-undefined-behavior)
83
Sam Ravnborg28bc20d2011-04-27 22:15:27 +020084warning-2 := -Waggregate-return
85warning-2 += -Wcast-align
86warning-2 += -Wdisabled-optimization
87warning-2 += -Wnested-externs
88warning-2 += -Wshadow
89warning-2 += $(call cc-option, -Wlogical-op)
Kirill A. Shutemovf858ee82012-01-24 05:10:14 +020090warning-2 += $(call cc-option, -Wmissing-field-initializers)
Sam Ravnborg28bc20d2011-04-27 22:15:27 +020091
92warning-3 := -Wbad-function-cast
93warning-3 += -Wcast-qual
94warning-3 += -Wconversion
95warning-3 += -Wpacked
96warning-3 += -Wpadded
97warning-3 += -Wpointer-arith
98warning-3 += -Wredundant-decls
99warning-3 += -Wswitch-default
100warning-3 += $(call cc-option, -Wpacked-bitfield-compat)
101warning-3 += $(call cc-option, -Wvla)
102
Michal Mareka6de5532011-04-29 14:45:31 +0200103warning := $(warning-$(findstring 1, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)))
104warning += $(warning-$(findstring 2, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)))
105warning += $(warning-$(findstring 3, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)))
Sam Ravnborg28bc20d2011-04-27 22:15:27 +0200106
Michal Mareka6de5532011-04-29 14:45:31 +0200107ifeq ("$(strip $(warning))","")
Sam Ravnborg28bc20d2011-04-27 22:15:27 +0200108 $(error W=$(KBUILD_ENABLE_EXTRA_GCC_CHECKS) is unknown)
109endif
110
111KBUILD_CFLAGS += $(warning)
Borislav Petkov4a5838a2011-03-01 09:35:29 +0100112endif
113
Linus Torvalds1da177e2005-04-16 15:20:36 -0700114include scripts/Makefile.lib
115
116ifdef host-progs
117ifneq ($(hostprogs-y),$(host-progs))
118$(warning kbuild: $(obj)/Makefile - Usage of host-progs is deprecated. Please replace with hostprogs-y!)
119hostprogs-y += $(host-progs)
120endif
121endif
122
Robert P. J. Day3156fd02008-02-18 04:48:20 -0500123# Do not include host rules unless needed
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124ifneq ($(hostprogs-y)$(hostprogs-m),)
125include scripts/Makefile.host
126endif
127
128ifneq ($(KBUILD_SRC),)
129# Create output directory if not already present
130_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
131
132# Create directories for object files if directory does not exist
133# Needed when obj-y := dir/file.o syntax is used
134_dummy := $(foreach d,$(obj-dirs), $(shell [ -d $(d) ] || mkdir -p $(d)))
135endif
136
Linus Torvalds1da177e2005-04-16 15:20:36 -0700137ifndef obj
138$(warning kbuild: Makefile.build is included improperly)
139endif
140
141# ===========================================================================
142
143ifneq ($(strip $(lib-y) $(lib-m) $(lib-n) $(lib-)),)
144lib-target := $(obj)/lib.a
145endif
146
Jiafu He4b024242009-12-17 18:22:13 -0700147ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(subdir-m) $(lib-target)),)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148builtin-target := $(obj)/built-in.o
149endif
150
Tejun Heo551559e2007-12-07 21:04:30 +0900151modorder-target := $(obj)/modules.order
152
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153# We keep a list of all modules in $(MODVERDIR)
154
155__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
Tejun Heo551559e2007-12-07 21:04:30 +0900156 $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700157 $(subdir-ym) $(always)
158 @:
159
160# Linus' kernel sanity checking tool
161ifneq ($(KBUILD_CHECKSRC),0)
162 ifeq ($(KBUILD_CHECKSRC),2)
163 quiet_cmd_force_checksrc = CHECK $<
164 cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ;
165 else
166 quiet_cmd_checksrc = CHECK $<
167 cmd_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ;
168 endif
169endif
170
Sam Ravnborg91341d42008-01-21 21:31:44 +0100171# Do section mismatch analysis for each module/built-in.o
172ifdef CONFIG_DEBUG_SECTION_MISMATCH
173 cmd_secanalysis = ; scripts/mod/modpost $@
174endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175
176# Compile C sources (.c)
177# ---------------------------------------------------------------------------
178
179# Default is built-in, unless we know otherwise
Sam Ravnborg65881692010-07-28 17:33:09 +0200180modkern_cflags = \
181 $(if $(part-of-module), \
182 $(KBUILD_CFLAGS_MODULE) $(CFLAGS_MODULE), \
Sam Ravnborg80c00ba2010-07-28 19:11:27 +0200183 $(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700184quiet_modtag := $(empty) $(empty)
185
Shaohua Li18c167f2009-01-12 10:00:51 +0800186$(real-objs-m) : part-of-module := y
187$(real-objs-m:.o=.i) : part-of-module := y
188$(real-objs-m:.o=.s) : part-of-module := y
189$(real-objs-m:.o=.lst): part-of-module := y
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190
191$(real-objs-m) : quiet_modtag := [M]
192$(real-objs-m:.o=.i) : quiet_modtag := [M]
193$(real-objs-m:.o=.s) : quiet_modtag := [M]
194$(real-objs-m:.o=.lst): quiet_modtag := [M]
195
196$(obj-m) : quiet_modtag := [M]
197
198# Default for not multi-part modules
Sam Ravnborg5e8d7802006-07-01 09:58:02 +0200199modname = $(basetarget)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200
201$(multi-objs-m) : modname = $(modname-multi)
202$(multi-objs-m:.o=.i) : modname = $(modname-multi)
203$(multi-objs-m:.o=.s) : modname = $(modname-multi)
204$(multi-objs-m:.o=.lst) : modname = $(modname-multi)
205$(multi-objs-y) : modname = $(modname-multi)
206$(multi-objs-y:.o=.i) : modname = $(modname-multi)
207$(multi-objs-y:.o=.s) : modname = $(modname-multi)
208$(multi-objs-y:.o=.lst) : modname = $(modname-multi)
209
210quiet_cmd_cc_s_c = CC $(quiet_modtag) $@
Andi Kleen1e64ff42014-02-08 09:01:15 +0100211cmd_cc_s_c = $(CC) $(c_flags) $(DISABLE_LTO) -fverbose-asm -S -o $@ $<
Linus Torvalds1da177e2005-04-16 15:20:36 -0700212
Sam Ravnborg767e5812007-05-06 09:23:45 +0200213$(obj)/%.s: $(src)/%.c FORCE
Linus Torvalds1da177e2005-04-16 15:20:36 -0700214 $(call if_changed_dep,cc_s_c)
215
216quiet_cmd_cc_i_c = CPP $(quiet_modtag) $@
217cmd_cc_i_c = $(CPP) $(c_flags) -o $@ $<
218
Sam Ravnborg767e5812007-05-06 09:23:45 +0200219$(obj)/%.i: $(src)/%.c FORCE
Linus Torvalds1da177e2005-04-16 15:20:36 -0700220 $(call if_changed_dep,cc_i_c)
221
Sam Ravnborg2ea03892009-01-14 21:38:20 +0100222cmd_gensymtypes = \
Sam Ravnborg37a8d9f2008-12-19 21:38:09 +0100223 $(CPP) -D__GENKSYMS__ $(c_flags) $< | \
James Hogand70f82a2013-03-18 19:38:56 +1030224 $(GENKSYMS) $(if $(1), -T $(2)) \
225 $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \
Sam Ravnborg37a8d9f2008-12-19 21:38:09 +0100226 $(if $(KBUILD_PRESERVE),-p) \
Don Zickuse26d6b82010-05-24 17:07:24 -0400227 -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
Sam Ravnborg37a8d9f2008-12-19 21:38:09 +0100228
Andreas Gruenbacher15fde672006-05-09 20:37:30 +0200229quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
Sam Ravnborg37a8d9f2008-12-19 21:38:09 +0100230cmd_cc_symtypes_c = \
231 set -e; \
Don Zickuse26d6b82010-05-24 17:07:24 -0400232 $(call cmd_gensymtypes,true,$@) >/dev/null; \
Sam Ravnborg37a8d9f2008-12-19 21:38:09 +0100233 test -s $@ || rm -f $@
Andreas Gruenbacher15fde672006-05-09 20:37:30 +0200234
Sam Ravnborg767e5812007-05-06 09:23:45 +0200235$(obj)/%.symtypes : $(src)/%.c FORCE
Andreas Gruenbacher64e6c1e2008-12-01 14:21:01 -0800236 $(call cmd,cc_symtypes_c)
Andreas Gruenbacher15fde672006-05-09 20:37:30 +0200237
Linus Torvalds1da177e2005-04-16 15:20:36 -0700238# C (.c) files
239# The C file is compiled and updated dependency information is generated.
240# (See cmd_cc_o_c + relevant part of rule_cc_o_c)
241
242quiet_cmd_cc_o_c = CC $(quiet_modtag) $@
243
244ifndef CONFIG_MODVERSIONS
245cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
246
247else
248# When module versioning is enabled the following steps are executed:
Sam Ravnborg2ea03892009-01-14 21:38:20 +0100249# o compile a .tmp_<file>.o from <file>.c
250# o if .tmp_<file>.o doesn't contain a __ksymtab version, i.e. does
251# not export symbols, we just rename .tmp_<file>.o to <file>.o and
Linus Torvalds1da177e2005-04-16 15:20:36 -0700252# are done.
253# o otherwise, we calculate symbol versions using the good old
254# genksyms on the preprocessed source and postprocess them in a way
Sam Ravnborg2ea03892009-01-14 21:38:20 +0100255# that they are usable as a linker script
256# o generate <file>.o from .tmp_<file>.o using the linker to
257# replace the unresolved symbols __crc_exported_symbol with
258# the actual value of the checksum generated by genksyms
Linus Torvalds1da177e2005-04-16 15:20:36 -0700259
Sam Ravnborg2ea03892009-01-14 21:38:20 +0100260cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
Don Zickuse26d6b82010-05-24 17:07:24 -0400261cmd_modversions = \
262 if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \
263 $(call cmd_gensymtypes,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
264 > $(@D)/.tmp_$(@F:.o=.ver); \
265 \
266 $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \
267 -T $(@D)/.tmp_$(@F:.o=.ver); \
268 rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \
269 else \
270 mv -f $(@D)/.tmp_$(@F) $@; \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271 fi;
272endif
273
Steven Rostedt8da38212008-08-14 15:45:07 -0400274ifdef CONFIG_FTRACE_MCOUNT_RECORD
Steven Rostedt72441cb2010-10-13 17:12:30 -0400275ifdef BUILD_C_RECORDMCOUNT
Steven Rostedt85356f82011-04-12 18:59:10 -0400276ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
277 RECORDMCOUNT_FLAGS = -w
278endif
Steven Rostedtd7b4d6d2010-10-18 14:42:00 -0400279# Due to recursion, we must skip empty.o.
280# The empty.o file is created in the make process in order to determine
281# the target endianness and word size. It is made before all other C
282# files, including recordmcount.
Wu Zhangjin45677452010-10-28 00:24:34 +0800283sub_cmd_record_mcount = \
284 if [ $(@) != "scripts/mod/empty.o" ]; then \
Steven Rostedt85356f82011-04-12 18:59:10 -0400285 $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)"; \
Wu Zhangjin45677452010-10-28 00:24:34 +0800286 fi;
Michal Marekd6971822011-05-17 15:36:46 +0200287recordmcount_source := $(srctree)/scripts/recordmcount.c \
288 $(srctree)/scripts/recordmcount.h
Steven Rostedt72441cb2010-10-13 17:12:30 -0400289else
Wu Zhangjin45677452010-10-28 00:24:34 +0800290sub_cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \
Wu Zhangjine6299d22009-11-20 20:34:31 +0800291 "$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \
Steven Rostedtb3acf292008-10-29 15:30:26 -0400292 "$(if $(CONFIG_64BIT),64,32)" \
Rabin Vincentf9810a82010-08-10 19:39:20 +0100293 "$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CFLAGS)" \
294 "$(LD)" "$(NM)" "$(RM)" "$(MV)" \
Shaohua Li18c167f2009-01-12 10:00:51 +0800295 "$(if $(part-of-module),1,0)" "$(@)";
Michal Marekd6971822011-05-17 15:36:46 +0200296recordmcount_source := $(srctree)/scripts/recordmcount.pl
Steven Rostedt8da38212008-08-14 15:45:07 -0400297endif
Wu Zhangjin45677452010-10-28 00:24:34 +0800298cmd_record_mcount = \
299 if [ "$(findstring -pg,$(_c_flags))" = "-pg" ]; then \
300 $(sub_cmd_record_mcount) \
301 fi;
Steven Rostedt72441cb2010-10-13 17:12:30 -0400302endif
Steven Rostedt8da38212008-08-14 15:45:07 -0400303
Linus Torvalds1da177e2005-04-16 15:20:36 -0700304define rule_cc_o_c
Jan Beulich6176aa92006-01-30 10:04:27 +0100305 $(call echo-cmd,checksrc) $(cmd_checksrc) \
306 $(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700307 $(cmd_modversions) \
Andi Kleenc3c63b62009-09-18 12:49:36 -0700308 $(call echo-cmd,record_mcount) \
Steven Rostedt8da38212008-08-14 15:45:07 -0400309 $(cmd_record_mcount) \
Sam Ravnborg48f1f052006-07-23 19:37:44 +0200310 scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \
311 $(dot-target).tmp; \
Sam Ravnborg2ea03892009-01-14 21:38:20 +0100312 rm -f $(depfile); \
Sam Ravnborg48f1f052006-07-23 19:37:44 +0200313 mv -f $(dot-target).tmp $(dot-target).cmd
Linus Torvalds1da177e2005-04-16 15:20:36 -0700314endef
315
316# Built-in and composite module parts
Michal Marekd6971822011-05-17 15:36:46 +0200317$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
Linus Torvalds1da177e2005-04-16 15:20:36 -0700318 $(call cmd,force_checksrc)
319 $(call if_changed_rule,cc_o_c)
320
321# Single-part modules are special since we need to mark them in $(MODVERDIR)
322
Michal Marekd6971822011-05-17 15:36:46 +0200323$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
Linus Torvalds1da177e2005-04-16 15:20:36 -0700324 $(call cmd,force_checksrc)
325 $(call if_changed_rule,cc_o_c)
326 @{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
327
328quiet_cmd_cc_lst_c = MKLST $@
329 cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
330 $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
331 System.map $(OBJDUMP) > $@
332
Sam Ravnborg767e5812007-05-06 09:23:45 +0200333$(obj)/%.lst: $(src)/%.c FORCE
Linus Torvalds1da177e2005-04-16 15:20:36 -0700334 $(call if_changed_dep,cc_lst_c)
335
336# Compile assembler sources (.S)
337# ---------------------------------------------------------------------------
338
Sam Ravnborg80c00ba2010-07-28 19:11:27 +0200339modkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340
Sam Ravnborg65881692010-07-28 17:33:09 +0200341$(real-objs-m) : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
342$(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343
344quiet_cmd_as_s_S = CPP $(quiet_modtag) $@
345cmd_as_s_S = $(CPP) $(a_flags) -o $@ $<
346
Sam Ravnborg767e5812007-05-06 09:23:45 +0200347$(obj)/%.s: $(src)/%.S FORCE
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348 $(call if_changed_dep,as_s_S)
349
350quiet_cmd_as_o_S = AS $(quiet_modtag) $@
351cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
352
Sam Ravnborg767e5812007-05-06 09:23:45 +0200353$(obj)/%.o: $(src)/%.S FORCE
Linus Torvalds1da177e2005-04-16 15:20:36 -0700354 $(call if_changed_dep,as_o_S)
355
356targets += $(real-objs-y) $(real-objs-m) $(lib-y)
357targets += $(extra-y) $(MAKECMDGOALS) $(always)
358
359# Linker scripts preprocessor (.lds.S -> .lds)
360# ---------------------------------------------------------------------------
361quiet_cmd_cpp_lds_S = LDS $@
Sam Ravnborg51b563f2009-09-20 12:28:22 +0200362 cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \
Tim Abbott42f29a22009-09-20 18:14:12 -0400363 -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364
Sam Ravnborg767e5812007-05-06 09:23:45 +0200365$(obj)/%.lds: $(src)/%.lds.S FORCE
Linus Torvalds1da177e2005-04-16 15:20:36 -0700366 $(call if_changed_dep,cpp_lds_S)
367
David Howells4520c6a2012-09-21 23:31:13 +0100368# ASN.1 grammar
369# ---------------------------------------------------------------------------
370quiet_cmd_asn1_compiler = ASN.1 $@
371 cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \
372 $(subst .h,.c,$@) $(subst .c,.h,$@)
373
374.PRECIOUS: $(objtree)/$(obj)/%-asn1.c $(objtree)/$(obj)/%-asn1.h
375
376$(obj)/%-asn1.c $(obj)/%-asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
377 $(call cmd,asn1_compiler)
378
Linus Torvalds1da177e2005-04-16 15:20:36 -0700379# Build the compiled-in targets
380# ---------------------------------------------------------------------------
381
382# To build objects in subdirs, we need to descend into the directories
383$(sort $(subdir-obj-y)): $(subdir-ym) ;
384
385#
386# Rule to compile a set of .o files into one .o file
387#
388ifdef builtin-target
389quiet_cmd_link_o_target = LD $@
390# If the list of objects to link is empty, just create an empty built-in.o
391cmd_link_o_target = $(if $(strip $(obj-y)),\
Sam Ravnborg91341d42008-01-21 21:31:44 +0100392 $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \
393 $(cmd_secanalysis),\
Michal Marek40df7592011-04-20 13:45:30 +0200394 rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395
396$(builtin-target): $(obj-y) FORCE
397 $(call if_changed,link_o_target)
398
399targets += $(builtin-target)
400endif # builtin-target
401
402#
Tejun Heo551559e2007-12-07 21:04:30 +0900403# Rule to create modules.order file
404#
405# Create commands to either record .ko file or cat modules.order from
406# a subdirectory
407modorder-cmds = \
408 $(foreach m, $(modorder), \
409 $(if $(filter %/modules.order, $m), \
410 cat $m;, echo kernel/$m;))
411
412$(modorder-target): $(subdir-ym) FORCE
413 $(Q)(cat /dev/null; $(modorder-cmds)) > $@
414
415#
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416# Rule to compile a set of .o files into one .a file
417#
418ifdef lib-target
419quiet_cmd_link_l_target = AR $@
Michal Marek40df7592011-04-20 13:45:30 +0200420cmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(lib-y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421
422$(lib-target): $(lib-y) FORCE
423 $(call if_changed,link_l_target)
424
425targets += $(lib-target)
426endif
427
428#
429# Rule to link composite objects
430#
431# Composite objects are specified in kbuild makefile as follows:
432# <composite-object>-objs := <list of .o files>
433# or
434# <composite-object>-y := <list of .o files>
435link_multi_deps = \
436$(filter $(addprefix $(obj)/, \
437$($(subst $(obj)/,,$(@:.o=-objs))) \
438$($(subst $(obj)/,,$(@:.o=-y)))), $^)
439
440quiet_cmd_link_multi-y = LD $@
Sam Ravnborg91341d42008-01-21 21:31:44 +0100441cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442
443quiet_cmd_link_multi-m = LD [M] $@
Roland McGrath114f5152007-07-23 01:12:08 -0700444cmd_link_multi-m = $(cmd_link_multi-y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700445
446# We would rather have a list of rules like
447# foo.o: $(foo-objs)
448# but that's not so easy, so we rather make all composite objects depend
449# on the set of all their parts
450$(multi-used-y) : %.o: $(multi-objs-y) FORCE
451 $(call if_changed,link_multi-y)
452
453$(multi-used-m) : %.o: $(multi-objs-m) FORCE
454 $(call if_changed,link_multi-m)
455 @{ echo $(@:.o=.ko); echo $(link_multi_deps); } > $(MODVERDIR)/$(@F:.o=.mod)
456
457targets += $(multi-used-y) $(multi-used-m)
458
459
460# Descending
461# ---------------------------------------------------------------------------
462
Paul Smith4f193362006-03-05 17:14:10 -0500463PHONY += $(subdir-ym)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464$(subdir-ym):
465 $(Q)$(MAKE) $(build)=$@
466
467# Add FORCE to the prequisites of a target to force it to be always rebuilt.
468# ---------------------------------------------------------------------------
469
Paul Smith4f193362006-03-05 17:14:10 -0500470PHONY += FORCE
Linus Torvalds1da177e2005-04-16 15:20:36 -0700471
472FORCE:
473
474# Read all saved command lines and dependencies for the $(targets) we
475# may be building above, using $(if_changed{,_dep}). As an
476# optimization, we don't need to read them if the target does not
477# exist, we will rebuild anyway in that case.
478
479targets := $(wildcard $(sort $(targets)))
480cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
481
482ifneq ($(cmd_files),)
483 include $(cmd_files)
484endif
Paul Smith4f193362006-03-05 17:14:10 -0500485
Paul Smith4f193362006-03-05 17:14:10 -0500486# Declare the contents of the .PHONY variable as phony. We keep that
487# information in a variable se we can use it in if_changed and friends.
488
489.PHONY: $(PHONY)