Makefile.build 9.18 KB
Newer Older
Kai Germaschewski's avatar
Kai Germaschewski committed
1 2 3 4
# ==========================================================================
# Building
# ==========================================================================

5 6 7 8 9
src := $(obj)

.PHONY: __build
__build:

10 11
# Read .config if it exist, otherwise ignore
-include .config
12 13 14

include $(obj)/Makefile

Sam Ravnborg's avatar
Sam Ravnborg committed
15
include scripts/Makefile.lib
16

17
ifdef host-progs
18 19 20 21 22 23
$(warning kbuild: $(obj)/Makefile - Usage of host-progs is deprecated. Please replace with hostprogs-y!)
hostprogs-y += $(host-progs)
endif

# Do not include host rules unles needed
ifneq ($(hostprogs-y)$(hostprogs-m),)
24 25 26
include scripts/Makefile.host
endif

27 28 29 30 31 32 33 34 35 36
ifneq ($(KBUILD_SRC),)
# Create output directory if not already present
_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))

# Create directories for object files if directory does not exist
# Needed when obj-y := dir/file.o syntax is used
_dummy := $(foreach d,$(obj-dirs), $(shell [ -d $(d) ] || mkdir -p $(d)))
endif


37
ifdef EXTRA_TARGETS
38
$(warning kbuild: $(obj)/Makefile - Usage of EXTRA_TARGETS is obsolete in 2.6. Please fix!)
39 40
endif

41
ifdef build-targets
42
$(warning kbuild: $(obj)/Makefile - Usage of build-targets is obsolete in 2.6. Please fix!)
43 44
endif

45
ifdef export-objs
46
$(warning kbuild: $(obj)/Makefile - Usage of export-objs is obsolete in 2.6. Please fix!)
47 48
endif

49
ifdef O_TARGET
50
$(warning kbuild: $(obj)/Makefile - Usage of O_TARGET := $(O_TARGET) is obsolete in 2.6. Please fix!)
51 52 53
endif

ifdef L_TARGET
54
$(error kbuild: $(obj)/Makefile - Use of L_TARGET is replaced by lib-y in 2.6. Please fix!)
55 56 57
endif

ifdef list-multi
58
$(warning kbuild: $(obj)/Makefile - list-multi := $(list-multi) is obsolete in 2.6. Please fix!)
59 60 61
endif

ifndef obj
62
$(warning kbuild: Makefile.build is included improperly)
63 64 65 66
endif

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

67 68
ifneq ($(strip $(lib-y) $(lib-m) $(lib-n) $(lib-)),)
lib-target := $(obj)/lib.a
Kai Germaschewski's avatar
Kai Germaschewski committed
69
endif
70 71 72

ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(lib-target)),)
builtin-target := $(obj)/built-in.o
73
endif
Kai Germaschewski's avatar
Kai Germaschewski committed
74

75 76
# We keep a list of all modules in $(MODVERDIR)

77
__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
78
	 $(if $(KBUILD_MODULES),$(obj-m)) \
79
	 $(subdir-ym) $(always)
Kai Germaschewski's avatar
Kai Germaschewski committed
80 81
	@:

82
# Linus' kernel sanity checking tool
83 84
ifneq ($(KBUILD_CHECKSRC),0)
quiet_cmd_checksrc = CHECK   $<
85
      cmd_checksrc = $(CHECK) $(c_flags) $< ;
86
endif
87 88


Kai Germaschewski's avatar
Kai Germaschewski committed
89 90 91 92 93
# Compile C sources (.c)
# ---------------------------------------------------------------------------

# Default is built-in, unless we know otherwise
modkern_cflags := $(CFLAGS_KERNEL)
94
quiet_modtag := $(empty)   $(empty)
Kai Germaschewski's avatar
Kai Germaschewski committed
95 96 97

