source: trunk/kBuild/footer.kmk@ 1097

Last change on this file since 1097 was 1061, checked in by bird, 18 years ago

drop deleting before installing. kmk_install will unlink before installing while kmk will take care of cleaining up on failure. The delayed expansion screws up multi command INSTALLER expressions.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 97.0 KB
Line 
1# $Id: footer.kmk 1061 2007-06-19 00:01:14Z bird $
2## @file
3#
4# kBuild - File included at top of makefile.
5#
6# Copyright (c) 2004-2007 knut st. osmundsen <bird-kBuild-spam@anduin.net>
7#
8#
9# This file is part of kBuild.
10#
11# kBuild is free software; you can redistribute it and/or modify
12# it under the terms of the GNU General Public License as published by
13# the Free Software Foundation; either version source of the License, or
14# (at your option) any later version.
15#
16# kBuild is distributed in the hope that it will be useful,
17# but WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19# GNU General Public License for more details.
20#
21# You should have received a copy of the GNU General Public License
22# along with kBuild; if not, write to the Free Software
23# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24#
25#
26
27ifndef __footer_kmk__
28# start-of-file-content
29ifdef KBUILD_PROFILE_SELF
30 _KBUILD_TS_FOOTER_START := $(nanots )
31 $(info prof: $(int-sub $(_KBUILD_TS_FOOTER_START), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_FOOTER_START), $(_KBUILD_TS_PREV)) - start of footer.kmk)
32 _KBUILD_TS_PREV := $(_KBUILD_TS_FOOTER_START)
33endif
34
35#
36# Variables.
37# (Some of these need initialization before including definitions using them.)
38#
39
40# All targets of each types.
41_ALL_BLDPROGS := $(BLDPROGS) $(BLDPROGS.$(BUILD_PLATFORM)) $(BLDPROGS.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH)) $(BLDPROGS.$(BUILD_PLATFORM_ARCH)) $(BLDPROGS.$(BUILD_PLATFORM_CPU)) $(BLDPROGS.$(BUILD_TYPE))
42_ALL_LIBRARIES := $(LIBRARIES) $(LIBRARIES.$(BUILD_TARGET)) $(LIBRARIES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) $(LIBRARIES.$(BUILD_TARGET_ARCH)) $(LIBRARIES.$(BUILD_TARGET_CPU)) $(LIBRARIES.$(BUILD_TYPE))
43_ALL_IMPORT_LIBS := $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)) $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) $(IMPORT_LIBS.$(BUILD_TARGET_ARCH)) $(IMPORT_LIBS.$(BUILD_TARGET_CPU)) $(IMPORT_LIBS.$(BUILD_TYPE))
44_ALL_DLLS := $(DLLS) $(DLLS.$(BUILD_TARGET)) $(DLLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) $(DLLS.$(BUILD_TARGET_ARCH)) $(DLLS.$(BUILD_TARGET_CPU)) $(DLLS.$(BUILD_TYPE))
45_ALL_PROGRAMS := $(PROGRAMS) $(PROGRAMS.$(BUILD_TARGET)) $(PROGRAMS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) $(PROGRAMS.$(BUILD_TARGET_ARCH)) $(PROGRAMS.$(BUILD_TARGET_CPU)) $(PROGRAMS.$(BUILD_TYPE))
46_ALL_SYSMODS := $(SYSMODS) $(SYSMODS.$(BUILD_TARGET)) $(SYSMODS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) $(SYSMODS.$(BUILD_TARGET_ARCH)) $(SYSMODS.$(BUILD_TARGET_CPU)) $(SYSMODS.$(BUILD_TYPE))
47_ALL_OTHERS := $(OTHERS) $(OTHERS.$(BUILD_TARGET)) $(OTHERS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) $(OTHERS.$(BUILD_TARGET_ARCH)) $(OTHERS.$(BUILD_TARGET_CPU)) $(OTHERS.$(BUILD_TYPE))
48_ALL_INSTALLS := $(INSTALLS) $(INSTALLS.$(BUILD_TARGET)) $(INSTALLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) $(INSTALLS.$(BUILD_TARGET_ARCH)) $(INSTALLS.$(BUILD_TARGET_CPU)) $(INSTALLS.$(BUILD_TYPE))
49_ALL_FETCHES := $(FETCHES) $(FETCHES.$(BUILD_TARGET)) $(FETCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) $(FETCHES.$(BUILD_TARGET_ARCH)) $(FETCHES.$(BUILD_TARGET_CPU)) $(FETCHES.$(BUILD_TYPE))
50_ALL_PATCHES := $(PATCHES) $(PATCHES.$(BUILD_TARGET)) $(PATCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) $(PATCHES.$(BUILD_TARGET_ARCH)) $(PATCHES.$(BUILD_TARGET_CPU)) $(PATCHES.$(BUILD_TYPE))
51
52# all targets.
53_ALL_TARGETS = \
54 $(_ALL_FETCHES) \
55 $(_ALL_PATCHES) \
56 $(_ALL_BLDPROGS) \
57 $(_ALL_LIBRARIES) \
58 $(_ALL_IMPORT_LIBS) \
59 $(_ALL_DLLS) \
60 $(_ALL_PROGRAMS) \
61 $(_ALL_SYSMODS) \
62 $(_ALL_INSTALLS) \
63 $(_ALL_OTHERS)
64
65# all $(BUILD_TARGET) targets.
66_ALL_BUILD_TARGET_TARGETS = \
67 $(_ALL_FETCHES) \
68 $(_ALL_PATCHES) \
69 $(_ALL_LIBRARIES) \
70 $(_ALL_IMPORT_LIBS) \
71 $(_ALL_DLLS) \
72 $(_ALL_PROGRAMS) \
73 $(_ALL_SYSMODS) \
74 $(_ALL_INSTALLS) \
75 $(_ALL_OTHERS)
76
77# all $(BUILD_PLATFORM) targets.
78_ALL_BUILD_PLATFORM_TARGETS = \
79 $(_ALL_BLDPROGS)
80
81# all targets making use of srcname.
82_ALL_SRCNAME_TARGETS = \
83 $(_ALL_FETCHES) \
84 $(_ALL_PATCHES)
85
86# dependency files.
87_DEPFILES :=
88
89# included dependency files.
90_DEPFILES_INCLUDED :=
91
92
93# All kind of output files except for _OBJS and _DEPFILES.
94# Compiling or linking definition outputting other things that $@ and any
95# required dependency file must add those output files to this variable.
96_OUT_FILES :=
97
98# Files which only requires cleaning up.
99_CLEAN_FILES :=
100
101# all of a type
102_OBJS :=
103_FETCHES :=
104_DOWNLOADS:=
105_UNPACKS :=
106_PATCHES :=
107_UNFETCHES:=
108_BLDPROGS :=
109_LIBS :=
110_DLLS :=
111_PROGRAMS :=
112_SYSMODS :=
113_INSTALLS :=
114_INSTALLS_FILES :=
115_INSTALLS_DIRS :=
116_OTHERS :=
117_PACKING :=
118_DIRS := $(PATH_TARGET)/ $(PATH_TARGET) $(BLDDIRS)
119_IMPORT_LIBS :=
120
121# misc
122pass_prev :=
123
124
125
126#
127# Footer macros
128#
129
130## Figure out the tool for a target.
131# @param $1 normalized target.
132# @param $2 tooltype.
133# @param bld_trg build target.
134# @param bld_trg_arch build target architecture.
135_TARGET_TOOL = $(strip $(firstword \
136 $($(1)_$(2)TOOL.$(bld_trg).$(bld_trg_arch)) \
137 $($(1)_$(2)TOOL.$(bld_trg)) \
138 $($(1)_$(2)TOOL) \
139 $($(1)_TOOL.$(bld_trg).$(bld_trg_arch)) \
140 $($(1)_TOOL.$(bld_trg)) \
141 $($(1)_TOOL) \
142 $($(2)TOOL.$(bld_trg).$(bld_trg_arch)) \
143 $($(2)TOOL.$(bld_trg)) \
144 $($(2)TOOL) \
145 $(TOOL.$(bld_trg).$(bld_trg_arch)) \
146 $(TOOL.$(bld_trg)) \
147 $(TOOL) \
148 ))
149
150## Figure out the actual name of an installed file.
151# @param $1 The file to install.
152# @param $2 The target name.
153# @param $3 The _INST value (can be empty).
154# @param $4 The default directory to use when $3 is empty.
155_INSTALL_FILE = $(patsubst %/,%/$(notdir $(1)),$(if $(3),$(PATH_INS)/$(3),$(4)/))
156
157
158## Inherit one template property in a non-accumulative manner.
159# @param $(prop) Property name
160# @param $(src) Source (parent) object.
161# @param $(trg) Target (child) object.
162# @remark Not all properties has all the variations, but making the correct
163# exceptions will only complicate matters and probably not gain much speed.
164define def_inherit_one
165ifdef $(src)_$(prop)
166 ifndef $(trg)_$(prop)
167 $(trg)_$(prop) = $($(src)_$(prop))
168 #$ (warning dbg-inherit: $(trg)_$(prop) = $($(src)_$(prop)) )
169 endif
170endif
171endef # def_inherit_one
172
173## Inherit one template property in a non-accumulative manner.
174# @param $(prop) Property name
175# @param $(src) Source (parent) object.
176# @param $(trg) Target (child) object.
177# @remark Not all properties has all the variations, but making the correct
178# exceptions will only complicate matters and probably not gain much speed.
179# @todo Check how/if this differs from def_inherit_one.
180define def_inherit_one_now
181ifdef $(src)_$(prop)
182 ifndef $(trg)_$(prop)
183 $(trg)_$(prop) := $($(src)_$(prop))
184 #$ (warning dbg-inherit-now: $(trg)_$(prop) = $($(src)_$(prop)) )
185 endif
186endif
187endef # def_inherit_one_now
188
189## Inherit one template property in a non-accumulative manner, deferred expansion.
190# @param $(prop) Property name
191# @param $(src) Source
192# @param $(trg) Target
193# @remark This define relies on double evaluation
194define def_inherit_one_deferred
195ifdef $(src)_$(prop)
196 ifndef $(trg)_$(prop)
197 $(trg)_$(prop) = $$($(src)_$(prop))
198 #$ (warning dbg-inherit-def: $(trg)_$(prop) = $($(src)_$(prop)) )
199 endif
200endif
201endef # def_inherit_one_deferred
202
203## Generic inheritance for use with targets templates and tools.
204# @param trg Object to consider for inheriting.
205# @param src_prefix What to prefix the value found in EXTENDS with to get the object.
206# @param properties List of the properties with straight expansion.
207# @param properties_now List of the properties with immediate expansion.
208# @param properties_deferred List of the properties with deferred expansion (e.g. function).
209define def_inherit
210src := $(strip $($(trg)_EXTENDS))
211ifneq ($(src),)
212 ifndef $(trg)_EXTENDS_STATUS_
213 $(trg)_EXTENDS_STATUS_ := 0
214 src := $(src_prefix)$(src)
215
216 # Recursivly process the parent (src) if it's inherting from somebody too.
217 ifdef $(src)_EXTENDS
218 ifneq ($($(src)_EXTENDS_STATUS_),42)
219 # 'foreach' will create 'trg' in a new variable context hiding
220 # out current variable. 'src' OTOH will be overwritten.
221 #$ (warning def_inherit: recursing into $(src) from $(trg))
222 $(foreach trg, $(src), $(eval $(value def_inherit)))
223 src := $(src_prefix)$(strip $($(trg)_EXTENDS))
224 endif
225 endif
226
227 # Inherit the properties and mark the trg done.
228 #$ (warning def_inherit: trg=$(trg) src=$(src))
229 $(foreach prop, $(properties), $(eval $(def_inherit_one)))
230 $(foreach prop, $(properties_now), $(eval $(def_inherit_one_now)))
231 $(foreach prop, $(properties_deferred), $(eval $(def_inherit_one_deferred)))
232 $(trg)_EXTENDS_STATUS_ := 42
233 else
234 # Check for inheritance loops.
235 ifneq ($(target)_EXTENDS_STATUS_),42)
236 $(error kBuild: Target inheritance loop! target=$(target))
237 endif
238 endif
239endif
240endef # def_inherit
241
242
243#
244# Determin all the templates that is being used and make
245# sure they are present.
246#
247_TEMPLATES := $(TEMPLATE)
248define def_templates
249ifdef $(target)_TEMPLATE
250 ifneq ("$($(target)_TEMPLATE)","$(strip $($(target)_TEMPLATE))")
251 $$(error kBuild: The template name of target '$(target)' contains tabs ($($(target)_TEMPLATE))). Please remove them)
252 endif
253 _TEMPLATES += $($(target)_TEMPLATE)
254endif
255endef # def_templates
256$(foreach target, $(_ALL_TARGETS), $(eval $(def_templates)))
257_TEMPLATES := $(sort $(_TEMPLATES))
258
259define def_templates_include
260ifndef TEMPLATE_$(template)
261 TEMPLATE_$(template)_INCLUDE_FILE_ := $(firstword $(foreach path, $(TEMPLATE_PATHS) $(PATH_KBUILD)/templates/, $(wildcard $(path)/$(template).kmk)))
262 ifneq ($(TEMPLATE_$(template)_INCLUDE_FILE_),)
263 include $(TEMPLATE_$(template)_INCLUDE_FILE_)
264 else
265 $$(error kBuild: Cannot find template '$(template)')
266 endif
267endif
268endef # def_templates_include
269$(foreach template, $(_TEMPLATES), $(eval $(def_templates)))
270
271#$ (warning dbg _TEMPLATES := $(_TEMPLATES))
272
273
274#
275# Determin the BLD_TRG_* keywords required for correct inherting.
276#
277# This means walking all the template and target lists in order to
278# pick up all BLD_TRG_* attributes.
279#
280_BLD_TYPES := $(BUILD_TYPE)
281_BLD_TARGETS := $(BUILD_TARGET) $(BUILD_PLATFORMS)
282_BLD_ARCHES := $(BUILD_TARGET_ARCH) $(BUILD_PLATFORM_ARCH)
283_BLD_CPUS := $(BUILD_TARGET_CPU) $(BUILD_PLATFORM_CPU)
284
285define def_collect_bld_xyz
286ifdef ($(src)_BLD_TYPE)
287 _BLD_TYPE += $($(src)_BLD_TYPE)
288endif
289ifdef ($(src)_BLD_TRG)
290 _BLD_TARGETS += $($(src)_BLD_TRG)
291endif
292ifdef ($(src)_BLD_TRG_ARCH)
293 _BLD_ARCHES += $($(src)_BLD_TRG_ARCH)
294endif
295ifdef ($(src)_BLD_TRG_CPU)
296 _BLD_CPU += $($(src)_BLD_TRG_CPU)
297endif
298endef # def_collect_bld_xyz
299$(foreach src, $(addprefix TEMPLATE_, $(_TEMPLATES)) $(_ALL_TARGETS)\
300 ,$(eval $(def_collect_bld_xyz)))
301
302# drop duplicate values
303_BLD_TYPES := $(sort $(_BLD_TYPES))
304_BLD_TARGETS := $(sort $(_BLD_TARGETS))
305_BLD_ARCHES := $(sort $(_BLD_ARCHES))
306_BLD_CPUS := $(sort $(_BLD_CPUS))
307
308# Construct all the possible keywords.
309_KEYWORDS := $(_BLD_TYPES) $(_BLD_TARGETS) $(_BLD_ARCHES) $(_BLD_CPUS) \
310 $(foreach bld_trg,$(_BLD_TARGETS),$(addprefix $(bld_trg).,$(_BLD_ARCHES)))
311# $ (warning dbg _KEYWORDS := $(_KEYWORDS))
312
313ifdef KBUILD_PROFILE_SELF
314 _KBUILD_TS_NOW := $(nanots )
315 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done keywords)
316 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
317endif
318
319
320#
321# Target inheritance.
322#
323# This has to be done on a per target list basis as to avoid adding
324# incorrect properties that will wast memory, time, and may confuse
325# later strictness checks. This also has to be done *before* templates
326# are applied to the targets. Since we're doing that part rather
327# early on, the target inheritance feature is a bit restricted at
328# the moment. However, this will be addressed in a little(?) while.
329#
330
331src_prefix :=
332## combines the specified properties $(1) with the $(_KEYWORDS).
333_COMB_KEY_PROP = $(1) $(foreach keyword,$(_KEYWORDS), $(addsuffix .$(keyword), $(1)))
334
335# Fetches.
336properties := $(call _COMB_KEY_PROP,$(PROPS_FETCHES_SINGLE))
337properties_now := $(call _COMB_KEY_PROP,$(PROPS_FETCHES_ACCUMULATE_R) $(PROPS_FETCHES_ACCUMULATE_L))
338properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_FETCHES_DEFERRED))
339$(foreach trg, $(_ALL_FETCHES),$(eval $(value def_inherit)))
340
341## Patches. - not implemented yet.
342#properties := $(call _COMB_KEY_PROP,$(PROPS_PATCHES_SINGLE))
343#properties_now := $(call _COMB_KEY_PROP,$(PROPS_PATCHES_ACCUMULATE_R) $(PROPS_PATCHES_ACCUMULATE_L))
344#properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_PATCHES_DEFERRED))
345#$(foreach trg, $(_ALL_PATCHES),$(eval $(value def_inherit)))
346
347# Programs and build programs.
348properties := $(call _COMB_KEY_PROP,$(PROPS_PROGRAMS_SINGLE))
349properties_now := $(call _COMB_KEY_PROP,$(PROPS_PROGRAMS_ACCUMULATE_R) $(PROPS_PROGRAMS_ACCUMULATE_L))
350properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_PROGRAMS_DEFERRED))
351$(foreach trg, $(_ALL_BLDPROGS) $(_ALL_PROGRAMS),$(eval $(value def_inherit)))
352
353# Libraries and import libraries.
354properties := $(call _COMB_KEY_PROP,$(PROPS_LIBRARIES_SINGLE))
355properties_now := $(call _COMB_KEY_PROP,$(PROPS_LIBRARIES_ACCUMULATE_R) $(PROPS_LIBRARIES_ACCUMULATE_L))
356properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_LIBRARIES_DEFERRED))
357ifeq ($(filter-out nt os2 win win64 win32,$(BUILD_TARGET)),)
358 $(foreach trg, $(_ALL_LIBRARIES) $(_ALL_IMPORT_LIBS),$(eval $(value def_inherit)))
359else
360 $(foreach trg, $(_ALL_LIBRARIES),$(eval $(value def_inherit)))
361endif
362
363# DLLs.
364properties := $(call _COMB_KEY_PROP,$(PROPS_DLLS_SINGLE))
365properties_now := $(call _COMB_KEY_PROP,$(PROPS_DLLS_ACCUMULATE_R) $(PROPS_DLLS_ACCUMULATE_L))
366properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_DLLS_DEFERRED))
367ifeq ($(filter-out nt os2 win win64 win32,$(BUILD_TARGET)),)
368 $(foreach trg, $(_ALL_DLLS),$(eval $(value def_inherit)))
369else
370 $(foreach trg, $(_ALL_DLLS) $(_ALL_IMPORT_LIBS),$(eval $(value def_inherit)))
371endif
372
373# System modules.
374properties := $(call _COMB_KEY_PROP,$(PROPS_SYSMODS_SINGLE))
375properties_now := $(call _COMB_KEY_PROP,$(PROPS_SYSMODS_ACCUMULATE_R) $(PROPS_SYSMODS_ACCUMULATE_L))
376properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_SYSMODS_DEFERRED))
377$(foreach trg, $(_ALL_SYSMODS),$(eval $(value def_inherit)))
378
379# Installs.
380properties := $(call _COMB_KEY_PROP,$(PROPS_INSTALLS_SINGLE))
381properties_now := $(call _COMB_KEY_PROP,$(PROPS_INSTALLS_ACCUMULATE_R) $(PROPS_INSTALLS_ACCUMULATE_L))
382properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_INSTALLS_DEFERRED))
383$(foreach trg, $(_ALL_INSTALLS),$(eval $(value def_inherit)))
384
385ifdef KBUILD_PROFILE_SELF
386 _KBUILD_TS_NOW := $(nanots )
387 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done target inheritance)
388 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
389endif
390
391
392#
393# Template Inheritance.
394#
395# This is much the same as with target inheritance, except we cannot
396# restrict the properties involved since we've got a clue which target
397# types are using them. But, we can drop the instance expansion we're
398# doing for targets since there won't be any more changes to either the
399# source nor the target templates beyond this exercise.
400#
401
402src_prefix := TEMPLATE_
403properties :=
404properties_now :=
405properties_deferred := $(call _COMB_KEY_PROP,$(PROPS_ALL))
406$(foreach trg, $(addprefix TEMPLATE_,$(_TEMPLATES)),$(eval $(value def_inherit)))
407
408# done.
409src_prefix :=
410properties :=
411properties_now :=
412properties_deferred :=
413
414ifdef KBUILD_PROFILE_SELF
415 _KBUILD_TS_NOW := $(nanots )
416 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done template inheritance)
417 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
418endif
419
420
421#
422# Common Inheritance
423#
424
425## Inherit one template property in a non-accumulative manner.
426# @param $(prop) Property name
427# @param $(target) Target name
428# @todo fix the precedence order for some properties.
429define def_inherit_template_one
430ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
431ifndef $(target)_$(prop)
432$(target)_$(prop) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop))
433#$ (warning dbgtarget: $(target)_$(prop):='$(value $(target)_$(prop))' TEMPLATE_$($(target)_TEMPLATE)_$(prop))
434endif
435endif
436ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
437ifndef $(target)_$(prop).$(bld_trg)
438#$ (warning dbgsource: $(target)_$(prop).$(bld_trg)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
439$(target)_$(prop).$(bld_trg) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
440endif
441endif
442ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)
443ifndef $(target)_$(prop).$(bld_trg).$(bld_trg_arch)
444#$ (warning dbgsource: $(target)_$(prop).$(bld_trg).$(bld_trg_arch)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
445$(target)_$(prop).$(bld_trg).$(bld_trg_arch) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
446endif
447endif
448ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
449ifndef $(target)_$(prop).$(bld_trg_arch)
450#$ (warning dbgsource: $(target)_$(prop).$(bld_trg_arch)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
451$(target)_$(prop).$(bld_trg_arch) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
452endif
453endif
454ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
455ifndef $(target)_$(prop).$(bld_trg_cpu)
456#$ (warning dbgsource: $(target)_$(prop).$(bld_trg_cpu)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
457$(target)_$(prop).$(bld_trg_cpu) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
458endif
459endif
460endef
461
462## Inherit one template property in a non-accumulative manner, deferred expansion.
463# @param 1: $(prop) Property name
464# @param 2: $(target) Target name
465# @todo fix the precedence order for some properties.
466# @remark this define relies on double evaluation
467define def_inherit_template_one_deferred
468ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
469ifndef $(target)_$(prop)
470$(target)_$(prop) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop))
471#$ (warning dbgtarget: $(target)_$(prop):='$(value $(target)_$(prop))' TEMPLATE_$($(target)_TEMPLATE)_$(prop))
472endif
473endif
474ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
475ifndef $(target)_$(prop).$(bld_trg)
476#$ (warning dbgsource: $(target)_$(prop).$(bld_trg)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
477$(target)_$(prop).$(bld_trg) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
478endif
479endif
480ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)
481ifndef $(target)_$(prop).$(bld_trg).$(bld_trg_arch)
482#$ (warning dbgsource: $(target)_$(prop).$(bld_trg).$(bld_trg_arch)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
483$(target)_$(prop).$(bld_trg).$(bld_trg_arch) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
484endif
485endif
486ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
487ifndef $(target)_$(prop).$(bld_trg_arch)
488#$ (warning dbgsource: $(target)_$(prop).$(bld_trg_arch)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
489$(target)_$(prop).$(bld_trg_arch) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
490endif
491endif
492ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
493ifndef $(target)_$(prop).$(bld_trg_cpu)
494#$ (warning dbgsource: $(target)_$(prop).$(bld_trg_cpu)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
495$(target)_$(prop).$(bld_trg_cpu) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
496endif
497endif
498endef
499
500## Inherit one acculumlative template property where the 'most significant' items are at the left end.
501# @param $(prop) Property name
502# @param $(target) Target name
503define def_inherit_template_one_accumulate_l
504ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
505#$ (warning dbgtype: TEMPLATE_$($(target)_TEMPLATE)_$(prop) $(target)_$(prop)=$($(target)_$(prop)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop)))
506$(target)_$(prop) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop))
507#$ (warning dbgtype: $(target)_$(prop)=$($(target)_$(prop)))
508endif
509ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TYPE)
510#$ (warning dbg4: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TYPE))
511$(target)_$(prop).$(BUILD_TYPE) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TYPE))
512endif
513ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
514#$ (warning dbg5: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
515$(target)_$(prop).$(bld_trg) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
516endif
517ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)
518#$ (warning dbg4: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
519$(target)_$(prop).$(bld_trg).$(bld_trg_arch) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
520endif
521ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
522#$ (warning dbg5: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
523$(target)_$(prop).$(bld_trg_cpu) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
524endif
525ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
526#$ (warning dbg6: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
527$(target)_$(prop).$(bld_trg_arch) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
528endif
529endef
530
531## Inherit one acculumlative template property where the 'most significant' items are at the right end.
532# @param $(prop) Property name
533# @param $(target) Target name
534define def_inherit_template_one_accumulate_r
535ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
536#$ (warning dbgtype: TEMPLATE_$($(target)_TEMPLATE)_$(prop) $(target)_$(prop)=$($(target)_$(prop)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop)))
537$(target)_$(prop) <=$$(TEMPLATE_$($(target)_TEMPLATE)_$(prop))
538#$ (warning dbgtype: $(target)_$(prop)=$($(target)_$(prop)))
539endif
540ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TYPE)
541#$ (warning dbg4: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TYPE))
542$(target)_$(prop).$(BUILD_TYPE) <=$$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TYPE))
543endif
544ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
545#$ (warning dbg5: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
546$(target)_$(prop).$(bld_trg) <=$$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
547endif
548ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)
549#$ (warning dbg4: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
550$(target)_$(prop).$(bld_trg).$(bld_trg_arch) <=$$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
551endif
552ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
553#$ (warning dbg5: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
554$(target)_$(prop).$(bld_trg_cpu) <=$$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
555endif
556ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
557#$ (warning dbg6: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
558$(target)_$(prop).$(bld_trg_arch) <=$$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
559endif
560endef
561
562
563## Inherit template properties for on target.
564# @param $(target) Target name.
565define def_inherit_template
566# sanity check.
567ifdef _$(target)_ALREADY_PROCESSED
568 $(error kBuild: The target $(target) appears more than once in the target lists! Please correct the makefile(s))
569endif
570_$(target)_ALREADY_PROCESSED := 1
571
572# Inherit any default template.
573ifdef TEMPLATE
574ifeq ($($(target)_TEMPLATE),)
575$(eval $(target)_TEMPLATE:=$(TEMPLATE))
576endif
577endif
578# Expand the template if specified.
579ifneq ($($(target)_TEMPLATE),)
580$(foreach prop,$(PROPS_SINGLE),$(eval $(value def_inherit_template_one)))
581$(foreach prop,$(PROPS_DEFERRED),$(eval $(def_inherit_template_one_deferred))) # exploits the 2 evaluation, so no value!
582$(foreach prop,$(PROPS_ACCUMULATE_L),$(eval $(def_inherit_template_one_accumulate_l))) # += works fine without value
583$(foreach prop,$(PROPS_ACCUMULATE_R),$(eval $(def_inherit_template_one_accumulate_r))) # use <= (kmk addition)
584endif
585endef
586
587# Inherit template properties
588bld_trg := $(BUILD_TARGET)
589bld_trg_arch := $(BUILD_TARGET_ARCH)
590bld_trg_cpu := $(BUILD_TARGET_CPU)
591$(foreach target, $(_ALL_BUILD_TARGET_TARGETS),$(eval $(value def_inherit_template)))
592
593bld_trg := $(BUILD_PLATFORM)
594bld_trg_arch := $(BUILD_PLATFORM_ARCH)
595bld_trg_cpu := $(BUILD_PLATFORM_CPU)
596$(foreach target, $(_ALL_BUILD_PLATFORM_TARGETS),$(eval $(value def_inherit_template)))
597
598ifdef KBUILD_PROFILE_SELF
599 _KBUILD_TS_NOW := $(nanots )
600 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done common inheritance)
601 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
602endif
603
604
605#
606# Include tools & sdks
607#
608# The first part of this exercise is to figure out which TOOLS and SDKS
609# that should be included.
610#
611_TOOLS := $(TOOL.$(BUILD_TARGET)) $(TOOL.$(BUILD_TARGET_ARCH)) $(TOOL.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
612 $(TOOL.$(BUILD_PLATFORM)) $(TOOL.$(BUILD_PLATFORM_ARCH)) $(TOOL.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH)) \
613 $(TOOL)
614_SDKS := $(SDKS.$(BUILD_TARGET)) $(SDKS.$(BUILD_TARGET_ARCH)) $(SDKS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
615 $(SDKS.$(BUILD_PLATFORM)) $(SDKS.$(BUILD_PLATFORM_ARCH)) $(SDKS.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH)) \
616 $(SDKS.$(BUILD_TYPE)) \
617 $(SDKS)
618define def_tools_sdks_target_source
619$(eval _TOOLS += $(foreach prop, $(PROPS_TOOLS), \
620 $($(source)_$(prop).$(_bld_trg)) \
621 $($(target)_$(source)_$(prop).$(_bld_trg)) \
622 $($(source)_$(prop).$(_bld_trg).$(_bld_trg_arch)) \
623 $($(target)_$(source)_$(prop).$(_bld_trg).$(_bld_trg_arch)) \
624 $($(source)_$(prop).$(_bld_trg_arch)) \
625 $($(target)_$(source)_$(prop).$(_bld_trg_arch)) \
626 $($(source)_$(prop)) \
627 $($(target)_$(source)_$(prop))))
628$(eval _SDKS += \
629 $($(source)_SDKS.$(_bld_trg)) \
630 $($(target)_$(source)_SDKS.$(_bld_trg)) \
631 $($(source)_SDKS.$(_bld_trg).$(_bld_trg_arch)) \
632 $($(target)_$(source)_SDKS.$(_bld_trg).$(_bld_trg_arch)) \
633 $($(source)_SDKS.$(_bld_trg_arch)) \
634 $($(target)_$(source)_SDKS.$(_bld_trg_arch)) \
635 $($(source)_SDKS.$(BUILD_TYPE)) \
636 $($(target)_$(source)_SDKS.$(BUILD_TYPE)) \
637 $($(source)_SDKS) \
638 $($(target)_$(source)_SDKS))
639endef # def_tools_sdks_target_source
640
641define def_tools_sdks_target
642_bld_type := $(firstword $($(target)_BLD_TYPE) $(BUILD_TYPE))
643_bld_trg := $(firstword $($(target)_BLD_TRG) $(bld_trg))
644_bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(bld_trg_arch))
645_bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(bld_trg_cpu))
646
647$(eval _TOOLS += $(foreach prop, $(PROPS_TOOLS), \
648 $($(target)_$(prop).$(_bld_trg)) \
649 $($(target)_$(prop).$(_bld_trg_arch)) \
650 $($(target)_$(prop).$(_bld_trg).$(_bld_trg_arch)) \
651 $($(target)_$(prop))))
652$(eval _SDKS += \
653 $($(target)_SDKS.$(_bld_trg)) \
654 $($(target)_SDKS.$(_bld_trg_arch)) \
655 $($(target)_SDKS.$(_bld_trg).$(_bld_trg_arch)) \
656 $($(target)_SDKS))
657$(foreach source, \
658 $($(target)_SOURCES.$(_bld_trg)) \
659 $($(target)_SOURCES.$(_bld_trg_arch)) \
660 $($(target)_SOURCES.$(_bld_trg).$(_bld_trg_arch)) \
661 $($(target)_SOURCES.$(_bld_trg_cpu)) \
662 $($(target)_SOURCES.$(_bld_type)) \
663 $($(target)_SOURCES) \
664 , $(eval $(value def_tools_sdks_target_source)))
665endef # def_tools_sdks_target
666
667define def_tools_srcname_target
668_bld_type := $(firstword $($(target)_BLD_TYPE) $(BUILD_TYPE))
669_bld_trg := $(firstword $($(target)_BLD_TRG) $(bld_trg))
670_bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(bld_trg_arch))
671_bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(bld_trg_cpu))
672
673$(foreach source, $(notdir\
674 $($(target)_SOURCES.$(_bld_trg)) \
675 $($(target)_SOURCES.$(_bld_trg_arch)) \
676 $($(target)_SOURCES.$(_bld_trg).$(_bld_trg_arch)) \
677 $($(target)_SOURCES.$(_bld_trg_cpu)) \
678 $($(target)_SOURCES.$(_bld_type)) \
679 $($(target)_SOURCES) \
680 ), $(eval $(value def_tools_sdks_target_source)))
681endef # def_tools_srcname_target
682
683bld_trg := $(BUILD_TARGET)
684bld_trg_arch := $(BUILD_TARGET_ARCH)
685bld_trg_cpu := $(BUILD_TARGET_CPU)
686$(foreach target, $(_ALL_BUILD_TARGET_TARGETS), $(eval $(value def_tools_sdks_target)))
687$(foreach target, $(_ALL_SRCNAME_TARGETS), $(eval $(value def_tools_srcname_target)))
688
689bld_trg := $(BUILD_PLATFORM)
690bld_trg_arch := $(BUILD_PLATFORM_ARCH)
691bld_trg_cpu := $(BUILD_PLATFORM_CPU)
692$(foreach target, $(_ALL_BUILD_PLATFORM_TARGETS), $(eval $(value def_tools_sdks_target)))
693
694
695# include TOOLS
696define def_tools_include
697ifndef TOOL_$(tool)
698 TOOL_$(tool)_KMK_FILE := $(firstword $(foreach path, $(TOOL_PATHS) $(PATH_KBUILD)/tools, $(wildcard $(path)/$(tool).kmk)))
699 ifeq ($(TOOL_$(tool)_KMK_FILE),)
700 $(error kBuild: Cannot find include file for the tool '$(tool)'! Searched: $(TOOL_PATHS) $(PATH_KBUILD)/tools)
701 endif
702 include $(TOOL_$(tool)_KMK_FILE)
703 ifndef TOOL_$(tool)
704 $(warning kBuild: TOOL_$(tool) was not by $(TOOL_$(tool)_KMK_FILE)!)
705 endif
706endif
707endef # def_tools_include
708
709_TOOLS := $(sort $(_TOOLS))
710$(foreach tool, $(_TOOLS), $(eval $(value def_tools_include)))
711
712
713# include SDKS
714define def_sdks_include_one
715ifndef SDK_$(sdk)
716 SDK_$(sdk)_KMK_FILE := $(firstword $(foreach path, $(SDK_PATHS) $(PATH_KBUILD)/sdks, $(wildcard $(path)/$(sdk).kmk)))
717 ifeq ($(SDK_$(sdk)_KMK_FILE),)
718 $(error kBuild: Cannot find include file for the SDK '$(sdk)'! Searched: $(SDK_PATHS) $(PATH_KBUILD)/sdks)
719 endif
720 include $(SDK_$(sdk)_KMK_FILE)
721 ifndef SDK_$(sdk)
722 $(warning kBuild: SDK_$(sdk) was not defined by $(SDK_$(sdk)_KMK_FILE)!)
723 endif
724endif
725endef # def_sdks_include_one
726
727_SDKS := $(sort $(_SDKS))
728$(foreach sdk, $(_SDKS), $(eval $(value def_sdks_include_one)))
729
730## @todo Execute SDKS and TOOL inhertiance.
731
732ifdef KBUILD_PROFILE_SELF
733 _KBUILD_TS_NOW := $(nanots )
734 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done tools and sdks)
735 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
736endif
737
738
739#
740#
741# Target lists - Pass 1
742#
743# This pass is for defining variables that might be referenced in
744# properties of other targets.
745#
746#
747
748# Don't do anything for fetch targets (yet).
749
750##
751# Link prolog for Pass 1.
752#
753# @param $(target) Normalized target name.
754# @param $(EXT) EXE,DLL,SYS,LIB.
755# @param $(EXTPRE) HOST or nothing.
756# @param $(definst) The default _INST value.
757# @param $(tool_prefix) LD or AR.
758# @param $(bld_trg_base_var) TARGET or PLATFORM.
759define def_pass1_link_common
760
761bld_type := $(firstword $($(target)_BLD_TYPE) $(BUILD_TYPE))
762bld_trg := $(firstword $($(target)_BLD_TRG) $(BUILD_$(bld_trg_base_var)))
763bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(BUILD_$(bld_trg_base_var)_ARCH))
764bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(BUILD_$(bld_trg_base_var)_CPU))
765
766tool := $(call _TARGET_TOOL,$(target),$(tool_prefix))
767name := $(firstword\
768 $($(target)_NAME.$(bld_trg).$(bld_trg_arch))\
769 $($(target)_NAME.$(bld_trg_arch))\
770 $($(target)_NAME.$(bld_trg))\
771 $($(target)_NAME.$(bld_type))\
772 $($(target)_NAME)\
773 $(target))
774outbase := $(call TARGET_BASE,$(name),$(target))
775ifndef PATH_$(target)
776 PATH_$(target) := $(patsubst %/,%,$(dir $(outbase)))
777else ifneq ($(PATH_$(target)),$(patsubst %/,%,$(dir $(outbase))))
778 $(error kBuild internal error: PATH_$(target)=$(PATH_$(target)) expected $(patsubst %/,%,$(dir $(outbase))))
779endif
780ifeq ($(tool_prefix),AR) ## @todo fix this mess!
781suff := $(firstword\
782 $($(target)_$(EXT)SUFF.$(bld_trg).$(bld_trg_arch))\
783 $($(target)_$(EXT)SUFF.$(bld_trg))\
784 $($(target)_$(EXT)SUFF)\
785 $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF.$(bld_trg).$(bld_trg_arch))\
786 $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF.$(bld_trg))\
787 $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF)\
788 $(SUFF_LIB))
789else
790suff := $(firstword \
791 $($(target)_$(EXT)SUFF) \
792 $($(target)_$(EXT)SUFF) \
793 $(TOOL_$(tool)_$(tool_prefix)$(EXT)SUFF) \
794 $($(EXTPRE)SUFF_$(EXT)))
795endif
796out := $(outbase)$(suff)
797
798# TARGET_*
799TARGET_$(target) := $(out)
800
801# INSTARGET_*
802ifndef $(target)_NOINST
803INSTARGET_$(target) := $(patsubst %/,%/$(notdir $(out)), \
804 $(if $($(target)_INST), $(addprefix $(PATH_INS)/,$($(target)_INST)), $(definst)/))
805
806else # NOINST
807INSTARGET_$(target) :=
808endif # NOINST
809
810endef
811
812
813#
814# BLDPROGS (Pass 1)
815#
816define def_pass1_bldprog
817# set NOINST if not forced installation before doing the usual stuff.
818ifndef $(target)_INST
819$(target)_NOINST := 1
820endif
821$(eval $(value def_pass1_link_common))
822endef
823
824EXT := EXE
825EXTPRE := HOST
826definst := $(PATH_BIN)
827tool_prefix := LD
828bld_trg_base_var := PLATFORM
829$(foreach target, $(BLDPROGS) $(BLDPROGS.$(BUILD_PLATFORM)) $(BLDPROGS.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH)), \
830 $(eval $(value def_pass1_bldprog)))
831
832
833#
834# LIBRARIES (Pass 1)
835#
836EXT := LIB
837EXTPRE :=
838definst := $(PATH_LIB)
839tool_prefix := AR
840bld_trg_base_var := TARGET
841$(foreach target, $(LIBRARIES) $(LIBRARIES.$(BUILD_TARGET)) $(LIBRARIES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
842 $(eval $(value def_pass1_link_common)))
843
844
845#
846# DLLS (Pass 1)
847#
848EXT := DLL
849EXTPRE :=
850definst := $(PATH_DLL)
851tool_prefix := LD
852bld_trg_base_var := TARGET
853$(foreach target, $(DLLS) $(DLLS.$(BUILD_TARGET)) $(DLLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
854 $(eval $(value def_pass1_link_common)))
855
856
857#
858# IMPORT LIBRARIES (Pass 1)
859#
860# - On OS/2 and windows these are libraries.
861# - On other platforms they are fake DLLs.
862#
863ifeq ($(filter-out nt os2 win win64 win32,$(BUILD_TARGET)),)
864 EXT := LIB
865 EXTPRE :=
866 definst := $(PATH_LIB)
867 tool_prefix := AR
868 bld_trg_base_var := TARGET
869 $(foreach target, $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)) $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
870 $(eval $(value def_pass1_lib)))
871else
872 EXT := DLL
873 EXTPRE :=
874 definst := $(PATH_DLL)
875 tool_prefix := LD
876 bld_trg_base_var := TARGET
877 $(foreach target, $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)) $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
878 $(eval $(value def_pass1_link_common)))
879endif
880
881
882#
883# PROGRAMS (Pass 1)
884#
885EXT := EXE
886EXTPRE :=
887definst := $(PATH_BIN)
888tool_prefix := LD
889bld_trg_base_var := TARGET
890$(foreach target, $(PROGRAMS) $(PROGRAMS.$(BUILD_TARGET)) $(PROGRAMS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
891 $(eval $(value def_pass1_link_common)))
892
893
894#
895# SYSMODS (Pass 1)
896#
897EXT := SYS
898EXTPRE :=
899definst := $(PATH_SYS)
900tool_prefix := LD
901bld_trg_base_var := TARGET
902$(foreach target, $(SYSMODS) $(SYSMODS.$(BUILD_TARGET)) $(SYSMODS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
903 $(eval $(value def_pass1_link_common)))
904
905
906#
907# INSTALLS (Pass 1)
908# Note! INSTARGET_* for INSTALLS aren't available until later.
909#
910define def_pass1_install
911bld_type := $(firstword $($(target)_BLD_TYPE) $(BUILD_TYPE))
912bld_trg := $(firstword $($(target)_BLD_TRG) $(BUILD_TARGET))
913bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(BUILD_TARGET_ARCH))
914bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(BUILD_TARGET_CPU))
915# TARGET_*
916TARGET_$(target) := $(PATH_TARGET)/$(target).ins
917# INSTARGET_ later.
918endef
919$(foreach target, $(INSTALLS) $(INSTALLS.$(BUILD_TARGET)) $(INSTALLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
920 $(eval $(value def_pass1_install)))
921
922ifdef KBUILD_PROFILE_SELF
923 _KBUILD_TS_NOW := $(nanots )
924 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done pass 1)
925 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
926endif
927
928
929
930
931#
932#
933# Target lists - Pass 2
934#
935#
936
937
938## @page pg_fetches Fetching Tools, Sources and Similar.
939#
940# The targets listed in the the FETCHES target list have the following attributes:
941# SOURCES
942# INST
943# FETCHTOOL
944# FETCHFLAGS
945# FETCHDIR
946# UNPACKTOOL
947# UNPACKFLAGS
948#
949# As usual the target name is an alias for 'creating' the target. Other
950# aliases are:
951# pass_fetches
952# fetch
953# unfetch
954# download
955# unpack
956#
957# @remark
958#
959# This is a little bit complex because we must guarantee that if a source file
960# changes only sligtly we must refetch it and to a proper unpacking of it. It
961# is also a desire that fetched archives and unpacked files can be deleted to
962# save space.
963#
964# Thus, we must be able to cleanup what we've unpacked should any of the
965# sources be removed. We do this by maintaining a file listing the files
966# and directories that was unpacked. This operation is named 'unfetch'.
967#
968# We make use of the SIZE and MD5 attributes for each of the sources to
969# create a digest that is stored in the primary target file. Subsequent
970# runswill compare their digest with it to decide if a refetch is required.
971# When a refetch is found necessary, an 'unfetch' is performed first to
972# clean out old files and directores. Note even changes in source order
973# will cause a refetch due to the way the digest is constructed and
974# evaluated.
975#
976# By not depending directly on the archives (nor on any unpacked files)
977# but on a goal made up from the archive name, size and md5, we allow
978# the user to delete the archives. Naturally, this means we'll have to
979# check and fetch missing archives before attempting to unpack them.
980#
981# @remark
982#
983# This feature will *NOT* work correctly with vanilla GNU make becuase
984# it makes use of includedep to avoid too many unnecessary files.
985#
986# @todo
987# 1. Port md5sum or some equivalent tool and include it in kBuild.
988# 2. Download corruption / continuation.
989# 3. It's quite possible that there is one too many indirect dependency now...
990#
991
992## @todo move this!
993MD5SUM := md5sum
994
995## generates the fetch rule
996define def_fetch_src_fetch_rule
997# Indirect goal for downloading something.
998.PRECIOUS: $(out)
999$(out) + $($(target)_$(srcname)_FETCH_OUTPUT_) +| $($(target)_$(srcname)_FETCH_OUTPUT_MAYBE_) : \
1000 | $($(target)_$(srcname)_FETCH_DEPORD_)
1001 $$(call MSG_FETCH_DL,$(target),$(source),$(out))
1002 @## @todo do fancy stuff like download continuation.
1003 $$(QUIET)$$(RM) -f $(out) $(out).md5
1004 $($(target)_$(srcname)_FETCH_CMDS_)
1005 $$(QUIET2)$(if $(md5),$$(APPEND) $(out).md5 "$(md5) *$(out)")
1006 $$(QUIET)$(if $(md5),$$(MD5SUM) -c $(out).md5)
1007
1008
1009
1010# Intermediate goal for making sure the md5 and size matches. it will (re) fetch the archive if necessary.
1011$(out).checked_$(md5)_$(size): $($(target)_$(srcname)_FETCH_DEPEND_) | $($(target)_$(srcname)_FETCH_DEPORD_)
1012 $$(call MSG_FETCH_CHK,$(target),$(source),$(out))
1013 $$(QUIET)$$(RM) -f $$@ $(out).md5
1014 @# creates the .md5 we pass to md5sum.
1015 $$(QUIET2)$(if $(md5),$$(APPEND) $(out).md5 "$(md5) *$(out)")
1016 @# (re)fetch the file if it doesn't exist or if it doesn't matches the md5.
1017 @## @todo do fancy stuff like download continuation.
1018 $$(QUIET)( test -f $(out) && $(if $(md5),$$(MD5SUM) -c $(out).md5, true) ) \
1019 || ( $$(RM_EXT) -f $(out) \
1020 && $$(MAKE) $(out) -f $(MAKEFILE) --no-print-directory )
1021 $$(QUIET2)$$(APPEND) $$@
1022
1023_TARGET_$(target)_FETCHED += $(out) $(out).checked_$(md5)_$(size)
1024
1025# Just a little precaution.
1026.NOTPARALLEL: $(out) $(out).checked_$(md5)_$(size)
1027
1028endef
1029
1030## generates the unpack rule
1031define def_fetch_src_unpack_rule
1032# This is the unpack rule. it has an order-only dependency on the download check.
1033$(out) + $($(target)_$(srcname)_UNPACK_OUTPUT_) +| $($(target)_$(srcname)_UNPACK_OUTPUT_MAYBE_) : \
1034 $($(target)_$(srcname)_UNPACK_DEPEND_) \
1035 | $($(target)_$(srcname)_UNPACK_DEPORD_) $(archive).checked_$(md5)_$(size)
1036 $$(call MSG_FETCH_UP,$(target),$(archive),$(inst))
1037 $$(QUIET)$$(RM) -f $(out)
1038 @# if the source archive doesn't exist fetch it (can have been deleted to save space).
1039 $$(QUIET)test -f $(archive) \
1040 || ( $$(RM_EXT) -f $(archive).checked_$(md5)_$(size) \
1041 && $$(MAKE) $(archive).checked_$(md5)_$(size) -f $(MAKEFILE) --no-print-directory )
1042 $($(target)_$(srcname)_UNPACK_CMDS_)
1043 $$(QUIET2)$$(APPEND) $(out) $(notdir $(archive).checked_$(md5)_$(size))
1044 $$(QUIET2)$$(APPEND) $(out) $(notdir $(out))
1045
1046$(eval _TARGET_$(target)_UNPACKED += $(out))
1047_TARGET_$(target)_DIGEST := $(_TARGET_$(target)_DIGEST)-$(srcname)_$(md5)_$(size)
1048
1049.NOTPARALLEL: $(out)
1050
1051endef
1052
1053## Processes a fetch source
1054#
1055define def_fetch_src
1056#$ (warning dbg: def_fetch_src: source='$(source)' target='$(target)')
1057
1058# common
1059srcname := $(notdir $(source))
1060inst := $(firstword \
1061 $($(target)_$(source)_INST)\
1062 $($(target)_$(srcname)_INST)\
1063 $($(source)_INST)\
1064 $($(srcname)_INST)\
1065 $($(target)_INST)\
1066)
1067ifneq ($(patsubst %/,ok,$(inst)),ok)
1068$(error kBuild: Bad or missing INST property for source '$(source)' in target '$(target)': $(inst))
1069endif
1070INSTARGET_$(target)_$(srcname) := $(inst)
1071fetchdir := $(firstword \
1072 $($(target)_$(source)_FETCHDIR)\
1073 $($(target)_$(srcname)_FETCHDIR)\
1074 $($(source)_FETCHDIR)\
1075 $($(srcname)_FETCHDIR)\
1076 $($(target)_FETCHDIR)\
1077 $(FETCHDIR)\
1078 $(PATH_TARGET)\
1079)
1080deps := \
1081 $($(target)_$(source)_DEPS)\
1082 $($(target)_$(srcname)_DEPS)\
1083 $($(source)_DEPS)\
1084 $($(srcname)_DEPS)\
1085 $($(target)_DEPS)
1086orderdeps := \
1087 $($(target)_$(source)_ORDERDEPS)\
1088 $($(target)_$(srcname)_ORDERDEPS)\
1089 $($(source)_ORDERDEPS)\
1090 $($(srcname)_ORDERDEPS)\
1091 $($(target)_ORDERDEPS)
1092md5 := $(firstword \
1093 $($(target)_$(source)_MD5)\
1094 $($(target)_$(srcname)_MD5)\
1095 $($(source)_MD5)\
1096 $($(srcname)_MD5)\
1097 $($(target)_MD5)\
1098)
1099size := $(firstword \
1100 $($(target)_$(source)_SIZE)\
1101 $($(target)_$(srcname)_SIZE)\
1102 $($(source)_SIZE)\
1103 $($(srcname)_SIZE)\
1104 $($(target)_SIZE)\
1105)
1106dep := # not legal for fetch and unpack tools
1107
1108
1109#
1110# The fetching.
1111#
1112out := $(fetchdir)/$(srcname)
1113archive := $(out)
1114TARGET_$(target)_$(srcname) := $(out)
1115dirdep := $(call DIRDEP,$(fetchdir))
1116tool := $(firstword \
1117 $($(target)_$(source)_FETCHTOOL)\
1118 $($(target)_$(srcname)_FETCHTOOL)\
1119 $($(target)_$(source)_TOOL)\
1120 $($(target)_$(srcname)_TOOL)\
1121 $($(source)_FETCHTOOL)\
1122 $($(srcname)_FETCHTOOL)\
1123 $($(source)_TOOL)\
1124 $($(srcname)_TOOL)\
1125 $($(target)_FETCHTOOL)\
1126 $($(target)_TOOL)\
1127 )
1128flags :=\
1129 $(TOOL_$(tool)_FETCHFLAGS)\
1130 $(FETCHFLAGS)\
1131 $($(target)_FETCHFLAGS)\
1132 $($(srcname)_FETCHFLAGS)\
1133 $($(source)_FETCHFLAGS)\
1134 $($(target)_$(srcname)_FETCHFLAGS)\
1135 $($(target)_$(source)_FETCHFLAGS)
1136
1137#$ (warning dbg: target=$(target) source=$(source) $(srcname)=$(srcname) tool=$(tool) out=$(out) flags=$(flags) dirdep=$(dirdep) fetchdir=$(fetchdir) md5=$(md5) size=$(size))
1138
1139ifndef TOOL_$(tool)_FETCH_CMDS
1140$(warning kBuild: tools: \
1141 1 $($(target)_$(source)_FETCHTOOL)\
1142 2 $($(target)_$(srcname)_FETCHTOOL)\
1143 3 $($(target)_$(source)_TOOL)\
1144 4 $($(target)_$(srcname)_TOOL)\
1145 5 $($(source)_FETCHTOOL)\
1146 6 $($(srcname)_FETCHTOOL)\
1147 7 $($(source)_TOOL)\
1148 8 $($(srcname)_TOOL)\
1149 9 $($(target)_FETCHTOOL)\
1150 10 $($(target)_TOOL) )
1151$(error kBuild: TOOL_$(tool)_FETCH_CMDS is not defined. source=$(source) target=$(target) )
1152endif
1153
1154# call the tool
1155$(target)_$(srcname)_FETCH_CMDS_ := $(TOOL_$(tool)_FETCH_CMDS)
1156$(target)_$(srcname)_FETCH_OUTPUT_ := $(TOOL_$(tool)_FETCH_OUTPUT)
1157$(target)_$(srcname)_FETCH_OUTPUT_MAYBE_ := $(TOOL_$(tool)_FETCH_OUTPUT_MAYBE)
1158$(target)_$(srcname)_FETCH_DEPEND_ := $(TOOL_$(tool)_FETCH_DEPEND) $(deps)
1159$(target)_$(srcname)_FETCH_DEPORD_ := $(TOOL_$(tool)_FETCH_DEPORD) $(dirdep) $(orderdeps)
1160
1161# generate the fetch rule.
1162$(eval $(def_fetch_src_fetch_rule))
1163
1164
1165#
1166# The unpacking / installing.
1167#
1168out := $(inst)_kBuild_$(target)_$(srcname)_unpacked.lst
1169dirdep := $(call DIRDEP,$(inst))
1170tool := $(firstword \
1171 $($(target)_$(source)_UNPACKTOOL)\
1172 $($(target)_$(srcname)_UNPACKTOOL)\
1173 $($(target)_$(source)_TOOL)\
1174 $($(target)_$(srcname)_TOOL)\
1175 $($(source)_UNPACKTOOL)\
1176 $($(srcname)_UNPACKTOOL)\
1177 $($(source)_TOOL)\
1178 $($(srcname)_TOOL)\
1179 $($(target)_UNPACKTOOL)\
1180 $($(target)_TOOL) \
1181 )
1182ifeq ($(tool),)
1183tool := $(toupper $(subst .,,$(suffix $(subst tar.,TAR,$(srcname)))))
1184$(eval $(value def_tools_include))
1185endif
1186flags :=\
1187 $(TOOL_$(tool)_UNPACKFLAGS)\
1188 $(UNPACKFLAGS)\
1189 $($(target)_UNPACKFLAGS)\
1190 $($(srcname)_UNPACKFLAGS)\
1191 $($(source)_UNPACKFLAGS)\
1192 $($(target)_$(srcname)_UNPACKFLAGS)\
1193 $($(target)_$(source)_UNPACKFLAGS)
1194
1195#$ (warning dbg: target=$(target) source=$(source) $(srcname)=$(srcname) tool=$(tool) out=$(out) flags=$(flags) dirdep=$(dirdep) inst=$(inst) md5=$(md5) size=$(size))
1196ifndef TOOL_$(tool)_UNPACK_CMDS
1197$(warning kBuild: tools: \
1198 1 $($(target)_$(source)_UNPACKTOOL)\
1199 2 $($(target)_$(srcname)_UNPACKTOOL)\
1200 3 $($(target)_$(source)_TOOL)\
1201 4 $($(target)_$(srcname)_TOOL)\
1202 5 $($(source)_UNPACKTOOL)\
1203 6 $($(srcname)_UNPACKTOOL)\
1204 7 $($(source)_TOOL)\
1205 8 $($(srcname)_TOOL)\
1206 9 $($(target)_UNPACKTOOL)\
1207 10 $($(target)_TOOL) \
1208 11 $(toupper $(subst tar.,TAR,$(ext $(srcname)))) \
1209 )
1210$(error kBuild: TOOL_$(tool)_UNPACK_CMDS is not defined. source=$(source) target=$(target) )
1211endif
1212
1213# call the tool
1214$(target)_$(srcname)_UNPACK_CMDS_ := $(TOOL_$(tool)_UNPACK_CMDS)
1215$(target)_$(srcname)_UNPACK_OUTPUT_ := $(TOOL_$(tool)_UNPACK_OUTPUT)
1216$(target)_$(srcname)_UNPACK_OUTPUT_MAYBE_ := $(TOOL_$(tool)_UNPACK_OUTPUT_MAYBE)
1217$(target)_$(srcname)_UNPACK_DEPEND_ := $(TOOL_$(tool)_UNPACK_DEPEND) $(deps)
1218$(target)_$(srcname)_UNPACK_DEPORD_ := $(TOOL_$(tool)_UNPACK_DEPORD) $(dirdep) $(orderdeps)
1219
1220# generate the fetch rule.
1221$(eval $(def_fetch_src_unpack_rule))
1222
1223_DIRS += $(inst) $(fetchdir)
1224
1225endef
1226
1227
1228##
1229# Define the target level rules for a fetch.
1230# @param target
1231# @param out
1232# @param inst
1233# @param _TARGET_$(target)_UNPACKED
1234# @param _TARGET_$(target)_DIGEST
1235# @param bld_trg
1236# @param bld_trg_arch
1237define def_fetch_rules
1238
1239$(out).lst: $(_TARGET_$(target)_UNPACKED) | $(call DIRDEP,$(inst))
1240 $$(call MSG_FETCH_OK,$(target))
1241 $$(QUIET)$$(RM) -f $$@ $$@.tmp
1242 $$(QUIET2)$$(APPEND) $$@.tmp "$(notdir $(out))"
1243 $$(QUIET)$(if $(_TARGET_$(target)_UNPACKED),$$(CAT_EXT) $(_TARGET_$(target)_UNPACKED) >> $$@.tmp)
1244 $$(QUIET)$$(MV) -f $$@.tmp $$@
1245
1246$(out)_unfetched:
1247 $$(call MSG_UNFETCH,$(target))
1248 $$(QUIET)$$(RM) -f $$(addprefix $(inst),$$(shell $$(CAT_EXT) $(out).lst 2> /dev/null | $$(SED) -e '/\/$$$$/d'))
1249 $$(QUIET)$$(RMDIR) -p --ignore-fail-on-non-empty --ignore-fail-on-not-exist $$(dir $$@) \
1250 $$(addprefix $(inst),$$(sort $$(dir $$(shell $$(CAT_EXT) $(out).lst 2> /dev/null))))
1251 $$(QUIET)$$(RM) -f $(out).lst $(out)
1252 $$(QUIET)$$(RMDIR) -p --ignore-fail-on-non-empty --ignore-fail-on-not-exist $$(dir $$@)
1253
1254$(out): $(comp-vars _TARGET_$(target)_DIGEST_PREV,_TARGET_$(target)_DIGEST,FORCE) | $(call DIRDEP,$(inst))
1255 $$(QUIET)$$(RM) -f $$@
1256 $$(if $$(_TARGET_$(target)_DIGEST),$$(if $$(wildcard $(out).lst)\
1257 ,$$(call MSG_REFETCH,$(target)),$$(call MSG_FETCH,$(target))),$$(call MSG_UNFETCH,$(target)))
1258 $$(QUIET)$$(if $$(wildcard $(out).lst ),$$(MAKE) -f $(MAKEFILE) --no-print-directory $(out)_unfetched)
1259 $$(QUIET)$$(if $$(_TARGET_$(target)_DIGEST),$$(MAKE) -f $(MAKEFILE) --no-print-directory $(out).lst,$$(RMDIR) -p --ignore-fail-on-non-empty --ignore-fail-on-not-exist $$(dir $$@))
1260 $$(QUIET2)$$(if $$(_TARGET_$(target)_DIGEST),$$(APPEND) $$@ "_TARGET_$(target)_DIGEST_PREV := $(_TARGET_$(target)_DIGEST)")
1261
1262.NOTPARALLEL: $(out).lst $(out)_unfetched $(out)
1263
1264endef
1265
1266
1267##
1268# Deal with one fetch target.
1269# @param target
1270# @param bld_trg
1271# @param bld_trg_arch
1272define def_fetch
1273# common
1274INSTARGET_$(target) := $($(target)_INST)
1275ifneq ($(patsubst %/,ok,$(INSTARGET_$(target))),ok)
1276$(error kBuild: Bad or missing INST property for target '$(target)'. \
1277 $(target)_INST='$($(target)_INST)' ($(origin $(target)_INST)))
1278endif
1279_TARGET_$(target)_FETCHED :=
1280_TARGET_$(target)_UNPACKED :=
1281_TARGET_$(target)_DIGEST :=
1282
1283# The 'sources'.
1284#$ (warning dbg fetch: target=$(target) sources=$($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TYPE)) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_TARGET_ARCH)) $($(target)_SOURCES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)))
1285$(foreach source,$($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TYPE)) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_TARGET_ARCH)) $($(target)_SOURCES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)),\
1286 $(eval $(value def_fetch_src)))
1287
1288# The target.
1289inst := $(INSTARGET_$(target))
1290out := $(inst)_kBuild_fetch_$(target)
1291
1292$(eval includedep $(out))
1293
1294$(eval $(def_fetch_rules))
1295
1296# Define the aliases here (doesn't work if defined in def_fetch_rules, just like includedep).
1297$(target): $(out)
1298$(target)_unfetch: $(out)_unfetched
1299
1300_FETCHES += $(out)
1301_DOWNLOADS += $(_TARGET_$(target)_FETCHED)
1302_UNPACKS += $(_TARGET_$(target)_UNPACKED)
1303_UNFETCHES += $(out)_unfetched
1304_DIRS += $(inst)
1305
1306endef
1307
1308# Walk the FETCH target lists.
1309bld_trg := $(BUILD_TARGET)
1310bld_trg_arch := $(BUILD_TARGET_ARCH)
1311$(foreach target, $(FETCHES) $(FETCHES.$(BUILD_TARGET)) $(FETCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
1312 $(eval $(value def_fetch)))
1313
1314# some aliases.
1315download: $(_DOWNLOADS)
1316unpack: $(_UNPACKS)
1317fetch: $(_FETCHES)
1318unfetch: $(_UNFETCHES)
1319
1320ifdef KBUILD_PROFILE_SELF
1321 _KBUILD_TS_NOW := $(nanots )
1322 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done fetching targets)
1323 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
1324endif
1325
1326
1327
1328##
1329## Patching.
1330##
1331##
1332#define def_patch_src
1333#
1334#endef
1335#
1336#
1337## Deal with one patch target.
1338#define def_patch
1339#
1340#$(foreach source,$($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TYPE)) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_TARGET_ARCH)) $($(target)_SOURCES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)),\
1341# $(eval $(value def_patch_src)))
1342#
1343#_PATCHES +=
1344#endef
1345#
1346#$(foreach target, $(PATCHES) $(PATCHES.$(BUILD_TARGET)) $(PATCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
1347# $(eval $(value def_patch)))
1348#
1349
1350
1351#
1352# Object processing.
1353#
1354
1355## wrapper the compile command dependency check.
1356ifndef NO_COMPILE_CMDS_DEPS
1357 _DEP_COMPILE_CMDS = $(comp-cmds $(target)_$(source)_CMDS_PREV_,$(target)_$(source)_CMDS_,FORCE)
1358else
1359 _DEP_COMPILE_CMDS =
1360endif
1361
1362## Generates the rules for building a specific object, and the aliases
1363# for building a source file.
1364# @param $(obj) The object file.
1365define def_target_source_rule
1366
1367ifdef TOOL_$(tool)_COMPILE_$(type)_USES_KOBJCACHE
1368$(outbase).koc +| $(obj) $($(target)_$(source)_OUTPUT_) $($(target)_$(source)_OUTPUT_MAYBE_) : \
1369 $($(target)_$(source)_DEPEND_) \
1370 $(_DEP_COMPILE_CMDS) \
1371 | \
1372 $($(target)_$(source)_DEPORD_)
1373 $$(call MSG_COMPILE,$(target),$(source),$$@,$(type))
1374else
1375$(obj) + $($(target)_$(source)_OUTPUT_) +| $($(target)_$(source)_OUTPUT_MAYBE_) : \
1376 $($(target)_$(source)_DEPEND_) \
1377 $(_DEP_COMPILE_CMDS) \
1378 | \
1379 $($(target)_$(source)_DEPORD_)
1380 $$(call MSG_COMPILE,$(target),$(source),$$@,$(type))
1381ifdef TOOL_$(tool)_COMPILE_$(type)_DONT_PURGE_OUTPUT
1382 $$(QUIET)$$(RM) -f $(dep) $(obj) $($(target)_$(source)_OUTPUT_) $($(target)_OUTPUT_MAYBE_)
1383endif
1384endif
1385
1386$($(target)_$(source)_CMDS_)
1387
1388ifndef NO_COMPILE_CMDS_DEPS
1389 $$(QUIET2)$$(APPEND) "$(dep)"
1390 $$(QUIET2)$$(APPEND) "$(dep)" 'define $(target)_$(source)_CMDS_PREV_'
1391ifeq ($(filter append-dash-n,$(KMK_FEATURES)),append-dash-n)
1392 $$(QUIET2)$$(APPEND) -v "$(dep)" '$(target)_$(source)_CMDS_'
1393else
1394 $$(QUIET2)$$(APPEND) "$(dep)" '$(subst $(NL),'$(NL)$(TAB)@$(APPEND) "$(dep)" ',$($(target)_$(source)_CMDS_))'
1395endif
1396 $$(QUIET2)$$(APPEND) "$(dep)" 'endef'
1397endif
1398
1399$(basename $(notdir $(obj))).o: $(obj)
1400$(basename $(notdir $(obj))).obj: $(obj)
1401endef
1402
1403
1404## wrapper the link command dependency check.
1405ifndef NO_COMPILE_CMDS_DEPS
1406 _DEP_LINK_CMDS = $(comp-cmds $(target)_CMDS_PREV_,$(target)_CMDS_,FORCE)
1407else
1408 _DEP_LINK_CMDS =
1409endif
1410
1411## Generate the link rule for a target.
1412# @param $(target) The normalized target name.
1413# @param $(dirdep) Directories we depend upon begin created before linking.
1414# @param $(dep) The name of the dependency file.
1415# @param $(out)
1416# @param $($(target)_OUTPUT_) Output files from the link.
1417# @param $($(target)_OUTPUT_MAYBE_) Output files that the link may perhaps create.
1418# @param $($(target)_DEPEND_) Dependencies.
1419# @param $($(target)_DEPORD_) Dependencies which should only affect build order.
1420# @param $($(target)_CMDS_) The link commands.
1421# @param $($(target)_CMDS_PREV_) The link commands from the previous run.
1422define def_link_rule
1423$(out) + $($(target)_OUTPUT_) +| $($(target)_OUTPUT_MAYBE_) : \
1424 $($(target)_DEPEND_) \
1425 $(_DEP_LINK_CMDS) \
1426 | \
1427 $($(target)_DEPORD_)
1428 $$(call MSG_LINK,$(target),$$@,$(tool_do))
1429 $$(QUIET)$$(RM) -f $(dep) $(out) $($(target)_OUTPUT_) $($(target)_OUTPUT_MAYBE_)
1430
1431$($(target)_CMDS_)
1432
1433ifndef NO_LINK_CMDS_DEPS
1434 $$(QUIET2)$$(APPEND) "$(dep)" 'define $(target)_CMDS_PREV_'
1435ifeq ($(filter append-dash-n,$(KMK_FEATURES)),append-dash-n)
1436 $$(QUIET2)$$(APPEND) -v "$(dep)" '$(target)_CMDS_'
1437else
1438 $$(QUIET2)$$(APPEND) "$(dep)" '$(subst $(NL),'$(NL)$(TAB)@$(APPEND) "$(dep)" ',$($(target)_CMDS_))'
1439endif
1440 $$(QUIET2)$$(APPEND) "$(dep)" 'endef'
1441endif
1442
1443$(basename $(notdir $(out))): $(out)
1444
1445endef
1446
1447
1448## Generate the link & lib install rule
1449# @param $(target) Normalized target name.
1450# @param $(out) The build target.
1451# @param $(INSTARGET_$(target)) The installation targets.
1452# @param $(mode) The file mode (optional)
1453define def_link_install_rule
1454$(INSTARGET_$(target)) : $(out) | $(call DIRDEP,$(dir $(INSTARGET_$(target))))
1455 $$(call MSG_INST_TRG,$(target),$(out),$$@)
1456 $$(QUIET)$$(INSTALL) $$(if $(mode),-m $(mode)) $(out) $$@
1457
1458ifdef KBUILD_DO_AUTO_INSTALL
1459$(basename $(notdir $(out))): $(INSTARGET_$(target))
1460endif
1461endef
1462
1463
1464## Generic macro for processing C, C++ and Assembly sources.
1465# @param $(target) Normalized target name.
1466# @param $(source) Source file name.
1467# @param $(type) Source type. {C,CXX,AS}
1468# @param bld_type Build type.
1469# @param bld_trg Build target.
1470# @param bld_trg_arch Build target arch.
1471# @param bld_trg_cpu Build target cpu.
1472def_target_source_c_cpp_asm_rc_new = $(kb-src-one )
1473ifdef KMK_VERSION
1474 def_target_source_c_cpp_asm_rc_var = def_target_source_c_cpp_asm_rc_new
1475else
1476 def_target_source_c_cpp_asm_rc_var = def_target_source_c_cpp_asm_rc_old
1477endif
1478
1479## Generic macro for processing all target sources.
1480# @param $(target) Normalized target name.
1481# @param $(defpath)
1482# @param much-more...
1483define def_target_sources
1484#$ (warning def_target_sources)
1485# C sources
1486type := C
1487$(foreach source, $(filter %.c , $($(target)_SOURCES) $($(target)_SOURCES.$(bld_trg)) $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg_cpu)) $($(target)_SOURCES.$(bld_type)))\
1488 ,$(eval $(value $(def_target_source_c_cpp_asm_rc_var))) )
1489
1490# C++ sources
1491type := CXX
1492$(foreach source, $(filter %.cpp %.cxx %.xx, $($(target)_SOURCES) $($(target)_SOURCES.$(bld_trg)) $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg_cpu)) $($(target)_SOURCES.$(bld_type)))\
1493 ,$(eval $(value $(def_target_source_c_cpp_asm_rc_var))) )
1494
1495# ASM sources
1496type := AS
1497$(foreach source, $(filter %.asm %.s %.S , $($(target)_SOURCES) $($(target)_SOURCES.$(bld_trg)) $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg_cpu)) $($(target)_SOURCES.$(bld_type)))\
1498 ,$(eval $(value $(def_target_source_c_cpp_asm_rc_var))) )
1499
1500# Resource sources
1501type := RC
1502$(foreach source, $(filter %.rc , $($(target)_SOURCES) $($(target)_SOURCES.$(bld_trg)) $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg_cpu)) $($(target)_SOURCES.$(bld_type)))\
1503 ,$(eval $(value $(def_target_source_c_cpp_asm_rc_var))) )
1504
1505endef
1506
1507
1508
1509## Generic macro for generating the install rule(s) for a target
1510# and update the globals with default out.
1511#
1512# @param $(target) Normalized target name.
1513# @param $(out) The output file.
1514# @param $(definst) The default _INST value.
1515# @param $(typevar) The name of the variable with all the root targets of its type.
1516# @remark Only library uses this now.
1517define def_target_install_pluss
1518ifndef $(target)_NOINST
1519INSTARGET_$(target) := $(patsubst %/,%/$(notdir $(out)), \
1520 $(if $($(target)_INST), $(addprefix $(PATH_INS)/,$($(target)_INST)), $(definst)/))
1521
1522$(eval $(def_link_install_rule))
1523
1524_INSTALLS_FILES += $(INSTARGET_$(target))
1525
1526ifdef KBUILD_DO_AUTO_INSTALL
1527$(typevar) += $(INSTARGET_$(target))
1528else
1529$(typevar) += $(out)
1530endif
1531else # _NOINST
1532$(typevar) += $(out)
1533endif
1534
1535_OUT_FILES += $($(target)_OUTPUT_) $($(target)_OUTPUT_MAYBE_) $(out)
1536_CLEAN_FILES += $($(target)_CLEAN) $($(target)_CLEAN.$(bld_trg)) $($(target)_CLEAN.$(bld_trg).$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_cpu)) $($(target)_CLEAN.$(bld_type))
1537_DIRS += $($(target)_BLDDIRS) $($(target)_BLDDIRS.$(bld_trg)) $($(target)_BLDDIRS.$(bld_trg).$(bld_trg_arch)) $($(target)_BLDDIRS.$(bld_trg_arch)) $($(target)_BLDDIRS.$(bld_trg_cpu)) $($(target)_BLDDIRS.$(bld_type))
1538_OBJS += $($(target)_OBJS_)
1539
1540endef
1541
1542
1543
1544#
1545# LIBRARIES
1546#
1547
1548## Library (one).
1549# @param $(target) Normalized library (target) name.
1550define def_lib
1551# library basics
1552## @todo prefix
1553bld_type := $(firstword $($(target)_BLD_TYPE) $(BUILD_TYPE))
1554bld_trg := $(firstword $($(target)_BLD_TRG) $(BUILD_TARGET))
1555bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(BUILD_TARGET_ARCH))
1556bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(BUILD_TARGET_CPU))
1557tool := $(call _TARGET_TOOL,$(target),AR)
1558ifeq ($(tool),)
1559$(error kBuild: Library target $(target) does not have a tool defined!)
1560endif
1561name := $(firstword\
1562 $($(target)_NAME.$(bld_trg).$(bld_trg_arch))\
1563 $($(target)_NAME.$(bld_trg_arch))\
1564 $($(target)_NAME.$(bld_trg))\
1565 $($(target)_NAME.$(bld_type))\
1566 $($(target)_NAME)\
1567 $(target))
1568outbase := $(call TARGET_BASE,$(name),$(target))
1569ifndef PATH_$(target)
1570 PATH_$(target) := $(patsubst %/,%,$(dir $(outbase)))
1571else
1572 ifneq ($(PATH_$(target)),$(patsubst %/,%,$(dir $(outbase))))
1573 $(error kBuild internal error: PATH_$(target)=$(PATH_$(target)) expected $(patsubst %/,%,$(dir $(outbase))))
1574 endif
1575endif
1576suff := $(firstword\
1577 $($(target)_LIBSUFF.$(bld_trg).$(bld_trg_arch))\
1578 $($(target)_LIBSUFF.$(bld_trg))\
1579 $($(target)_LIBSUFF)\
1580 $(TOOL_$(tool)_ARLIBSUFF.$(bld_trg).$(bld_trg_arch))\
1581 $(TOOL_$(tool)_ARLIBSUFF.$(bld_trg))\
1582 $(TOOL_$(tool)_ARLIBSUFF)\
1583 $(SUFF_LIB))
1584out := $(outbase)$(suff)
1585TARGET_$(target) := $(out)
1586$(target)_OBJS_ :=
1587defpath := $($(target)_PATH)
1588
1589# source -> object
1590$(eval $(value def_target_sources))
1591
1592# library linking
1593tool := $(call _TARGET_TOOL,$(target),AR)
1594name := $(firstword\
1595 $($(target)_NAME.$(bld_trg).$(bld_trg_arch))\
1596 $($(target)_NAME.$(bld_trg_arch))\
1597 $($(target)_NAME.$(bld_trg))\
1598 $($(target)_NAME.$(bld_type))\
1599 $($(target)_NAME)\
1600 $(target))
1601outbase := $(call TARGET_BASE,$(name),$(target))
1602flags :=\
1603 $(TOOL_$(tool)_ARFLAGS)\
1604 $(TOOL_$(tool)_ARFLAGS.$(bld_type))\
1605 $(ARFLAGS)\
1606 $(ARFLAGS.$(bld_type))\
1607 $($(target)_ARFLAGS)\
1608 $($(target)_ARFLAGS.$(bld_type)) \
1609 $($(target)_ARFLAGS.$(bld_trg)) \
1610 $($(target)_ARFLAGS.$(bld_trg_arch)) \
1611 $($(target)_ARFLAGS.$(bld_trg).$(bld_trg_arch)) \
1612 $($(target)_ARFLAGS.$(bld_trg_cpu))
1613othersrc := $(filter-out %.c %.cpp %.cxx %.cc %.s %.S %.asm %.o %.obj,\
1614 $($(target)_SOURCES) \
1615 $($(target)_SOURCES.$(bld_trg)) \
1616 $($(target)_SOURCES.$(bld_trg_arch)) \
1617 $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) \
1618 $($(target)_SOURCES.$(bld_trg_cpu)) \
1619 $($(target)_SOURCES.$(bld_type)))
1620objs = $(filter %.o %.obj, \
1621 $($(target)_SOURCES) \
1622 $($(target)_SOURCES.$(bld_trg)) \
1623 $($(target)_SOURCES.$(bld_trg_arch)) \
1624 $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) \
1625 $($(target)_SOURCES.$(bld_trg_cpu)) \
1626 $($(target)_SOURCES.$(bld_type))) \
1627 $($(target)_OBJS_)
1628dirdep := $(call DIRDEP,$(dir $(out)))
1629deps := $($(target)_DEPS)
1630orderdeps := $($(target)_ORDERDEPS)
1631
1632# Adjust paths if we got a default path.
1633ifneq ($(defpath),)
1634 objs := $(abspathex $(objs),$(defpath))
1635 deps := $(abspathex $(deps),$(defpath))
1636 orderdeps := $(abspathex $(orderdeps),$(defpath))
1637 othersrc := $(abspathex $(othersrc),$(defpath))
1638endif
1639
1640
1641# Custom pre-link actions.
1642ifdef $(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
1643 pre_cmds := $($(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
1644else ifdef $(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch)
1645 pre_cmds := $($(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch))
1646else ifdef $(target)_PRE_CMDS.$(bld_trg).$(bld_type)
1647 pre_cmds := $($(target)_PRE_CMDS.$(bld_trg).$(bld_type))
1648else ifdef $(target)_PRE_CMDS.$(bld_trg_arch)
1649 pre_cmds := $($(target)_PRE_CMDS.$(bld_trg_arch))
1650else ifdef $(target)_PRE_CMDS.$(bld_trg)
1651 pre_cmds := $($(target)_PRE_CMDS.$(bld_trg))
1652else ifdef $(target)_PRE_CMDS.$(bld_type)
1653 pre_cmds := $($(target)_PRE_CMDS.$(bld_type))
1654else ifdef $(target)_PRE_CMDS
1655 pre_cmds := $($(target)_PRE_CMDS)
1656else ifdef PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
1657 pre_cmds := $(PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
1658else ifdef PRE_CMDS.$(bld_trg).$(bld_trg_arch)
1659 pre_cmds := $(PRE_CMDS.$(bld_trg).$(bld_trg_arch))
1660else ifdef PRE_CMDS.$(bld_trg).$(bld_type)
1661 pre_cmds := $(PRE_CMDS.$(bld_trg).$(bld_type))
1662else ifdef PRE_CMDS.$(bld_trg_arch)
1663 pre_cmds := $(PRE_CMDS.$(bld_trg_arch))
1664else ifdef PRE_CMDS.$(bld_trg)
1665 pre_cmds := $(PRE_CMDS.$(bld_trg))
1666else ifdef PRE_CMDS.$(bld_type)
1667 pre_cmds := $(PRE_CMDS.$(bld_type))
1668else
1669 pre_cmds := $(PRE_CMDS)
1670endif
1671
1672# Custom post-link actions.
1673ifdef $(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
1674 post_cmds := $($(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
1675else ifdef $(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch)
1676 post_cmds := $($(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch))
1677else ifdef $(target)_POST_CMDS.$(bld_trg).$(bld_type)
1678 post_cmds := $($(target)_POST_CMDS.$(bld_trg).$(bld_type))
1679else ifdef $(target)_POST_CMDS.$(bld_trg_arch)
1680 post_cmds := $($(target)_POST_CMDS.$(bld_trg_arch))
1681else ifdef $(target)_POST_CMDS.$(bld_trg)
1682 post_cmds := $($(target)_POST_CMDS.$(bld_trg))
1683else ifdef $(target)_POST_CMDS.$(bld_type)
1684 post_cmds := $($(target)_POST_CMDS.$(bld_type))
1685else ifdef $(target)_POST_CMDS
1686 post_cmds := $($(target)_POST_CMDS)
1687else ifdef POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
1688 post_cmds := $(POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
1689else ifdef POST_CMDS.$(bld_trg).$(bld_trg_arch)
1690 post_cmds := $(POST_CMDS.$(bld_trg).$(bld_trg_arch))
1691else ifdef POST_CMDS.$(bld_trg).$(bld_type)
1692 post_cmds := $(POST_CMDS.$(bld_trg).$(bld_type))
1693else ifdef POST_CMDS.$(bld_trg_arch)
1694 post_cmds := $(POST_CMDS.$(bld_trg_arch))
1695else ifdef POST_CMDS.$(bld_trg)
1696 post_cmds := $(POST_CMDS.$(bld_trg))
1697else ifdef POST_CMDS.$(bld_type)
1698 post_cmds := $(POST_CMDS.$(bld_type))
1699else
1700 post_cmds := $(POST_CMDS)
1701endif
1702
1703# dependency file
1704dep := $(out)$(SUFF_DEP)
1705ifndef NO_LINK_CMDS_DEPS
1706 _DEPFILES_INCLUDED += $(dep)
1707 $(eval includedep $(dep))
1708endif
1709
1710# check that the tool is defined.
1711ifndef TOOL_$(tool)_LINK_LIBRARY_CMDS
1712$(warning kBuild: tools: \
1713 1 $($(target)_$(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
1714 2 $($(target)_$(source)TOOL.$(bld_trg)) \
1715 3 $($(target)_$(source)TOOL) \
1716 4 $($(target)_TOOL.$(bld_trg).$(bld_trg_arch)) \
1717 5 $($(target)_TOOL.$(bld_trg)) \
1718 6 $($(target)_TOOL) \
1719 7 $($(source)TOOL) \
1720 8 $($(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
1721 9 $($(source)TOOL.$(bld_trg)) \
1722 10 $(TOOL.$(bld_trg).$(bld_trg_arch)) \
1723 11 $(TOOL.$(bld_trg)) \
1724 12 $(TOOL) )
1725$(error kBuild: TOOL_$(tool)_LINK_LIBRARY_CMDS isn't defined! target=$(target) )
1726endif
1727
1728# call the tool
1729$(target)_CMDS_ := $(TOOL_$(tool)_LINK_LIBRARY_CMDS)
1730ifneq ($(pre_cmds),)
1731 $(target)_CMDS_ := $(TAB)$(pre_cmds)$(NL)$(TAB)$($(target)_CMDS_)
1732endif
1733ifneq ($(post_cmds),)
1734 $(target)_CMDS_ := $($(target)_CMDS_)$(NL)$(TAB)$(post_cmds)
1735endif
1736$(target)_OUTPUT_ := $(TOOL_$(tool)_LINK_LIBRARY_OUTPUT)
1737$(target)_OUTPUT_MAYBE_ := $(TOOL_$(tool)_LINK_LIBRARY_OUTPUT_MAYBE)
1738$(target)_DEPEND_ := $(TOOL_$(tool)_LINK_LIBRARY_DEPEND) $(deps) $(objs)
1739$(target)_DEPORD_ := $(TOOL_$(tool)_LINK_LIBRARY_DEPORD) $(dirdep) $(orderdeps)
1740
1741# generate the link rule.
1742$(eval $(def_link_rule))
1743
1744# installing and globals
1745$(eval $(value def_target_install_pluss))
1746endef
1747
1748# Process libraries
1749definst := $(PATH_LIB)
1750typevar := _LIBS
1751tool_do := LINK_LIBRARY
1752mode := 0644
1753$(foreach target, $(LIBRARIES) $(LIBRARIES.$(BUILD_TARGET)) $(LIBRARIES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), $(eval $(value def_lib)))
1754
1755ifdef KBUILD_PROFILE_SELF
1756 _KBUILD_TS_NOW := $(nanots )
1757 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done library targets)
1758 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
1759endif
1760
1761
1762#
1763# Link operations.
1764#
1765
1766##
1767# Link prolog
1768#
1769# @param $(target) Normalized target name.
1770# @param $(EXT) EXE,DLL,SYS.
1771# @param $(definst) The default _INST value.
1772# @param $(typevar) The name of the variable with all the root targets of its type.
1773define def_link_common
1774# basics
1775bld_type := $(firstword $($(target)_BLD_TYPE) $(BUILD_TYPE))
1776bld_trg := $(firstword $($(target)_BLD_TRG) $(BUILD_$(bld_trg_base_var)))
1777bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(BUILD_$(bld_trg_base_var)_ARCH))
1778bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(BUILD_$(bld_trg_base_var)_CPU))
1779
1780tool := $(call _TARGET_TOOL,$(target),LD)
1781name := $(firstword\
1782 $($(target)_NAME.$(bld_trg).$(bld_trg_arch))\
1783 $($(target)_NAME.$(bld_trg_arch))\
1784 $($(target)_NAME.$(bld_trg))\
1785 $($(target)_NAME.$(bld_type))\
1786 $($(target)_NAME)\
1787 $(target))
1788outbase := $(call TARGET_BASE,$(name),$(target))
1789ifndef PATH_$(target)
1790 PATH_$(target) := $(patsubst %/,%,$(dir $(outbase)))
1791else
1792 ifneq ($(PATH_$(target)),$(patsubst %/,%,$(dir $(outbase))))
1793 $(error kBuild internal error: PATH_$(target)=$(PATH_$(target)) expected $(patsubst %/,%,$(dir $(outbase))))
1794 endif
1795endif
1796suff := $(firstword \
1797 $($(target)_$(EXT)SUFF) \
1798 $($(target)_$(EXT)SUFF) \
1799 $(TOOL_$(tool)_LD$(EXT)SUFF) \
1800 $($(EXTPRE)SUFF_$(EXT)))
1801out := $(outbase)$(suff)
1802TARGET_$(target) := $(out)
1803$(target)_OBJS_ :=
1804defpath := $($(target)_PATH)
1805
1806# source -> object
1807$(eval $(value def_target_sources))
1808
1809# more link stuff.
1810tool := $(call _TARGET_TOOL,$(target),LD)
1811name := $(firstword\
1812 $($(target)_NAME.$(bld_trg).$(bld_trg_arch))\
1813 $($(target)_NAME.$(bld_trg_arch))\
1814 $($(target)_NAME.$(bld_trg))\
1815 $($(target)_NAME.$(bld_type))\
1816 $($(target)_NAME)\
1817 $(target))
1818outbase := $(call TARGET_BASE,$(name),$(target))
1819flags :=\
1820 $(TOOL_$(tool)_LDFLAGS)\
1821 $(TOOL_$(tool)_LDFLAGS.$(bld_type))\
1822 $(TOOL_$(tool)_LDFLAGS.$(bld_trg))\
1823 $(TOOL_$(tool)_LDFLAGS.$(bld_trg_arch))\
1824 $(TOOL_$(tool)_LDFLAGS.$(bld_trg).$(bld_trg_arch))\
1825 $(TOOL_$(tool)_LDFLAGS.$(bld_trg_cpu))\
1826 $(LDFLAGS)\
1827 $(LDFLAGS.$(bld_type))\
1828 $(LDFLAGS.$(bld_trg))\
1829 $(LDFLAGS.$(bld_trg_arch))\
1830 $(LDFLAGS.$(bld_trg).$(bld_trg_arch))\
1831 $(LDFLAGS.$(bld_trg_cpu))\
1832 $($(target)_LDFLAGS)\
1833 $($(target)_LDFLAGS.$(bld_type))\
1834 $($(target)_LDFLAGS.$(bld_trg))\
1835 $($(target)_LDFLAGS.$(bld_trg_arch))\
1836 $($(target)_LDFLAGS.$(bld_trg).$(bld_trg_arch))\
1837 $($(target)_LDFLAGS.$(bld_trg_cpu))
1838othersrc := $(filter-out %.c %.cpp %.cxx %.cc %.s %.S %.asm %.o %.obj,\
1839 $($(target)_SOURCES)\
1840 $($(target)_SOURCES.$(bld_trg)) \
1841 $($(target)_SOURCES.$(bld_trg_arch)) \
1842 $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) \
1843 $($(target)_SOURCES.$(bld_trg_cpu)) \
1844 $($(target)_SOURCES.$(bld_type)))
1845objs = $(filter %.o %.obj, \
1846 $($(target)_SOURCES) \
1847 $($(target)_SOURCES.$(bld_trg)) \
1848 $($(target)_SOURCES.$(bld_trg_arch)) \
1849 $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) \
1850 $($(target)_SOURCES.$(bld_trg_cpu)) \
1851 $($(target)_SOURCES.$(bld_type))) \
1852 $($(target)_OBJS_)
1853libs :=\
1854 $($(target)_LIBS.$(bld_trg_cpu))\
1855 $($(target)_LIBS.$(bld_trg).$(bld_trg_arch))\
1856 $($(target)_LIBS.$(bld_trg_arch))\
1857 $($(target)_LIBS.$(bld_trg))\
1858 $($(target)_LIBS.$(bld_type))\
1859 $($(target)_LIBS)\
1860 $(foreach sdk, $($(target)_SDKS.$(bld_trg).$(bld_trg_arch)) \
1861 $($(target)_SDKS.$(bld_trg_arch)) \
1862 $($(target)_SDKS.$(bld_trg)) \
1863 $($(target)_SDKS.$(bld_type)) \
1864 $($(target)_SDKS),\
1865 $(SDK_$(sdk)_LIBS.$(bld_trg_cpu))\
1866 $(SDK_$(sdk)_LIBS.$(bld_trg).$(bld_trg_arch))\
1867 $(SDK_$(sdk)_LIBS.$(bld_trg_arch))\
1868 $(SDK_$(sdk)_LIBS.$(bld_trg))\
1869 $(SDK_$(sdk)_LIBS.$(bld_type))\
1870 $(SDK_$(sdk)_LIBS))\
1871 $(LIBS.$(bld_trg_cpu))\
1872 $(LIBS.$(bld_trg).$(bld_trg_arch))\
1873 $(LIBS.$(bld_trg_arch))\
1874 $(LIBS.$(bld_trg))\
1875 $(LIBS.$(bld_type))\
1876 $(LIBS)\
1877 $(foreach sdk, $(SDKS.$(bld_trg).$(bld_trg_arch)) \
1878 $(SDKS.$(bld_trg_arch)) \
1879 $(SDKS.$(bld_trg)) \
1880 $(SDKS.$(bld_type)) \
1881 $(SDKS),\
1882 $(SDK_$(sdk)_LIBS.$(bld_trg_cpu))\
1883 $(SDK_$(sdk)_LIBS.$(bld_trg).$(bld_trg_arch))\
1884 $(SDK_$(sdk)_LIBS.$(bld_trg_arch))\
1885 $(SDK_$(sdk)_LIBS.$(bld_trg))\
1886 $(SDK_$(sdk)_LIBS.$(bld_type))\
1887 $(SDK_$(sdk)_LIBS))\
1888 $(TOOL_$(tool)_LIBS.$(bld_trg_cpu))\
1889 $(TOOL_$(tool)_LIBS.$(bld_trg).$(bld_trg_arch))\
1890 $(TOOL_$(tool)_LIBS.$(bld_trg_arch))\
1891 $(TOOL_$(tool)_LIBS.$(bld_trg))\
1892 $(TOOL_$(tool)_LIBS.$(bld_type))\
1893 $(TOOL_$(tool)_LIBS)
1894libpath :=\
1895 $($(target)_LIBPATH.$(bld_trg_cpu))\
1896 $($(target)_LIBPATH.$(bld_trg).$(bld_trg_arch))\
1897 $($(target)_LIBPATH.$(bld_trg_arch))\
1898 $($(target)_LIBPATH.$(bld_trg))\
1899 $($(target)_LIBPATH.$(bld_type))\
1900 $($(target)_LIBPATH)\
1901 $(foreach sdk, $($(target)_SDKS.$(bld_trg).$(bld_trg_arch)) \
1902 $($(target)_SDKS.$(bld_trg_arch)) \
1903 $($(target)_SDKS.$(bld_trg)) \
1904 $($(target)_SDKS.$(bld_type)) \
1905 $($(target)_SDKS),\
1906 $(SDK_$(sdk)_LIBPATH.$(bld_trg_cpu))\
1907 $(SDK_$(sdk)_LIBPATH.$(bld_trg).$(bld_trg_arch))\
1908 $(SDK_$(sdk)_LIBPATH.$(bld_trg_arch))\
1909 $(SDK_$(sdk)_LIBPATH.$(bld_trg))\
1910 $(SDK_$(sdk)_LIBPATH.$(bld_type))\
1911 $(SDK_$(sdk)_LIBPATH))\
1912 $(LIBPATH.$(bld_trg_cpu))\
1913 $(LIBPATH.$(bld_trg).$(bld_trg_arch))\
1914 $(LIBPATH.$(bld_trg_arch))\
1915 $(LIBPATH.$(bld_trg))\
1916 $(LIBPATH.$(bld_type))\
1917 $(LIBPATH)\
1918 $(foreach sdk, $(SDKS.$(bld_trg).$(bld_trg_arch)) \
1919 $(SDKS.$(bld_trg_arch)) \
1920 $(SDKS.$(bld_trg)) \
1921 $(SDKS.$(bld_type)) \
1922 $(SDKS),\
1923 $(SDK_$(sdk)_LIBPATH.$(bld_trg_cpu))\
1924 $(SDK_$(sdk)_LIBPATH.$(bld_trg).$(bld_trg_arch))\
1925 $(SDK_$(sdk)_LIBPATH.$(bld_trg_arch))\
1926 $(SDK_$(sdk)_LIBPATH.$(bld_trg))\
1927 $(SDK_$(sdk)_LIBPATH.$(bld_type))\
1928 $(SDK_$(sdk)_LIBPATH))\
1929 $(TOOL_$(tool)_LIBPATH.$(bld_trg_cpu))\
1930 $(TOOL_$(tool)_LIBPATH.$(bld_trg).$(bld_trg_arch))\
1931 $(TOOL_$(tool)_LIBPATH.$(bld_trg_arch))\
1932 $(TOOL_$(tool)_LIBPATH.$(bld_trg))\
1933 $(TOOL_$(tool)_LIBPATH.$(bld_type))\
1934 $(TOOL_$(tool)_LIBPATH)
1935dirdep := $(call DIRDEP,$(dir $(out)))
1936deps := $($(target)_DEPS)
1937orderdeps := $($(target)_ORDERDEPS)
1938
1939# Adjust paths if we got a default path.
1940ifneq ($(defpath),)
1941 libpath := $(abspathex $(libpath),$(defpath))
1942 objs := $(abspathex $(objs),$(defpath))
1943 deps := $(abspathex $(deps),$(defpath))
1944 orderdeps := $(abspathex $(orderdeps),$(defpath))
1945 othersrc := $(abspathex $(othersrc),$(defpath))
1946 # libs are not subject to this because of the the -l<lib> stuff. Use $(<target>_PATH)/lib if relative to current dir!
1947endif
1948
1949# Custom pre-link actions.
1950ifdef $(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
1951 pre_cmds := $($(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
1952else ifdef $(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch)
1953 pre_cmds := $($(target)_PRE_CMDS.$(bld_trg).$(bld_trg_arch))
1954else ifdef $(target)_PRE_CMDS.$(bld_trg).$(bld_type)
1955 pre_cmds := $($(target)_PRE_CMDS.$(bld_trg).$(bld_type))
1956else ifdef $(target)_PRE_CMDS.$(bld_trg_arch)
1957 pre_cmds := $($(target)_PRE_CMDS.$(bld_trg_arch))
1958else ifdef $(target)_PRE_CMDS.$(bld_trg)
1959 pre_cmds := $($(target)_PRE_CMDS.$(bld_trg))
1960else ifdef $(target)_PRE_CMDS.$(bld_type)
1961 pre_cmds := $($(target)_PRE_CMDS.$(bld_type))
1962else ifdef $(target)_PRE_CMDS
1963 pre_cmds := $($(target)_PRE_CMDS)
1964else ifdef PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
1965 pre_cmds := $(PRE_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
1966else ifdef PRE_CMDS.$(bld_trg).$(bld_trg_arch)
1967 pre_cmds := $(PRE_CMDS.$(bld_trg).$(bld_trg_arch))
1968else ifdef PRE_CMDS.$(bld_trg).$(bld_type)
1969 pre_cmds := $(PRE_CMDS.$(bld_trg).$(bld_type))
1970else ifdef PRE_CMDS.$(bld_trg_arch)
1971 pre_cmds := $(PRE_CMDS.$(bld_trg_arch))
1972else ifdef PRE_CMDS.$(bld_trg)
1973 pre_cmds := $(PRE_CMDS.$(bld_trg))
1974else ifdef PRE_CMDS.$(bld_type)
1975 pre_cmds := $(PRE_CMDS.$(bld_type))
1976else
1977 pre_cmds := $(PRE_CMDS)
1978endif
1979
1980# Custom post-link actions.
1981ifdef $(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
1982 post_cmds := $($(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
1983else ifdef $(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch)
1984 post_cmds := $($(target)_POST_CMDS.$(bld_trg).$(bld_trg_arch))
1985else ifdef $(target)_POST_CMDS.$(bld_trg).$(bld_type)
1986 post_cmds := $($(target)_POST_CMDS.$(bld_trg).$(bld_type))
1987else ifdef $(target)_POST_CMDS.$(bld_trg_arch)
1988 post_cmds := $($(target)_POST_CMDS.$(bld_trg_arch))
1989else ifdef $(target)_POST_CMDS.$(bld_trg)
1990 post_cmds := $($(target)_POST_CMDS.$(bld_trg))
1991else ifdef $(target)_POST_CMDS.$(bld_type)
1992 post_cmds := $($(target)_POST_CMDS.$(bld_type))
1993else ifdef $(target)_POST_CMDS
1994 post_cmds := $($(target)_POST_CMDS)
1995else ifdef POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type)
1996 post_cmds := $(POST_CMDS.$(bld_trg).$(bld_trg_arch).$(bld_type))
1997else ifdef POST_CMDS.$(bld_trg).$(bld_trg_arch)
1998 post_cmds := $(POST_CMDS.$(bld_trg).$(bld_trg_arch))
1999else ifdef POST_CMDS.$(bld_trg).$(bld_type)
2000 post_cmds := $(POST_CMDS.$(bld_trg).$(bld_type))
2001else ifdef POST_CMDS.$(bld_trg_arch)
2002 post_cmds := $(POST_CMDS.$(bld_trg_arch))
2003else ifdef POST_CMDS.$(bld_trg)
2004 post_cmds := $(POST_CMDS.$(bld_trg))
2005else ifdef POST_CMDS.$(bld_type)
2006 post_cmds := $(POST_CMDS.$(bld_type))
2007else
2008 post_cmds := $(POST_CMDS)
2009endif
2010
2011# installation targets
2012ifndef $(target)_NOINST
2013INSTARGET_$(target) := $(patsubst %/,%/$(notdir $(out)), \
2014 $(if $($(target)_INST), $(addprefix $(PATH_INS)/,$($(target)_INST)), $(definst)/))
2015ifdef KBUILD_DO_AUTO_INSTALL
2016$(typevar) += $(INSTARGET_$(target))
2017else
2018$(typevar) += $(out)
2019endif
2020# generate the install rule
2021$(eval $(def_link_install_rule))
2022
2023else # NOINST
2024INSTARGET_$(target) :=
2025$(typevar) += $(out)
2026endif # NOINST
2027
2028# dependency file
2029dep := $(outbase)$(SUFF_DEP)
2030ifndef NO_LINK_CMDS_DEPS
2031 _DEPFILES_INCLUDED += $(dep)
2032 $(eval includedep $(dep))
2033endif
2034
2035# check that the tool is defined.
2036ifndef TOOL_$(tool)_$(tool_do)_CMDS
2037$(warning kBuild: tools: \
2038 1 $($(target)_$(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
2039 2 $($(target)_$(source)TOOL.$(bld_trg)) \
2040 3 $($(target)_$(source)TOOL) \
2041 4 $($(target)_TOOL.$(bld_trg).$(bld_trg_arch)) \
2042 5 $($(target)_TOOL.$(bld_trg)) \
2043 6 $($(target)_TOOL) \
2044 7 $($(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
2045 8 $($(source)TOOL.$(bld_trg)) \
2046 9 $($(source)TOOL) \
2047 10 $(TOOL.$(bld_trg).$(bld_trg_arch)) \
2048 11 $(TOOL.$(bld_trg)) \
2049 12 $(TOOL) )
2050$(error kBuild: TOOL_$(tool)_$(tool_do)_CMDS isn't defined! target=$(target) )
2051endif
2052
2053# call the tool
2054$(target)_CMDS_ := $(TOOL_$(tool)_$(tool_do)_CMDS)
2055ifneq ($(pre_cmds),)
2056 $(target)_CMDS_ := $(TAB)$(pre_cmds)$(NL)$(TAB)$($(target)_CMDS_)
2057endif
2058ifneq ($(post_cmds),)
2059 $(target)_CMDS_ := $($(target)_CMDS_)$(NL)$(TAB)$(post_cmds)
2060endif
2061$(target)_OUTPUT_ := $(TOOL_$(tool)_$(tool_do)_OUTPUT)
2062$(target)_OUTPUT_MAYBE_ := $(TOOL_$(tool)_$(tool_do)_OUTPUT_MAYBE)
2063$(target)_DEPEND_ := $(TOOL_$(tool)_$(tool_do)_DEPEND) $(deps) $(objs)
2064$(target)_DEPORD_ := $(TOOL_$(tool)_$(tool_do)_DEPORD) $(dirdep) $(orderdeps)
2065
2066# generate the link rule.
2067$(eval $(def_link_rule))
2068
2069
2070# Update globals.
2071_OBJS += $($(target)_OBJS_)
2072_OUT_FILES += $($(target)_OUTPUT_) $(out)
2073_CLEAN_FILES += $($(target)_CLEAN) $($(target)_CLEAN.$(bld_trg)) $($(target)_CLEAN.$(bld_trg).$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_cpu)) $($(target)_CLEAN.$(bld_type))
2074_DIRS += $($(target)_BLDDIRS) $($(target)_BLDDIRS.$(bld_trg)) $($(target)_BLDDIRS.$(bld_trg).$(bld_trg_arch)) $($(target)_BLDDIRS.$(bld_trg_arch)) $($(target)_BLDDIRS.$(bld_trg_cpu)) $($(target)_BLDDIRS.$(bld_type))
2075_INSTALLS_FILES += $(INSTARGET_$(target))
2076
2077endef
2078
2079
2080#
2081# BLDPROGS
2082#
2083
2084## Build program (one).
2085# @param $(target) Normalized target (program) name.
2086define def_bldprog
2087
2088# set NOINST if not forced installation.
2089ifndef $(target)_INST
2090$(target)_NOINST := 1
2091endif
2092
2093# do the usual stuff.
2094$(eval $(value def_link_common))
2095
2096endef
2097
2098# Process build programs.
2099EXT := EXE
2100EXTPRE := HOST
2101tool_do := LINK_PROGRAM
2102definst := $(PATH_BIN)
2103typevar := _BLDPROGS
2104mode := 0755
2105bld_trg_base_var := PLATFORM
2106$(foreach target, $(BLDPROGS) $(BLDPROGS.$(BUILD_PLATFORM)) $(BLDPROGS.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH)), $(eval $(value def_bldprog)))
2107
2108ifdef KBUILD_PROFILE_SELF
2109 _KBUILD_TS_NOW := $(nanots )
2110 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done build program targets)
2111 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2112endif
2113
2114
2115#
2116# DLLS
2117#
2118
2119# Process dlls
2120EXT := DLL
2121EXTPRE :=
2122tool_do := LINK_DLL
2123definst := $(PATH_DLL)
2124typevar := _DLLS
2125mode := 0644
2126bld_trg_base_var := TARGET
2127$(foreach target, $(DLLS) $(DLLS.$(BUILD_TARGET)) $(DLLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), $(eval $(value def_link_common)))
2128
2129ifdef KBUILD_PROFILE_SELF
2130 _KBUILD_TS_NOW := $(nanots )
2131 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done dll targets)
2132 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2133endif
2134
2135
2136#
2137# IMPORT LIBRARIES
2138#
2139# - On OS/2 and windows these are libraries.
2140# - On other platforms they are fake DLLs.
2141#
2142EXTPRE :=
2143typevar := _IMPORT_LIBS
2144mode := 0644
2145bld_trg_base_var := TARGET
2146ifeq ($(filter-out nt os2 win win64 win32,$(BUILD_TARGET)),)
2147 EXT := LIB
2148 tool_do := LINK_LIBRARY
2149 definst := $(PATH_LIB)
2150 $(foreach target, $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)) $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), $(eval $(value def_lib)))
2151else
2152 EXT := DLL
2153 tool_do := LINK_DLL
2154 definst := $(PATH_DLL)
2155 $(foreach target, $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)) $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), $(eval $(value def_link_common)))
2156endif
2157
2158ifdef KBUILD_PROFILE_SELF
2159 _KBUILD_TS_NOW := $(nanots )
2160 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done import library targets)
2161 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2162endif
2163
2164
2165#
2166# PROGRAMS
2167#
2168
2169# Process programs
2170EXT := EXE
2171EXTPRE :=
2172tool_do := LINK_PROGRAM
2173definst := $(PATH_BIN)
2174typevar := _PROGRAMS
2175mode := 0755
2176bld_trg_base_var := TARGET
2177$(foreach target, $(PROGRAMS) $(PROGRAMS.$(BUILD_TARGET)) $(PROGRAMS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), $(eval $(value def_link_common)))
2178
2179ifdef KBUILD_PROFILE_SELF
2180 _KBUILD_TS_NOW := $(nanots )
2181 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done program targets)
2182 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2183endif
2184
2185
2186#
2187# SYSMODS
2188#
2189
2190# Process sysmods
2191EXT := SYS
2192EXTPRE :=
2193tool_do := LINK_SYSMOD
2194definst := $(PATH_SYS)
2195typevar := _SYSMODS
2196mode := 0644
2197bld_trg_base_var := TARGET
2198$(foreach target, $(SYSMODS) $(SYSMODS.$(BUILD_TARGET)) $(SYSMODS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), $(eval $(value def_link_common)))
2199
2200ifdef KBUILD_PROFILE_SELF
2201 _KBUILD_TS_NOW := $(nanots )
2202 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done sysmod targets)
2203 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2204endif
2205
2206
2207#
2208# OTHERS
2209#
2210_OTHERS = $(OTHERS) $(OTHERS.$(BUILD_TARGET)) $(OTHERS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))
2211
2212
2213#
2214# INSTALLS
2215#
2216
2217## generate the install rule
2218define def_install_src_rule
2219# the install rule
2220$(insdst) : $(srcsrc) | $(call DIRDEP,$(dir $(insdst)))
2221 $$(call MSG_INST_FILE,$(srcsrc),$(insdst))
2222 $$(QUIET)$(inscmd)
2223endef
2224
2225## install one file
2226define def_install_src
2227
2228# deal with '=>' in the source file name.
2229srcdst := $(subst =>, ,$(src))
2230srcsrc := $(firstword $(srcdst))
2231srcdstdir := $(dir $(word 2,$(srcdst)))
2232srcdst := $(word $(words $(srcdst)),$(srcdst))
2233
2234# _INSTFUN
2235ifdef $(srcsrc)_INSTFUN
2236 instfun := $(srcsrc)_INSTFUN
2237else
2238 ifdef $(target)_INSTFUN
2239 instfun := $(target)_INSTFUN
2240 else
2241 instfun := _INSTALL_FILE
2242 endif
2243endif
2244
2245# _INST
2246ifdef $(srcsrc)_INST
2247 inst := $(patsubst %/,%,$($(srcsrc)_INST))/$(dir $(srcdstdir))
2248else
2249 ifdef $(target)_INST
2250 inst := $(patsubst %/,%,$($(target)_INST))/$(dir $(srcdstdir))
2251 else
2252 inst := $(dir $(srcdstdir))
2253 endif
2254endif
2255
2256# calc target
2257insdst := $(call $(instfun),$(srcdst),$(target),$(inst),$(PATH_INS))
2258#$(warning instfun=$(instfun) srcdst=$(srcdst) target=$(target) inst=$(inst) => insdst=$(insdst))
2259
2260# mode, uid and gid
2261mode := $(firstword \
2262 $($(target)_$(srcsrc)_MODE.$(bld_trg).$(bld_trg_arch)) \
2263 $($(target)_$(srcsrc)_MODE.$(bld_trg)) \
2264 $($(target)_$(srcsrc)_MODE) \
2265 $($(target)_$(srcdst)_MODE.$(bld_trg).$(bld_trg_arch)) \
2266 $($(target)_$(srcdst)_MODE.$(bld_trg)) \
2267 $($(target)_$(srcdst)_MODE) \
2268 $($(srcsrc)_MODE.$(bld_trg).$(bld_trg_arch)) \
2269 $($(srcsrc)_MODE.$(bld_trg)) \
2270 $($(srcsrc)_MODE) \
2271 $($(srcdst)_MODE.$(bld_trg).$(bld_trg_arch)) \
2272 $($(srcdst)_MODE.$(bld_trg)) \
2273 $($(srcdst)_MODE) \
2274 $($(target)_MODE.$(bld_trg).$(bld_trg_arch)) \
2275 $($(target)_MODE.$(bld_trg)) \
2276 $($(target)_MODE))
2277uid := $(firstword \
2278 $($(target)_$(srcsrc)_UID.$(bld_trg).$(bld_trg_arch)) \
2279 $($(target)_$(srcsrc)_UID.$(bld_trg)) \
2280 $($(target)_$(srcsrc)_UID) \
2281 $($(target)_$(srcdst)_UID.$(bld_trg).$(bld_trg_arch)) \
2282 $($(target)_$(srcdst)_UID.$(bld_trg)) \
2283 $($(target)_$(srcdst)_UID) \
2284 $($(srcsrc)_UID.$(bld_trg).$(bld_trg_arch)) \
2285 $($(srcsrc)_UID.$(bld_trg)) \
2286 $($(srcsrc)_UID) \
2287 $($(srcdst)_UID.$(bld_trg).$(bld_trg_arch)) \
2288 $($(srcdst)_UID.$(bld_trg)) \
2289 $($(srcdst)_UID) \
2290 $($(target)_UID.$(bld_trg).$(bld_trg_arch)) \
2291 $($(target)_UID.$(bld_trg)) \
2292 $($(target)_UID))
2293gid := $(firstword \
2294 $($(target)_$(srcsrc)_GID.$(bld_trg).$(bld_trg_arch)) \
2295 $($(target)_$(srcsrc)_GID.$(bld_trg)) \
2296 $($(target)_$(srcsrc)_GID) \
2297 $($(target)_$(srcdst)_GID.$(bld_trg).$(bld_trg_arch)) \
2298 $($(target)_$(srcdst)_GID.$(bld_trg)) \
2299 $($(target)_$(srcdst)_GID) \
2300 $($(srcsrc)_GID.$(bld_trg).$(bld_trg_arch)) \
2301 $($(srcsrc)_GID.$(bld_trg)) \
2302 $($(srcsrc)_GID) \
2303 $($(srcdst)_GID.$(bld_trg).$(bld_trg_arch)) \
2304 $($(srcdst)_GID.$(bld_trg)) \
2305 $($(srcdst)_GID) \
2306 $($(target)_GID.$(bld_trg).$(bld_trg_arch)) \
2307 $($(target)_GID.$(bld_trg)) \
2308 $($(target)_GID))
2309flags := \
2310 $($(target)_IFFLAGS) \
2311 $($(target)_IFFLAGS.$(bld_trg)) \
2312 $($(target)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \
2313 $($(srcdst)_IFFLAGS) \
2314 $($(srcdst)_IFFLAGS.$(bld_trg)) \
2315 $($(srcdst)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \
2316 $($(srcsrc)_IFFLAGS) \
2317 $($(srcsrc)_IFFLAGS.$(bld_trg)) \
2318 $($(srcsrc)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \
2319 $($(target)_$(srcdst)_IFFLAGS) \
2320 $($(target)_$(srcdst)_IFFLAGS.$(bld_trg)) \
2321 $($(target)_$(srcdst)_IFFLAGS.$(bld_trg).$(bld_trg_arch)) \
2322 $($(target)_$(srcsrc)_IFFLAGS) \
2323 $($(target)_$(srcsrc)_IFFLAGS.$(bld_trg)) \
2324 $($(target)_$(srcsrc)_IFFLAGS.$(bld_trg).$(bld_trg_arch))
2325
2326
2327# Adjust the source if we got a default PATH. (This must be done this late!)
2328ifdef $(target)_PATH
2329 srcsrc := $(abspathex $(srcsrc),$($(target)_PATH))
2330endif
2331
2332# create the command
2333ifdef $(srcsrc)_INSTALLER
2334 inscmd := $(call $(srcsrc)_INSTALLER,$(srcsrc),$(insdst),$(target),$(flags))
2335else ifdef $(target)_INSTALLER
2336 inscmd := $(call $(target)_INSTALLER,$(srcsrc),$(insdst),$(target),$(flags))
2337else
2338 inscmd := $$(INSTALL)\
2339 $(if $(uid),-o $(uid))\
2340 $(if $(gid),-g $(gid))\
2341 $(if $(mode),-m $(mode))\
2342 $(flags)\
2343 $(srcsrc) $(insdst)
2344endif
2345
2346# generate the rule (need double evaluation here)
2347$(eval $(def_install_src_rule))
2348
2349INSTARGET_$(target) += $(insdst)
2350endef
2351
2352
2353## generate the symlink rule
2354define def_install_symlink_rule
2355# the install rule
2356$(insdst) : | $(call DIRDEP,$(dir $(insdst)))
2357 $$(call MSG_INST_SYM,$(insdst),$(symdst))
2358 $$(QUIET)$$(RM) -f $$@
2359 $$(QUIET)$$(LN_SYMLINK) $(symdst) $(insdst)
2360endef
2361
2362## create one symlink
2363define def_install_symlink
2364
2365# deal with '=>' in the source file name.
2366symdst := $(subst =>, ,$(src))
2367symlnk := $(firstword $(symdst))
2368symdst := $(word $(words $(symdst)),$(symdst))
2369
2370# _INSTFUN
2371ifdef $(symlnk)_INSTFUN
2372 instfun := $(symlnk)_INSTFUN
2373else ifdef $(target)_INSTFUN
2374 instfun := $(target)_INSTFUN
2375else
2376 instfun := _INSTALL_FILE
2377endif
2378
2379# _INST
2380ifdef $(symlnk)_INST
2381 inst := $(patsubst %/,%,$($(symlnk)_INST))/$(dir $(symlnk))
2382else ifdef $(target)_INST
2383 inst := $(patsubst %/,%,$($(target)_INST))/$(dir $(symlnk))
2384else
2385 inst := $(dir $(symlnk))
2386endif
2387
2388# calc target
2389insdst := $(call $(instfun),$(symlnk),$(target),$(inst),$(PATH_INS))
2390#$(warning symlnk=$(symlnk) symdst=$(symdst) insdst=$(insdst) instfun=$(instfun) inst='$(inst)')
2391
2392# generate the rule (need double evaluation here)
2393$(eval $(def_install_symlink_rule))
2394
2395INSTARGET_$(target) += $(insdst)
2396endef
2397
2398
2399## generate the install rule
2400define def_install_directory_rule
2401# the install rule
2402$(insdst):
2403 $$(call MSG_INST_DIR,$(insdst))
2404 $$(QUIET)$$(INSTALL) -d \
2405 $(if $(uid),-o $(uid))\
2406 $(if $(gid),-g $(gid))\
2407 $(if $(mode),-m $(mode))\
2408 $(flags)\
2409 $(insdst)
2410
2411.NOTPARALLEL: $(insdst)
2412endef
2413
2414
2415## create one directory
2416define def_install_directory
2417
2418# _INST
2419ifdef $(directory)_INST
2420 inst := $(PATH_INS)/$(patsubst %/,%,$($(directory)_INST))
2421else ifdef $(target)_INST
2422 inst := $(PATH_INS)/$(patsubst %/,%,$($(target)_INST))
2423else
2424 inst := $(PATH_INS)
2425endif
2426
2427mode := $(firstword \
2428 $($(target)_$(directory)_MODE.$(bld_trg).$(bld_trg_arch)) \
2429 $($(target)_$(directory)_MODE.$(bld_trg)) \
2430 $($(target)_$(directory)_MODE) \
2431 $($(directory)_MODE.$(bld_trg).$(bld_trg_arch)) \
2432 $($(directory)_MODE.$(bld_trg)) \
2433 $($(directory)_MODE) \
2434 $($(target)_MODE.$(bld_trg).$(bld_trg_arch)) \
2435 $($(target)_MODE.$(bld_trg)) \
2436 $($(target)_MODE))
2437uid := $(firstword \
2438 $($(target)_$(directory)_UID.$(bld_trg).$(bld_trg_arch)) \
2439 $($(target)_$(directory)_UID.$(bld_trg)) \
2440 $($(target)_$(directory)_UID) \
2441 $($(directory)_UID.$(bld_trg).$(bld_trg_arch)) \
2442 $($(directory)_UID.$(bld_trg)) \
2443 $($(directory)_UID) \
2444 $($(target)_UID.$(bld_trg).$(bld_trg_arch)) \
2445 $($(target)_UID.$(bld_trg)) \
2446 $($(target)_UID))
2447gid := $(firstword \
2448 $($(target)_$(directory)_GID.$(bld_trg).$(bld_trg_arch)) \
2449 $($(target)_$(directory)_GID.$(bld_trg)) \
2450 $($(target)_$(directory)_GID) \
2451 $($(directory)_GID.$(bld_trg).$(bld_trg_arch)) \
2452 $($(directory)_GID.$(bld_trg)) \
2453 $($(directory)_GID) \
2454 $($(target)_GID.$(bld_trg).$(bld_trg_arch)) \
2455 $($(target)_GID.$(bld_trg)) \
2456 $($(target)_GID))
2457flags := \
2458 $($(target)_IDFLAGS)\
2459 $($(target)_IDFLAGS.$(bld_trg)) \
2460 $($(target)_IDFLAGS.$(bld_trg).$(bld_trg_arch)) \
2461 $($(directory)_IDFLAGS) \
2462 $($(directory)_IDFLAGS.$(bld_trg)) \
2463 $($(directory)_IDFLAGS.$(bld_trg).$(bld_trg_arch)) \
2464 $($(target)_$(directory)_IDFLAGS) \
2465 $($(target)_$(directory)_IDFLAGS.$(bld_trg)) \
2466 $($(target)_$(directory)_IDFLAGS.$(bld_trg).$(bld_trg_arch))
2467
2468insdst := $(inst)/$(directory)/
2469#$(warning directory=$(directory) inst=$(inst) insdst=$(insdst) mode=$(mode) gid=$(gid) uid=$(uid))
2470
2471# generate the rule (need double evaluation here)
2472$(eval $(def_install_directory_rule))
2473
2474INSTARGET_DIRS_$(target) += $(insdst)
2475endef
2476
2477
2478## process one install target.
2479define def_install
2480# the basics.
2481bld_type := $(firstword $($(target)_BLD_TYPE) $(BUILD_TYPE))
2482bld_trg := $(firstword $($(target)_BLD_TRG) $(BUILD_TARGET))
2483bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(BUILD_TARGET_ARCH))
2484bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(BUILD_TARGET_CPU))
2485
2486INSTARGET_$(target) := $($(target)_GOALS)
2487INSTARGET_DIRS_$(target) :=
2488
2489$(foreach directory,$($(target)_DIRS) $($(target)_DIRS.$(bld_trg)) $($(target)_DIRS.$(bld_trg).$(bld_trg_arch)) $($(target)_DIRS.$(bld_trg_arch)) $($(target)_DIRS.$(bld_trg_cpu)) $($(target)_DIRS.$(bld_type)), \
2490 $(eval $(value def_install_directory)))
2491
2492$(foreach src,$($(target)_SOURCES) $($(target)_SOURCES.$(bld_trg)) $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg_arch)) $($(target)_SOURCES.$(bld_trg_cpu)) $($(target)_SOURCES.$(bld_type)), \
2493 $(eval $(value def_install_src)))
2494
2495$(foreach src,$($(target)_SYMLINKS) $($(target)_SYMLINKS.$(bld_trg)) $($(target)_SYMLINKS.$(bld_trg).$(bld_trg_arch)) $($(target)_SYMLINKS.$(bld_trg_arch)) $($(target)_SYMLINKS.$(bld_trg_cpu)) $($(target)_SYMLINKS.$(bld_type)), \
2496 $(eval $(value def_install_symlink)))
2497
2498# the collection target
2499TARGET_$(target) := $(PATH_TARGET)/$(target).ins
2500$(TARGET_$(target)): $(INSTARGET_$(target)) | $(INSTARGET_DIRS_$(target)) $(call DIRDEP,$(PATH_TARGET))
2501 @$(QUIET2)$(APPEND) $@
2502
2503$(target): $(TARGET_$(target))
2504
2505_INSTALLS += $(TARGET_$(target))
2506_INSTALLS_FILES += $(INSTARGET_$(target))
2507_INSTALLS_DIRS += $(INSTARGET_DIRS_$(target))
2508_CLEAN_FILES += $($(target)_CLEAN) $($(target)_CLEAN.$(bld_trg)) $($(target)_CLEAN.$(bld_trg).$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_arch)) $($(target)_CLEAN.$(bld_trg_cpu)) $($(target)_CLEAN.$(bld_type))
2509_DIRS += $($(target)_BLDDIRS) $($(target)_BLDDIRS.$(bld_trg)) $($(target)_BLDDIRS.$(bld_trg).$(bld_trg_arch)) $($(target)_BLDDIRS.$(bld_trg_arch)) $($(target)_BLDDIRS.$(bld_trg_cpu)) $($(target)_BLDDIRS.$(bld_type))
2510endef
2511
2512## process all install targets
2513$(foreach target, $(INSTALLS) $(INSTALLS.$(BUILD_TARGET)) $(INSTALLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
2514 $(eval $(value def_install)))
2515
2516ifdef KBUILD_PROFILE_SELF
2517 _KBUILD_TS_NOW := $(nanots )
2518 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done install targets)
2519 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2520endif
2521
2522
2523#
2524# PACKING
2525#
2526_PACKING += $(PACKING) $(PACKING.$(BUILD_TARGET)) $(PACKING.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))
2527
2528
2529#
2530# DOCS
2531#
2532
2533
2534#
2535# DIRECTORIES
2536#
2537_DIR_ALL := $(sort $(addsuffix /,$(patsubst %/,%,$(_DIRS))) $(dir $(_OUT_FILES) $(_OBJS) $(_INSTALLS_FILES)))
2538$(foreach directory,$(_INSTALLS_DIRS), $(eval _DIR_ALL := $(filter-out $(directory),$(_DIR_ALL))))
2539
2540
2541define def_mkdir_rule
2542$(directory):
2543 $$(call MSG_MKDIR,$$@)
2544 $$(QUIET)$$(MKDIR) -p $$@
2545endef
2546
2547$(foreach directory,$(_DIR_ALL),$(eval $(def_mkdir_rule)))
2548
2549ifdef KBUILD_PROFILE_SELF
2550 _KBUILD_TS_NOW := $(nanots )
2551 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done directories)
2552 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2553endif
2554
2555
2556#
2557# NOTHING
2558#
2559do-nothing:
2560ifdef KBUILD_PROFILE_SELF
2561 @$(ECHO) 'prof: $(int-sub $(nanots ), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(nanots ), $(_KBUILD_TS_PREV)) - executing $@'
2562endif
2563 $(call MSG_NOTHING)
2564
2565
2566#
2567# CLEAN UP
2568#
2569do-clean:
2570 $(call MSG_CLEAN)
2571 $(QUIET)$(RM) -f $(_OUT_FILES) $(_OBJS) $(_DEPFILES) $(_DEPFILES_INCLUDED) $(_CLEAN_FILES) $(OTHER_CLEAN)
2572 $(QUIET)$(RMDIR) -p --ignore-fail-on-non-empty --ignore-fail-on-not-exist $(rsort $(dir $(_OUT_FILES) $(_OBJS) $(_DEPFILES) $(_DEPFILES_INCLUDED) $(_CLEAN_FILES) $(OTHER_CLEAN)))
2573
2574
2575
2576#
2577# PASSES (including directory and makefile walking)
2578#
2579
2580## Subdir
2581# @param $(pass) Lowercase pass name.
2582# @param $(PASS) Uppercase pass name.
2583# @param $(subdir) Subdirectory
2584# @param $(tag) tag to attach to the rule name.
2585define def_pass_subdir
2586pass_$(pass)$(tag):: $(dep)
2587 + $$(QUIET)$$(MAKE) -C $(subdir) -f $$(notdir $$(firstword $$(wildcard $$(addprefix $(subdir)/,$$(DEFAULT_MAKEFILE))))) pass_$(pass)
2588endef
2589
2590## Submakefile
2591# @param $(pass) Lowercase pass name.
2592# @param $(PASS) Uppercase pass name.
2593# @param $(makefile) Makefile.
2594# @param $(tag) tag to attach to the rule name.
2595define def_pass_makefile
2596pass_$(pass)$(tag):: $(dep)
2597 + $$(QUIET)$$(MAKE) -C $(patsubst %/,%,$(dir $(makefile))) -f $(notdir $(makefile)) pass_$(pass)
2598endef
2599
2600## Execute a pass.
2601# @param $(pass) Lowercase pass name.
2602# @param $(PASS) Uppercase pass name.
2603define def_pass_old
2604$(eval SUBDIRS_$(PASS) ?= $(SUBDIRS) $(SUBDIRS.$(BUILD_TARGET)) $(SUBDIRS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
2605$(eval SUBDIRS_AFTER_$(PASS) ?= $(SUBDIRS_AFTER) $(SUBDIRS_AFTER.$(BUILD_TARGET)) $(SUBDIRS_AFTER.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
2606$(eval MAKEFILES_BEFORE_$(PASS) ?= $(MAKEFILES_BEFORE) $(MAKEFILES_BEFORE.$(BUILD_TARGET)) $(MAKEFILES_BEFORE.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
2607$(eval MAKEFILES_AFTER_$(PASS) ?= $(MAKEFILES_AFTER) $(MAKEFILES_AFTER.$(BUILD_TARGET)) $(MAKEFILES_AFTER.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
2608
2609$(eval tag:=_before)
2610$(eval dep:=)
2611$(foreach subdir,$(SUBDIRS_$(PASS)) $(SUBDIRS_$(PASS).$(BUILD_TARGET)) $(SUBDIRS_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))
2612$(foreach makefile,$(MAKEFILES_BEFORE_$(PASS)) $(MAKEFILES_BEFORE_$(PASS).$(BUILD_TARGET)) $(MAKEFILES_BEFORE_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)),$(eval $(def_pass_makefile)))
2613
2614$(eval tag:=_after)
2615$(eval dep:=pass_$(pass)_doit)
2616$(foreach subdir,$(SUBDIRS_AFTER_$(PASS)) $(SUBDIRS_AFTER_$(PASS).$(BUILD_TARGET)) $(SUBDIRS_AFTER_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))
2617$(foreach makefile,$(MAKEFILES_AFTER_$(PASS)) $(MAKEFILES_AFTER_$(PASS).$(BUILD_TARGET)) $(MAKEFILES_AFTER_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) ,$(eval $(def_pass_makefile)))
2618
2619.NOTPARALLEL: pass_$(pass)_before pass_$(pass)_after
2620.PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_doit pass_$(pass)_after
2621pass_$(pass)_doit: $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$(var))
2622pass_$(pass)_this: pass_$(pass)_before
2623 + $$(QUIET)$$(MAKE) -f $$(MAKEFILE) pass_$(pass)_doit
2624pass_$(pass)_after:: pass_$(pass)_this
2625pass_$(pass): pass_$(pass)_after
2626
2627endef
2628
2629define def_pass
2630$(eval SUBDIRS_$(PASS) ?= $(SUBDIRS) $(SUBDIRS.$(BUILD_TARGET)) $(SUBDIRS.$(BUILD_TARGET.$(BUILD_TARGET_ARCH))) )
2631$(eval SUBDIRS_AFTER_$(PASS) ?= $(SUBDIRS_AFTER) $(SUBDIRS_AFTER.$(BUILD_TARGET)) $(SUBDIRS_AFTER.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
2632$(eval MAKEFILES_BEFORE_$(PASS) ?= $(MAKEFILES_BEFORE) $(MAKEFILES_BEFORE.$(BUILD_TARGET)) $(MAKEFILES_BEFORE.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
2633$(eval MAKEFILES_AFTER_$(PASS) ?= $(MAKEFILES_AFTER) $(MAKEFILES_AFTER.$(BUILD_TARGET)) $(MAKEFILES_AFTER.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
2634
2635$(eval tag:=_before)
2636$(eval dep:=)
2637$(foreach subdir,$(SUBDIRS_$(PASS)) $(SUBDIRS_$(PASS).$(BUILD_TARGET)) $(SUBDIRS_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))
2638$(foreach makefile,$(MAKEFILES_BEFORE_$(PASS)) $(MAKEFILES_BEFORE_$(PASS).$(BUILD_TARGET)) $(MAKEFILES_BEFORE_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)),$(eval $(def_pass_makefile)))
2639
2640$(eval tag:=_after)
2641$(eval dep:=pass_$(pass)_doit)
2642$(foreach subdir,$(SUBDIRS_AFTER_$(PASS)) $(SUBDIRS_AFTER_$(PASS).$(BUILD_TARGET)) $(SUBDIRS_AFTER_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))
2643$(foreach makefile,$(MAKEFILES_AFTER_$(PASS)) $(MAKEFILES_AFTER_$(PASS).$(BUILD_TARGET)) $(MAKEFILES_AFTER_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) ,$(eval $(def_pass_makefile)))
2644
2645ifdef KBUILD_SAFE_PARALLEL
2646.NOTPARALLEL: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_this
2647.PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_this pass_$(pass)_doit
2648pass_$(pass)_doit: $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$(var))
2649pass_$(pass)_this: pass_$(pass)_before
2650 + $$(QUIET)$$(MAKE) -f $$(MAKEFILE) pass_$(pass)_doit
2651pass_$(pass)_after:: pass_$(pass)_this
2652pass_$(pass): pass_$(pass)_after
2653else
2654.NOTPARALLEL: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_doit
2655.PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_doit
2656pass_$(pass)_doit: pass_$(pass)_before \
2657 $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var)))
2658pass_$(pass): \
2659 pass_$(pass)_before \
2660 pass_$(pass)_doit \
2661 pass_$(pass)_after
2662endif
2663
2664#$ (warning pass=$(pass) PASS=$(PASS): $(PASS_$(PASS)_trgs) $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var))))
2665endef
2666
2667# Generate the defined passes.
2668$(foreach PASS, $(PASSES), \
2669 $(eval pass := $(PASS_$(PASS)_pass)) \
2670 $(eval $(def_pass)))
2671
2672## Pass order
2673# @param $(pass) Current pass name.
2674# @param $(prev_pass) The previous pass name.
2675define def_pass_order
2676ifdef KBUILD_SAFE_PARALLEL
2677.NOTPARALLEL: pass_$(pass)_order
2678.PHONY: pass_$(pass)_order
2679pass_$(pass)_order: $(pass_prev)
2680 $$(call MSG_PASS,$$(if $$(PASS_$(PASS)),$$(PASS_$(PASS)),$(pass)))
2681 + $$(QUIET)$$(MAKE) -f $$(MAKEFILE) pass_$(pass)
2682else
2683.NOTPARALLEL: pass_$(pass)_order pass_$(pass)_banner
2684.PHONY: pass_$(pass)_order pass_$(pass)_banner
2685pass_$(pass)_banner:
2686 $$(call MSG_PASS,$$(if $$(PASS_$(PASS)),$$(PASS_$(PASS)),$(pass)))
2687pass_$(pass)_order: \
2688 $(pass_prev) \
2689 pass_$(pass)_banner \
2690 pass_$(pass)
2691endif
2692$(eval pass_prev := pass_$(pass)_order)
2693endef
2694
2695## PASS: order
2696# Use dependencies to ensure correct pass order.
2697pass_prev :=
2698$(foreach PASS,$(DEFAULT_PASSES),\
2699 $(eval pass := $(PASS_$(PASS)_pass)) \
2700 $(eval $(def_pass_order)))
2701
2702ifdef KBUILD_PROFILE_SELF
2703 _KBUILD_TS_NOW := $(nanots )
2704 $(info prof: $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_NOW), $(_KBUILD_TS_PREV)) - done passes)
2705 _KBUILD_TS_PREV := $(_KBUILD_TS_NOW)
2706endif
2707
2708
2709#
2710# THE MAIN RULES
2711#
2712all_recursive: $(pass_prev)
2713
2714rebuild: clean
2715 + $(MAKE) -f $(firstword $(MAKEFILE_LIST)) all_recursive
2716
2717# @todo make this a non-default pass!
2718uninstall:
2719 $(RM) -f $(_INSTALLS_FILES)
2720
2721install: pass_installs
2722
2723# misc shortcuts.
2724targets: bldprogs libraries dlls programs sysmods others installs
2725objects: $(_OBJS)
2726bldprogs: $(_BLDPROGS)
2727libraries: $(_LIBS) $(_IMPORT_LIBS) $(_OTHER_LIBRARIES)
2728dlls: $(_DLLS)
2729programs: $(_PROGRAMS)
2730sysmods: $(_SYSMODS)
2731others: $(_OTHERS)
2732installs: $(_INSTALLS) $(_INSTALLS_DIRS) $(_INSTALLS_FILES)
2733
2734
2735
2736#
2737# kBuild debugging stuff.
2738#
2739show_targets:
2740 @$(foreach target, $(_ALL_TARGETS),\
2741 @$(ECHO) "target: $(target)" $(NLTAB)\
2742 @$(ECHO) " PATH_$(target)=$(PATH_$(target))" $(NLTAB)\
2743 @$(ECHO) " TARGET_$(target)=$(TARGET_$(target))" $(NLTAB)\
2744 @$(ECHO) " INSTARGET_$(target)=$(INSTARGET_$(target))" $(NLTAB)\
2745$(foreach prop,$(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) OBJS_ CLEAN, \
2746 $(eval _tmp:=$(firstword $($(target)_BLD_TRG) $(BUILD_TARGET))) \
2747 $(if $($(target)_$(prop).$(_tmp)),\
2748 @$(ECHO) " $(target)_$(prop).$(_tmp)=$($(target)_$(prop).$(_tmp))" $(NLTAB)) \
2749 $(if $($(target)_$(prop)), $(NLTAB)@$(ECHO) " $(target)_$(prop)=$($(target)_$(prop))" $(NLTAB)) \
2750)\
2751$(foreach prop,$(PROPS_DEFERRED), \
2752 $(eval _tmp:=$(firstword $($(target)_BLD_TRG) $(BUILD_TARGET))) \
2753 $(if $(value $(target)_$(prop).$(_tmp)),\
2754 @$(ECHO) ' $(target)_$(prop).$(_tmp)=$(value $(TARGET)_$(prop).$(_tmp))' $(NLTAB)) \
2755 $(if $(value $(target)_$(prop)), $(NLTAB)@$(ECHO) ' $(target)_$(prop)=$(value $(target)_$(prop))' $(NLTAB)) \
2756))
2757
2758
2759
2760#
2761# Include dependency files.
2762#
2763ifneq ($(_DEPFILES),)
2764 includedep $(_DEPFILES)
2765endif
2766
2767
2768ifdef KBUILD_PROFILE_SELF
2769 _KBUILD_TS_FOOTER_END := $(nanots )
2770 $(info prof: $(int-sub $(_KBUILD_TS_FOOTER_END), $(_KBUILD_TS_HEADER_START)) - $(int-sub $(_KBUILD_TS_FOOTER_END), $(_KBUILD_TS_PREV)) - end of footer.kmk)
2771 $(info prof: footer.kmk: $(int-sub $(_KBUILD_TS_FOOTER_END), $(_KBUILD_TS_FOOTER_START)))
2772 _KBUILD_TS_PREV := $(_KBUILD_TS_FOOTER_END)
2773endif
2774
2775# end-of-file-content
2776__footer_kmk__ := target
2777endif # __footer_kmk__
2778
Note: See TracBrowser for help on using the repository browser.