$(real-objs-m)        : modkern_cflags := $(CFLAGS_MODULE)
$(real-objs-m:.o=.i)  : modkern_cflags := $(CFLAGS_MODULE)
98
$(real-objs-m:.o=.s)  : modkern_cflags := $(CFLAGS_MODULE)
Kai Germaschewski's avatar
Kai Germaschewski committed
99 100
$(real-objs-m:.o=.lst): modkern_cflags := $(CFLAGS_MODULE)

101 102 103 104 105 106 107
$(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]

108 109 110 111 112 113 114 115 116 117 118
# Default for not multi-part modules
modname = $(*F)

$(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)
Kai Germaschewski's avatar
Kai Germaschewski committed
119

120
quiet_cmd_cc_s_c = CC $(quiet_modtag)  $@
Kai Germaschewski's avatar
Kai Germaschewski committed
121 122 123 124 125
cmd_cc_s_c       = $(CC) $(c_flags) -S -o $@ $< 

%.s: %.c FORCE
	$(call if_changed_dep,cc_s_c)

126
quiet_cmd_cc_i_c = CPP $(quiet_modtag) $@
Kai Germaschewski's avatar
Kai Germaschewski committed
127 128 129 130 131
cmd_cc_i_c       = $(CPP) $(c_flags)   -o $@ $<

%.i: %.c FORCE
	$(call if_changed_dep,cc_i_c)

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)

136
quiet_cmd_cc_o_c = CC $(quiet_modtag)  $@
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168

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

else
# When module versioning is enabled the following steps are executed:
# 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
#   are done.
# o otherwise, we calculate symbol versions using the good old
#   genksyms on the preprocessed source and postprocess them in a way
#   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

cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
cmd_modversions =							\
	if ! $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then	\
		mv $(@D)/.tmp_$(@F) $@;					\
	else								\
		$(CPP) -D__GENKSYMS__ $(c_flags) $<			\
		| $(GENKSYMS)						\
		> $(@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);	\
	fi;
endif

169
define rule_cc_o_c
170 171 172 173 174
	$(if $($(quiet)cmd_checksrc),echo '  $($(quiet)cmd_checksrc)';)   \
	$(cmd_checksrc)							  \
	$(if $($(quiet)cmd_cc_o_c),echo '  $($(quiet)cmd_cc_o_c)';)	  \
	$(cmd_cc_o_c);							  \
	$(cmd_modversions)						  \
175
	scripts/basic/fixdep $(depfile) $@ '$(cmd_cc_o_c)' > $(@D)/.$(@F).tmp;  \
176
	rm -f $(depfile);						  \
177 178
	mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd
endef
Kai Germaschewski's avatar
Kai Germaschewski committed
179

180 181
# Built-in and composite module parts

Kai Germaschewski's avatar
Kai Germaschewski committed
182
%.o: %.c FORCE
183
	$(call if_changed_rule,cc_o_c)
Kai Germaschewski's avatar
Kai Germaschewski committed
184

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

$(single-used-m): %.o: %.c FORCE
188
	$(call if_changed_rule,cc_o_c)
189
	@{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
190

191
quiet_cmd_cc_lst_c = MKLST   $@
192
      cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
193
		     $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
194
				     System.map $(OBJDUMP) > $@
Kai Germaschewski's avatar
Kai Germaschewski committed
195 196 197 198 199 200 201 202 203 204 205 206

%.lst: %.c FORCE
	$(call if_changed_dep,cc_lst_c)

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

modkern_aflags := $(AFLAGS_KERNEL)

$(real-objs-m)      : modkern_aflags := $(AFLAGS_MODULE)
$(real-objs-m:.o=.s): modkern_aflags := $(AFLAGS_MODULE)

207
quiet_cmd_as_s_S = CPP $(quiet_modtag) $@
Kai Germaschewski's avatar
Kai Germaschewski committed
208 209 210 211 212
cmd_as_s_S       = $(CPP) $(a_flags)   -o $@ $< 

%.s: %.S FORCE
	$(call if_changed_dep,as_s_S)

213
quiet_cmd_as_o_S = AS $(quiet_modtag)  $@
Kai Germaschewski's avatar
Kai Germaschewski committed
214 215 216 217 218
cmd_as_o_S       = $(CC) $(a_flags) -c -o $@ $<

%.o: %.S FORCE
	$(call if_changed_dep,as_o_S)

219 220
targets += $(real-objs-y) $(real-objs-m) $(lib-y)
targets += $(extra-y) $(MAKECMDGOALS) $(always)
Kai Germaschewski's avatar
Kai Germaschewski committed
221 222 223 224 225 226 227 228 229 230

# 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
#
231
ifdef builtin-target
232
quiet_cmd_link_o_target = LD      $@
233
# If the list of objects to link is empty, just create an empty built-in.o
Kai Germaschewski's avatar
Kai Germaschewski committed
234
cmd_link_o_target = $(if $(strip $(obj-y)),\
235
		      $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^),\
Kai Germaschewski's avatar
Kai Germaschewski committed
236 237
		      rm -f $@; $(AR) rcs $@)

238
$(builtin-target): $(obj-y) FORCE
Kai Germaschewski's avatar
Kai Germaschewski committed
239 240
	$(call if_changed,link_o_target)

241 242
targets += $(builtin-target)
endif # builtin-target
Kai Germaschewski's avatar
Kai Germaschewski committed
243 244 245 246

#
# Rule to compile a set of .o files into one .a file
#
247
ifdef lib-target
248
quiet_cmd_link_l_target = AR      $@
249
cmd_link_l_target = rm -f $@; $(AR) $(EXTRA_ARFLAGS) rcs $@ $(lib-y)
Kai Germaschewski's avatar
Kai Germaschewski committed
250

251
$(lib-target): $(lib-y) FORCE
Kai Germaschewski's avatar
Kai Germaschewski committed
252 253
	$(call if_changed,link_l_target)

254
targets += $(lib-target)
Kai Germaschewski's avatar
Kai Germaschewski committed
255 256 257 258 259
endif

#
# Rule to link composite objects
#
260 261 262 263 264 265 266 267 268
#  Composite objects are specified in kbuild makefile as follows:
#    <composite-object>-objs := <list of .o files>
#  or
#    <composite-object>-y    := <list of .o files>
link_multi_deps =                     \
$(filter $(addprefix $(obj)/,         \
$($(subst $(obj)/,,$(@:.o=-objs)))    \
$($(subst $(obj)/,,$(@:.o=-y)))), $^)
 
269
quiet_cmd_link_multi-y = LD      $@
270
cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps)
Kai Germaschewski's avatar
Kai Germaschewski committed
271

272
quiet_cmd_link_multi-m = LD [M]  $@
273
cmd_link_multi-m = $(LD) $(ld_flags) $(LDFLAGS_MODULE) -o $@ $(link_multi_deps)
Kai Germaschewski's avatar
Kai Germaschewski committed
274 275 276 277 278 279

# We would rather have a list of rules like
# 	foo.o: $(foo-objs)
# but that's not so easy, so we rather make all composite objects depend
# on the set of all their parts
$(multi-used-y) : %.o: $(multi-objs-y) FORCE
280 281
	$(call if_changed,link_multi-y)

282
$(multi-used-m) : %.o: $(multi-objs-m) FORCE
283
	$(call if_changed,link_multi-m)
284
	@{ echo $(@:.o=.ko); echo $(link_multi_deps); } > $(MODVERDIR)/$(@F:.o=.mod)
Kai Germaschewski's avatar
Kai Germaschewski committed
285

286 287
targets += $(multi-used-y) $(multi-used-m)

Kai Germaschewski's avatar
Kai Germaschewski committed
288

289 290 291 292 293
# Descending
# ---------------------------------------------------------------------------

.PHONY: $(subdir-ym)
$(subdir-ym):
294
	$(Q)$(MAKE) $(build)=$@
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313

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

.PHONY: FORCE

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.

targets := $(wildcard $(sort $(targets)))
cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))

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