source: trunk/kBuild/footer.kmk@ 660

Last change on this file since 660 was 660, checked in by bird, 19 years ago

Target properties has precedence over template properties. Grouped accumulative props by where the 'most significan item' is and target <- template inheritance respect this. Fixes #11.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 83.6 KB
RevLine 
[72]1# $Id: footer.kmk 660 2006-12-05 14:36:19Z bird $
2## @file
3#
4# kBuild - File included at top of makefile.
5#
[640]6# Copyright (c) 2004-2006 knut st. osmundsen <bird-srcspam@anduin.net>
[72]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
[106]13# the Free Software Foundation; either version source of the License, or
[72]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
[353]23# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
[72]24#
25#
26
27ifndef __footer_kmk__
28# start-of-file-content
29
30#
[530]31# Make sure that the core variables we defined in recursive expansion mode
32# up in header.kmk get expanded before we really start using them. The kBuild
33# functions added to kmk to speed stuff up assumes that the variables are
34# expanded here.
35#
36PATH_OBJ := $(PATH_OBJ)
37PATH_TARGET := $(PATH_TARGET)
38PATH_INS := $(PATH_INS)
39PATH_BIN := $(PATH_BIN)
40PATH_DLL := $(PATH_DLL)
41PATH_SYS := $(PATH_SYS)
42PATH_LIB := $(PATH_LIB)
43PATH_DOC := $(PATH_DOC)
44
45#
[72]46# Variables.
[73]47# (Some of these need initialization before including definitions using them.)
[72]48#
49
50# all targets.
[353]51ALL_TARGETS += \
[640]52 $(FETCHES) $(FETCHES.$(BUILD_TARGET)) $(FETCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
53 $(PATCHES) $(PATCHES.$(BUILD_TARGET)) $(PATCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
[481]54 $(BLDPROGS) $(BLDPROGS.$(BUILD_PLATFORM)) $(BLDPROGS.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH)) \
55 $(LIBRARIES) $(LIBRARIES.$(BUILD_TARGET)) $(LIBRARIES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
56 $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)) $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
57 $(DLLS) $(DLLS.$(BUILD_TARGET)) $(DLLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
58 $(PROGRAMS) $(PROGRAMS.$(BUILD_TARGET)) $(PROGRAMS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
59 $(SYSMODS) $(SYSMODS.$(BUILD_TARGET)) $(SYSMODS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
60 $(INSTALLS) $(INSTALLS.$(BUILD_TARGET)) $(INSTALLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
61 $(OTHERS) $(OTHERS.$(BUILD_TARGET)) $(OTHERS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))
[72]62
[447]63# all $(BUILD_TARGET) targets.
64_ALL_BUILD_TARGET_TARGETS += \
[640]65 $(FETCHES) $(FETCHES.$(BUILD_TARGET)) $(FETCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
66 $(PATCHES) $(PATCHES.$(BUILD_TARGET)) $(PATCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
[482]67 $(LIBRARIES) $(LIBRARIES.$(BUILD_TARGET)) $(LIBRARIES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
[481]68 $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)) $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
[482]69 $(DLLS) $(DLLS.$(BUILD_TARGET)) $(DLLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
70 $(PROGRAMS) $(PROGRAMS.$(BUILD_TARGET)) $(PROGRAMS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
71 $(SYSMODS) $(SYSMODS.$(BUILD_TARGET)) $(SYSMODS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
72 $(INSTALLS) $(INSTALLS.$(BUILD_TARGET)) $(INSTALLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
73 $(OTHERS) $(OTHERS.$(BUILD_TARGET)) $(OTHERS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))
[447]74
75# all $(BUILD_TARGET) targets.
76_ALL_BUILD_PLATFORM_TARGETS += \
[481]77 $(BLDPROGS) $(BLDPROGS.$(BUILD_PLATFORM)) $(BLDPROGS.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH))
[447]78
[640]79# all targets making use of srcname.
80_ALL_SRCNAME_TARGETS += \
81 $(FETCHES) $(FETCHES.$(BUILD_TARGET)) $(FETCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
82 $(PATCHES) $(PATCHES.$(BUILD_TARGET)) $(PATCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))
83
[75]84# dependency files.
85_DEPFILES :=
86
[380]87# included dependency files.
88_DEPFILES_INCLUDED :=
89
90
[75]91# All kind of output files except for _OBJS and _DEPFILES.
92# Compiling or linking definition outputting other things that $@ and any
93# required dependency file must add those output files to this variable.
94_OUT_FILES :=
95
[353]96# Files which only requires cleaning up.
97_CLEAN_FILES :=
98
[72]99# all of a type
[219]100_OBJS :=
[640]101_FETCHES :=
102_DOWNLOADS:=
103_UNPACKS :=
104_PATCHES :=
[222]105_BLDPROGS :=
[219]106_LIBS :=
107_DLLS :=
108_PROGRAMS :=
109_SYSMODS :=
[353]110_INSTALLS :=
[380]111_INSTALLS_DIRS :=
[353]112_OTHERS :=
[417]113_PACKING :=
[380]114_DIRS := $(PATH_TARGET)/ $(PATH_TARGET)
[189]115_IMPORT_LIBS :=
[72]116
[220]117# misc
118pass_prev :=
119
120
[72]121#
[73]122# Basic macros
123#
124
125## Figure out the tool for a source
[481]126# @param target source file
127# @param source normalized main target
128# @param type tooltype
[222]129# @param bld_trg build target.
[481]130# @param bld_trg_arch build target architecture.
[552]131# @remark Obsoleted by kBuild helpers in kmk. Only required for gmake compatbility.
[79]132_SOURCE_TOOL = $(strip $(firstword \
[481]133 $($(target)_$(source)_$(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
[222]134 $($(target)_$(source)_$(type)TOOL.$(bld_trg)) \
[106]135 $($(target)_$(source)_$(type)TOOL) \
[481]136 $($(target)_$(source)_TOOL.$(bld_trg).$(bld_trg_arch)) \
[222]137 $($(target)_$(source)_TOOL.$(bld_trg)) \
[106]138 $($(target)_$(source)_TOOL) \
[530]139 $($(source)_$(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
140 $($(source)_$(type)TOOL.$(bld_trg)) \
141 $($(source)_$(type)TOOL) \
142 $($(source)_TOOL.$(bld_trg).$(bld_trg_arch)) \
143 $($(source)_TOOL.$(bld_trg)) \
144 $($(source)_TOOL) \
[481]145 $($(target)_$(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
[222]146 $($(target)_$(type)TOOL.$(bld_trg)) \
[106]147 $($(target)_$(type)TOOL) \
[481]148 $($(target)_TOOL.$(bld_trg).$(bld_trg_arch)) \
[222]149 $($(target)_TOOL.$(bld_trg)) \
[106]150 $($(target)_TOOL) \
[481]151 $($(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
[222]152 $($(type)TOOL.$(bld_trg)) \
[106]153 $($(type)TOOL) \
[481]154 $(TOOL.$(bld_trg).$(bld_trg_arch)) \
[222]155 $(TOOL.$(bld_trg)) \
[106]156 $(TOOL) ))
[73]157
[78]158## Figure out the tool for a target.
[481]159# @param target normalized target.
160# @param source tooltype.
[222]161# @param bld_trg build target.
[481]162# @param bld_trg_arch build target architecture.
[79]163_TARGET_TOOL = $(strip $(firstword \
[481]164 $($(target)_$(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
[222]165 $($(target)_$(source)TOOL.$(bld_trg)) \
[106]166 $($(target)_$(source)TOOL) \
[481]167 $($(target)_TOOL.$(bld_trg).$(bld_trg_arch)) \
[222]168 $($(target)_TOOL.$(bld_trg)) \
[106]169 $($(target)_TOOL) \
[481]170 $($(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
[238]171 $($(source)TOOL.$(bld_trg)) \
[106]172 $($(source)TOOL) \
[481]173 $(TOOL.$(bld_trg).$(bld_trg_arch)) \
[222]174 $(TOOL.$(bld_trg)) \
[106]175 $(TOOL) \
[79]176 ))
[183]177
[148]178## Removes the drive letter from a path (if it has one)
179# @param $1 the path
180no-drive=$(word $(words $(subst :, ,$(1))),$(subst :, ,$(1)))
[78]181
[148]182## Removes the root slash from a path (if it has one)
183# @param $1 the path
184no-root-slash=$(patsubst /%,%,$(1))
185
[73]186## Figure out where to put object files.
[110]187# @param $1 source file
188# @param $2 normalized main target
[316]189# @remark There are two major hacks here:
190# 1. Source files in the output directory are translated into a gen/ subdir.
[472]191# 2. Catch anyone specifying $(PATH_SUB_CURRENT)/sourcefile.c.
[552]192# @remark obsoleted by kBuild helpers in kmk. Only required for gmake compatbility.
[316]193_OBJECT_BASE = $(PATH_TARGET)/$(2)/$(call no-root-slash,$(call no-drive,$(basename \
[472]194 $(patsubst $(PATH_ROOT)/%,%,$(patsubst $(PATH_SUB_CURRENT)/%,%,$(patsubst $(PATH_TARGET)/$(2)/%,gen/%,$(1)))))))
[73]195
196## Figure out where to put object files.
[110]197# @param $1 real target name.
198# @param $2 normalized main target
[148]199_TARGET_BASE = $(PATH_TARGET)/$(2)/$(call no-root-slash,$(call no-drive,$(basename $(1))))
[73]200
201
[353]202## Figure out the actual name of an installed file.
203# @param $1 The file to install.
204# @param $2 The target name.
205# @param $3 The _INST value (can be empty).
206# @param $4 The default directory to use when $3 is empty.
207_INSTALL_FILE = $(patsubst %/,%/$(notdir $(1)),$(if $(3),$(PATH_INS)/$(3),$(4)/))
208
209
[73]210#
[185]211# Check syntax which leads to weird syntax errors.
212#
213
214## Check
215# @param $(target) Target name.
216define def_check_target
217ifneq ("$($(target)_TEMPLATE)","$(strip $($(target)_TEMPLATE))")
218$$(error $(target) have an incorrect template name. Remove any tabs!)
219endif
220endef
221$(foreach target, $(ALL_TARGETS),$(eval $(def_check_target)))
222
223
224#
[72]225# Include templates
226#
227_TEMPLATES := $(TEMPLATE)
228define def_templates
229ifdef $(target)_TEMPLATE
230_TEMPLATES += $($(target)_TEMPLATE)
231endif
232endef
233$(foreach target, $(ALL_TARGETS), $(eval $(def_templates)))
234_TEMPLATES := $(sort $(_TEMPLATES))
235# $ (warning dbg: _TEMPLATES=$(_TEMPLATES))
236
237define def_templates_include
238ifndef TEMPLATE_$(template)
[353]239include $(firstword $(foreach path, $(TEMPLATE_PATHS) $(PATH_KBUILD)/templates/, $(wildcard $(path)/$(template).kmk)))
[72]240endif
241endef
242$(foreach template, $(_TEMPLATES), $(eval $(def_templates)))
243
[74]244
[72]245#
[412]246# Template Inheritance.
247#
248define def_template_extends_prop
249ifndef TEMPLATE_$(template)_$(prop)
[552]250 ifdef TEMPLATE_$(parent)_$(prop)
[412]251TEMPLATE_$(template)_$(prop) = $$(TEMPLATE_$(parent)_$(prop))
[552]252 endif
[412]253endif
254endef
255
[552]256
[412]257define def_template_extends
258ifdef TEMPLATE_$(template)_EXTENDS
[552]259 ifndef TEMPLATE_$(template)_EXTENDS_STATUS_
260 TEMPLATE_$(template)_EXTENDS_STATUS_ := 0
261 parent := $(strip $(TEMPLATE_$(template)_EXTENDS))
[412]262
[552]263 # recursivly process the parent if it's inherting from somebody too.
264 ifdef TEMPLATE_$(parent)_EXTENDS
[594]265 ifneq ($(TEMPLATE_$(parent)_EXTENDS_STATUS_),42)
[552]266 # foreach will create 'template' in a new variable context hiding our current variable.
[594]267 $(foreach template, $(parent), $(eval $(value def_template_extends)))
[552]268 parent := $(strip $(TEMPLATE_$(template)_EXTENDS))
269 endif
270 endif
271
272 # inherit properties.
[660]273 $(foreach prop, $(PROPS_SINGLE) $(PROPS_ACCUMULATE_R) $(PROPS_ACCUMULATE_L) $(PROPS_DEFERRED)\
274 $(addsuffix .$(BUILD_TARGET), $(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) $(PROPS_DEFERRED))\
275 $(addsuffix .$(BUILD_TARGET).$(BUILD_TARGET_ARCH), $(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) $(PROPS_DEFERRED))\
276 $(addsuffix .$(BUILD_TARGET_ARCH), $(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) $(PROPS_DEFERRED))\
277 $(addsuffix .$(BUILD_TARGET_CPU), $(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) $(PROPS_DEFERRED))\
278 $(addsuffix .$(BUILD_TYPE), $(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) $(PROPS_DEFERRED))\
[594]279 ,$(eval $(def_template_extends_prop))) # exploits the 2 evaluation, so no value!
[552]280
281 TEMPLATE_$(template)_EXTENDS_STATUS_ := 42
282 else
283 # protect against inheritance loops.
284 ifneq ($(TEMPLATE_$(template)_EXTENDS_STATUS_),42)
285 $(error kBuild: inheritance loop! template=$(template))
286 endif
287 endif
[412]288endif
289endef
290
291# $ (foreach template, $(_TEMPLATES), $(if TEMPLATE_$(template)_EXTENDS, $(eval $(value def_template_extends))))
292$(foreach template, $(_TEMPLATES), $(eval $(value def_template_extends)))
293
294
295#
[72]296# Common Inheritance
297#
298
[353]299## Inherit one template property in a non-accumulative manner.
[72]300# @param $(prop) Property name
301# @param $(target) Target name
[78]302# @todo fix the precedence order for some properties.
[72]303define def_inherit_template_one
[78]304ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
[72]305ifndef $(target)_$(prop)
[353]306$(target)_$(prop) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop))
307#$ (warning dbgtarget: $(target)_$(prop):='$(value $(target)_$(prop))' TEMPLATE_$($(target)_TEMPLATE)_$(prop))
[72]308endif
309endif
[447]310ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
311ifndef $(target)_$(prop).$(bld_trg)
312#$ (warning dbgsource: $(target)_$(prop).$(bld_trg)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
313$(target)_$(prop).$(bld_trg) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
[79]314endif
315endif
[481]316ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)
317ifndef $(target)_$(prop).$(bld_trg).$(bld_trg_arch)
318#$ (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))
319$(target)_$(prop).$(bld_trg).$(bld_trg_arch) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
320endif
321endif
[455]322ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
323ifndef $(target)_$(prop).$(bld_trg_arch)
324#$ (warning dbgsource: $(target)_$(prop).$(bld_trg_arch)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
325$(target)_$(prop).$(bld_trg_arch) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
326endif
327endif
328ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
329ifndef $(target)_$(prop).$(bld_trg_cpu)
330#$ (warning dbgsource: $(target)_$(prop).$(bld_trg_cpu)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
331$(target)_$(prop).$(bld_trg_cpu) := $(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
332endif
333endif
[72]334endef
335
[353]336## Inherit one template property in a non-accumulative manner, deferred expansion.
337# @param 1: $(prop) Property name
338# @param 2: $(target) Target name
339# @todo fix the precedence order for some properties.
340# @remark this define relies on double evaluation
341define def_inherit_template_one_deferred
342ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
343ifndef $(target)_$(prop)
344$(target)_$(prop) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop))
345#$ (warning dbgtarget: $(target)_$(prop):='$(value $(target)_$(prop))' TEMPLATE_$($(target)_TEMPLATE)_$(prop))
346endif
347endif
[447]348ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
349ifndef $(target)_$(prop).$(bld_trg)
350#$ (warning dbgsource: $(target)_$(prop).$(bld_trg)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
351$(target)_$(prop).$(bld_trg) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
[353]352endif
353endif
[481]354ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)
355ifndef $(target)_$(prop).$(bld_trg).$(bld_trg_arch)
356#$ (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))
357$(target)_$(prop).$(bld_trg).$(bld_trg_arch) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
358endif
359endif
[455]360ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
361ifndef $(target)_$(prop).$(bld_trg_arch)
362#$ (warning dbgsource: $(target)_$(prop).$(bld_trg_arch)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
363$(target)_$(prop).$(bld_trg_arch) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
364endif
365endif
366ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
367ifndef $(target)_$(prop).$(bld_trg_cpu)
368#$ (warning dbgsource: $(target)_$(prop).$(bld_trg_cpu)="TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)" TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
369$(target)_$(prop).$(bld_trg_cpu) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
370endif
371endif
[353]372endef
373
[660]374## Inherit one acculumlative template property where the 'most significant' items are at the left end.
[78]375# @param $(prop) Property name
376# @param $(target) Target name
[660]377define def_inherit_template_one_accumulate_l
[78]378ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
[353]379#$ (warning dbgtype: TEMPLATE_$($(target)_TEMPLATE)_$(prop) $(target)_$(prop)=$($(target)_$(prop)) $(TEMPLATE_$($(target)_TEMPLATE)_$(prop)))
[659]380$(target)_$(prop) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop))
[442]381#$ (warning dbgtype: $(target)_$(prop)=$($(target)_$(prop)))
[78]382endif
[243]383ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TYPE)
[353]384#$ (warning dbg4: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TYPE))
[659]385$(target)_$(prop).$(BUILD_TYPE) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TYPE))
[243]386endif
[447]387ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
[659]388#$ (warning dbg5: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
389$(target)_$(prop).$(bld_trg) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg))
[79]390endif
[481]391ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)
392#$ (warning dbg4: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
[659]393$(target)_$(prop).$(bld_trg).$(bld_trg_arch) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch))
[481]394endif
[447]395ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
396#$ (warning dbg5: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
[659]397$(target)_$(prop).$(bld_trg_cpu) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu))
[79]398endif
[447]399ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
400#$ (warning dbg6: TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
[659]401$(target)_$(prop).$(bld_trg_arch) += $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch))
[79]402endif
[78]403endef
404
[660]405## Inherit one acculumlative template property where the 'most significant' items are at the right end.
406# First pass, $(value) referenced.
407# @param $(prop) Property name
408# @param $(target) Target name
409define def_inherit_template_one_accumulate_r1
410ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
411_$(target)_$(prop)_R := $(value $(target)_$(prop))
412endif
413ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TYPE)
414_$(target)_$(prop).$(BUILD_TYPE)_R := $(value $(target)_$(prop).$(BUILD_TYPE))
415endif
416ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
417_$(target)_$(prop).$(bld_trg)_R := $(value $(target)_$(prop).$(bld_trg))
418endif
419ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg).$(bld_trg_arch)
420_$(target)_$(prop).$(bld_trg).$(bld_trg_arch)_R := $(value $(target)_$(prop).$(bld_trg).$(bld_trg_arch))
421endif
422ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
423_$(target)_$(prop).$(bld_trg_cpu)_R := $(value $(target)_$(prop).$(bld_trg_cpu))
424endif
425ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
426_$(target)_$(prop).$(bld_trg_arch)_R := $(value $(target)_$(prop).$(bld_trg_arch))
427endif
428endef
429
430## Inherit one template property the other way around.
431# Second pass, not $(value) referenced.
432# @param $(prop) Property name
433# @param $(target) Target name
434define def_inherit_template_one_accumulate_r2
435ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop)
436$(target)_$(prop) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop)) $$(_$(target)_$(prop)_R)
437endif
438ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TYPE)
439$(target)_$(prop).$(BUILD_TYPE) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(BUILD_TYPE)) $$(_$(target)_$(prop).$(BUILD_TYPE)_R)
440endif
441ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)
442$(target)_$(prop).$(bld_trg) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg)) $$(_$(target)_$(prop).$(bld_trg)_R)
443endif
444ifdef 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)) $$(_$(target)_$(prop).$(bld_trg).$(bld_trg_arch)_R)
446endif
447ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)
448$(target)_$(prop).$(bld_trg_cpu) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_cpu)) $$(_$(target)_$(prop).$(bld_trg_cpu)_R)
449endif
450ifdef TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)
451$(target)_$(prop).$(bld_trg_arch) = $$(TEMPLATE_$($(target)_TEMPLATE)_$(prop).$(bld_trg_arch)) $$(_$(target)_$(prop).$(bld_trg_arch)_R)
452endif
453endef
454
455
[72]456## Inherit template properties for on target.
457# @param $(target) Target name.
458define def_inherit_template
[447]459# Inherit any default template.
460ifdef TEMPLATE
461ifeq ($($(target)_TEMPLATE),)
462$(eval $(target)_TEMPLATE:=$(TEMPLATE))
463endif
464endif
465# Expand the template if specified.
466ifneq ($($(target)_TEMPLATE),)
[353]467$(foreach prop,$(PROPS_SINGLE),$(eval $(value def_inherit_template_one)))
468$(foreach prop,$(PROPS_DEFERRED),$(eval $(def_inherit_template_one_deferred))) # exploits the 2 evaluation, so no value!
[660]469$(foreach prop,$(PROPS_ACCUMULATE_L),$(eval $(def_inherit_template_one_accumulate_l))) # += works fine (better) without value.
470$(foreach prop,$(PROPS_ACCUMULATE_R),\
471$(eval $(value def_inherit_template_one_accumulate_r1))\
472$(eval $(def_inherit_template_one_accumulate_r2))\
473) # This is a hack! (but it appears to work)
[447]474endif
[72]475endef
[353]476
[72]477# Inherit template properties
[447]478bld_trg := $(BUILD_TARGET)
479bld_trg_arch := $(BUILD_TARGET_ARCH)
480bld_trg_cpu := $(BUILD_TARGET_CPU)
481$(foreach target, $(_ALL_BUILD_TARGET_TARGETS),$(eval $(value def_inherit_template)))
[72]482
[447]483bld_trg := $(BUILD_PLATFORM)
484bld_trg_arch := $(BUILD_PLATFORM_ARCH)
485bld_trg_cpu := $(BUILD_PLATFORM_CPU)
486$(foreach target, $(_ALL_BUILD_PLATFORM_TARGETS),$(eval $(value def_inherit_template)))
[72]487
[447]488
[72]489#
[460]490# Include tools & sdks
[183]491#
[592]492_TOOLS := $(TOOL.$(BUILD_TARGET)) $(TOOL.$(BUILD_TARGET_ARCH)) $(TOOL.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
493 $(TOOL.$(BUILD_PLATFORM)) $(TOOL.$(BUILD_PLATFORM_ARCH)) $(TOOL.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH)) \
494 $(TOOL)
495_SDKS := $(SDKS.$(BUILD_TARGET)) $(SDKS.$(BUILD_TARGET_ARCH)) $(SDKS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) \
496 $(SDKS.$(BUILD_PLATFORM)) $(SDKS.$(BUILD_PLATFORM_ARCH)) $(SDKS.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH)) \
497 $(SDKS.$(BUILD_TYPE)) \
498 $(SDKS)
[460]499define def_tools_sdks_target_source
[353]500$(eval _TOOLS += $(foreach prop, $(PROPS_TOOLS), \
[460]501 $($(source)_$(prop).$(_bld_trg)) \
502 $($(target)_$(source)_$(prop).$(_bld_trg)) \
[481]503 $($(source)_$(prop).$(_bld_trg).$(_bld_trg_arch)) \
504 $($(target)_$(source)_$(prop).$(_bld_trg).$(_bld_trg_arch)) \
[460]505 $($(source)_$(prop).$(_bld_trg_arch)) \
506 $($(target)_$(source)_$(prop).$(_bld_trg_arch)) \
[353]507 $($(source)_$(prop)) \
508 $($(target)_$(source)_$(prop))))
[460]509$(eval _SDKS += \
510 $($(source)_SDKS.$(_bld_trg)) \
511 $($(target)_$(source)_SDKS.$(_bld_trg)) \
[481]512 $($(source)_SDKS.$(_bld_trg).$(_bld_trg_arch)) \
513 $($(target)_$(source)_SDKS.$(_bld_trg).$(_bld_trg_arch)) \
[460]514 $($(source)_SDKS.$(_bld_trg_arch)) \
515 $($(target)_$(source)_SDKS.$(_bld_trg_arch)) \
[592]516 $($(source)_SDKS.$(BUILD_TYPE)) \
517 $($(target)_$(source)_SDKS.$(BUILD_TYPE)) \
[460]518 $($(source)_SDKS) \
519 $($(target)_$(source)_SDKS))
[72]520endef
[353]521
[460]522define def_tools_sdks_target
523_bld_trg := $(firstword $($(target)_BLD_TRG) $(bld_trg))
524_bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(bld_trg_arch))
525_bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(bld_trg_cpu))
526
[353]527$(eval _TOOLS += $(foreach prop, $(PROPS_TOOLS), \
[460]528 $($(target)_$(prop).$(_bld_trg)) \
529 $($(target)_$(prop).$(_bld_trg_arch)) \
[481]530 $($(target)_$(prop).$(_bld_trg).$(_bld_trg_arch)) \
[353]531 $($(target)_$(prop))))
[460]532$(eval _SDKS += \
533 $($(target)_SDKS.$(_bld_trg)) \
534 $($(target)_SDKS.$(_bld_trg_arch)) \
[481]535 $($(target)_SDKS.$(_bld_trg).$(_bld_trg_arch)) \
[460]536 $($(target)_SDKS))
[353]537$(foreach source, \
[460]538 $($(target)_SOURCES.$(_bld_trg)) \
539 $($(target)_SOURCES.$(_bld_trg_arch)) \
[481]540 $($(target)_SOURCES.$(_bld_trg).$(_bld_trg_arch)) \
[460]541 $($(target)_SOURCES.$(_bld_trg_cpu)) \
[353]542 $($(target)_SOURCES.$(BUILD_TYPE)) \
543 $($(target)_SOURCES) \
[460]544 , $(eval $(value def_tools_sdks_target_source)))
[72]545endef
[353]546
[640]547define def_tools_srcname_target
548_bld_trg := $(firstword $($(target)_BLD_TRG) $(bld_trg))
549_bld_trg_arch := $(firstword $($(target)_BLD_TRG_ARCH) $(bld_trg_arch))
550_bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(bld_trg_cpu))
551
552$(foreach source, $(notdir\
553 $($(target)_SOURCES.$(_bld_trg)) \
554 $($(target)_SOURCES.$(_bld_trg_arch)) \
555 $($(target)_SOURCES.$(_bld_trg).$(_bld_trg_arch)) \
556 $($(target)_SOURCES.$(_bld_trg_cpu)) \
557 $($(target)_SOURCES.$(BUILD_TYPE)) \
558 $($(target)_SOURCES) \
559 ), $(eval $(value def_tools_sdks_target_source)))
560endef
561
[460]562bld_trg := $(BUILD_TARGET)
563bld_trg_arch := $(BUILD_TARGET_ARCH)
564bld_trg_cpu := $(BUILD_TARGET_CPU)
565$(foreach target, $(_ALL_BUILD_TARGET_TARGETS), $(eval $(value def_tools_sdks_target)))
[640]566$(foreach target, $(_ALL_SRCNAME_TARGETS), $(eval $(value def_tools_srcname_target)))
[72]567
[460]568bld_trg := $(BUILD_PLATFORM)
569bld_trg_arch := $(BUILD_PLATFORM_ARCH)
570bld_trg_cpu := $(BUILD_PLATFORM_CPU)
571$(foreach target, $(_ALL_BUILD_PLATFORM_TARGETS), $(eval $(value def_tools_sdks_target)))
572
573
574# include TOOLS
[72]575define def_tools_include
576ifndef TOOL_$(tool)
[353]577TOOL_$(tool)_KMK_FILE := $(firstword $(foreach path, $(TOOL_PATHS) $(PATH_KBUILD)/tools, $(wildcard $(path)/$(tool).kmk)))
578ifeq ($(TOOL_$(tool)_KMK_FILE),)
579$(error kBuild: Cannot find include file for the tool '$(tool)'! Searched: $(TOOL_PATHS) $(PATH_KBUILD)/tools)
[72]580endif
[353]581include $(TOOL_$(tool)_KMK_FILE)
582endif
[72]583endef
[460]584
585_TOOLS := $(sort $(_TOOLS))
[353]586$(foreach tool, $(_TOOLS), $(eval $(value def_tools_include)))
[72]587
588
[460]589# include SDKS
[122]590define def_sdks_include_one
[72]591ifndef SDK_$(sdk)
[353]592SDK_$(sdk)_KMK_FILE := $(firstword $(foreach path, $(SDK_PATHS) $(PATH_KBUILD)/sdks, $(wildcard $(path)/$(sdk).kmk)))
593ifeq ($(SDK_$(sdk)_KMK_FILE),)
594$(error kBuild: Cannot find include file for the SDK '$(sdk)'! Searched: $(SDK_PATHS) $(PATH_KBUILD)/sdks)
[72]595endif
[353]596include $(SDK_$(sdk)_KMK_FILE)
597endif
[72]598endef
[460]599
600_SDKS := $(sort $(_SDKS))
[353]601$(foreach sdk, $(_SDKS), $(eval $(value def_sdks_include_one)))
[72]602
[380]603
[640]604
[73]605#
[640]606# Fetching Tools, Sources and Similar.
607#
608MD5SUM := md5sum
609
610## generates the fetch rule
611define def_fetch_src_fetch_rule
612# Indirect goal for downloading something.
613$(out) $($(target)_$(srcname)_FETCH_OUTPUT_): | $($(target)_$(srcname)_FETCH_DEPORD_)
614 @$(ECHO) Downloading $(source)...
615 $$(RM) -f $(out) $(out).md5 ## @todo fancy stuff like download continuation
616 $($(target)_$(srcname)_FETCH_CMDS_)
617 @$(if $(md5),$(APPEND) $(out).md5 "$(subst 1,0,$(md5)) *$(out)")
618 $(if $(md5),$(MD5SUM) -c $(out).md5)
619
620
621# Intermediate goal for making sure the md5 and size matches. it will (re) fetch the archive if necessary.
622$(out).checked_$(md5)_$(size): $($(target)_$(srcname)_FETCH_DEPEND_) | $($(target)_$(srcname)_FETCH_DEPORD_)
623 @$(ECHO) Checking $(out) ($(source))...
624 $$(RM) -f $$@ $(out).md5
625 @# creates the .md5 we pass to md5sum.
626 @$(if $(md5),$(APPEND) $(out).md5 "$(md5) *$(out)")
627 @# if the file exists, perform md5sum, otherwise just fetch it.
628 $(if $(wildcard $(out)),\
629 $(MD5SUM) -c $(out).md5 || ( $(RM_EXT) -f $(out) && $(MAKE) -f $(MAKEFILE) $(out) ),\
630 $(MAKE) -f $(MAKEFILE) $(out) )
631 @$(APPEND) $$@
632
633_TARGET_$(target)_FETCHED += $(out).checked_$(md5)_$(size)
634
635endef
636
637## generates the unpack rule
638define def_fetch_src_unpack_rule
639#$ (warning def_fetch_src_unpack_rule: source=$(source))
640
641# This is the unpack rule. it has an order-only dependency on the download check.
642$(out) $($(target)_$(srcname)_UNPACK_OUTPUT_): $($(target)_$(srcname)_UNPACK_DEPEND_) \
643 | $($(target)_$(srcname)_UNPACK_DEPORD_) $(archive).checked_$(md5)_$(size)
644 @$(ECHO) Unpacking $(source) into $(inst)...
645 $$(RM) -f $(out)
646 $($(target)_$(srcname)_UNPACK_CMDS_)
647 @$(APPEND) $(out) $(out)
648 @$(APPEND) $(out) $(out).check_$(md5)_$(size)
649
650$(eval _TARGET_$(target)_UNPACKED += $(out))
651_TARGET_$(target)_DIGEST := $(_TARGET_$(target)_DIGEST)-$(srcname)_$(md5)_$(size)
652
653endef
654
655## Processes a fetch source
656#
657define def_fetch_src
658#$ (warning dbg: def_fetch_src: source='$(source)' target='$(target)')
659
660# common
661srcname := $(notdir $(source))
662inst := $(firstword \
663 $($(target)_$(source)_INST)\
664 $($(target)_$(srcname)_INST)\
665 $($(source)_INST)\
666 $($(srcname)_INST)\
667 $($(target)_INST)\
668)
669ifneq ($(patsubst %/,ok,$(inst)),ok)
670$(error kBuild: Bad or missing INST property for source '$(source)' in target '$(target)': $(inst))
671endif
672INSTARGET_$(target)_$(srcname) := $(inst)
673fetchdir := $(firstword \
674 $($(target)_$(source)_FETCHDIR)\
675 $($(target)_$(srcname)_FETCHDIR)\
676 $($(source)_FETCHDIR)\
677 $($(srcname)_FETCHDIR)\
678 $($(target)_FETCHDIR)\
679 $(FETCHDIR)\
680 $(PATH_TARGET)\
681)
682deps := \
683 $($(target)_$(source)_DEPS)\
684 $($(target)_$(srcname)_DEPS)\
685 $($(source)_DEPS)\
686 $($(srcname)_DEPS)\
687 $($(target)_DEPS)
688md5 := $(firstword \
689 $($(target)_$(source)_MD5)\
690 $($(target)_$(srcname)_MD5)\
691 $($(source)_MD5)\
692 $($(srcname)_MD5)\
693 $($(target)_MD5)\
694)
695size := $(firstword \
696 $($(target)_$(source)_SIZE)\
697 $($(target)_$(srcname)_SIZE)\
698 $($(source)_SIZE)\
699 $($(srcname)_SIZE)\
700 $($(target)_SIZE)\
701)
702dep := # not legal for fetch and unpack tools
703
704
705#
706# The fetching.
707#
708out := $(fetchdir)/$(srcname)
709archive := $(out)
710TARGET_$(target)_$(srcname) := $(out)
711dirdep := $(call DIRDEP,$(fetchdir))
712tool := $(firstword \
713 $($(target)_$(source)_FETCHTOOL)\
714 $($(target)_$(srcname)_FETCHTOOL)\
715 $($(target)_$(source)_TOOL)\
716 $($(target)_$(srcname)_TOOL)\
717 $($(source)_FETCHTOOL)\
718 $($(srcname)_FETCHTOOL)\
719 $($(source)_TOOL)\
720 $($(srcname)_TOOL)\
721 $($(target)_FETCHTOOL)\
722 $($(target)_TOOL)\
723 )
724flags :=\
725 $(TOOL_$(tool)_FETCHFLAGS)\
726 $(FETCHFLAGS)\
727 $($(target)_FETCHFLAGS)\
728 $($(srcname)_FETCHFLAGS)\
729 $($(source)_FETCHFLAGS)\
730 $($(target)_$(srcname)_FETCHFLAGS)\
731 $($(target)_$(source)_FETCHFLAGS)
732
733#$ (warning dbg: target=$(target) source=$(source) $(srcname)=$(srcname) tool=$(tool) out=$(out) flags=$(flags) dirdep=$(dirdep) fetchdir=$(fetchdir) md5=$(md5) size=$(size))
734
735ifndef TOOL_$(tool)_FETCH_CMDS
736$(warning kBuild: tools: \
737 1 $($(target)_$(source)_FETCHTOOL)\
738 2 $($(target)_$(srcname)_FETCHTOOL)\
739 3 $($(target)_$(source)_TOOL)\
740 4 $($(target)_$(srcname)_TOOL)\
741 5 $($(source)_FETCHTOOL)\
742 6 $($(srcname)_FETCHTOOL)\
743 7 $($(source)_TOOL)\
744 8 $($(srcname)_TOOL)\
745 9 $($(target)_FETCHTOOL)\
746 10 $($(target)_TOOL) )
747$(error kBuild: TOOL_$(tool)_FETCH_CMDS is not defined. source=$(source) target=$(target) )
748endif
749
750# call the tool
751$(target)_$(srcname)_FETCH_CMDS_ := $(TOOL_$(tool)_FETCH_CMDS)
752$(target)_$(srcname)_FETCH_OUTPUT_ := $(TOOL_$(tool)_FETCH_OUTPUT)
753$(target)_$(srcname)_FETCH_DEPEND_ := $(TOOL_$(tool)_FETCH_DEPEND) $(deps)
754$(target)_$(srcname)_FETCH_DEPORD_ := $(TOOL_$(tool)_FETCH_DEPORD) $(dirdep)
755
756# generate the fetch rule.
757$(eval $(def_fetch_src_fetch_rule))
758
759
760#
761# The unpacking / installing.
762#
763out := $(inst)_kBuild_$(target)_$(srcname)_unpacked.lst
764dirdep := $(call DIRDEP,$(inst))
765tool := $(firstword \
766 $($(target)_$(source)_UNPACKTOOL)\
767 $($(target)_$(srcname)_UNPACKTOOL)\
768 $($(target)_$(source)_TOOL)\
769 $($(target)_$(srcname)_TOOL)\
770 $($(source)_UNPACKTOOL)\
771 $($(srcname)_UNPACKTOOL)\
772 $($(source)_TOOL)\
773 $($(srcname)_TOOL)\
774 $($(target)_UNPACKTOOL)\
775 $($(target)_TOOL) \
776 )
777ifeq ($(tool),)
778tool := $(toupper $(subst .,,$(suffix $(subst tar.,TAR,$(srcname)))))
779$(eval $(value def_tools_include))
780endif
781flags :=\
782 $(TOOL_$(tool)_UNPACKFLAGS)\
783 $(UNPACKFLAGS)\
784 $($(target)_UNPACKFLAGS)\
785 $($(srcname)_UNPACKFLAGS)\
786 $($(source)_UNPACKFLAGS)\
787 $($(target)_$(srcname)_UNPACKFLAGS)\
788 $($(target)_$(source)_UNPACKFLAGS)
789
790#$ (warning dbg: target=$(target) source=$(source) $(srcname)=$(srcname) tool=$(tool) out=$(out) flags=$(flags) dirdep=$(dirdep) inst=$(inst) md5=$(md5) size=$(size))
791ifndef TOOL_$(tool)_UNPACK_CMDS
792$(warning kBuild: tools: \
793 1 $($(target)_$(source)_UNPACKTOOL)\
794 2 $($(target)_$(srcname)_UNPACKTOOL)\
795 3 $($(target)_$(source)_TOOL)\
796 4 $($(target)_$(srcname)_TOOL)\
797 5 $($(source)_UNPACKTOOL)\
798 6 $($(srcname)_UNPACKTOOL)\
799 7 $($(source)_TOOL)\
800 8 $($(srcname)_TOOL)\
801 9 $($(target)_UNPACKTOOL)\
802 10 $($(target)_TOOL) \
803 11 $(toupper $(subst tar.,TAR,$(ext $(srcname)))) \
804 )
805$(error kBuild: TOOL_$(tool)_UNPACK_CMDS is not defined. source=$(source) target=$(target) )
806endif
807
808# call the tool
809$(target)_$(srcname)_UNPACK_CMDS_ := $(TOOL_$(tool)_UNPACK_CMDS)
810$(target)_$(srcname)_UNPACK_OUTPUT_ := $(TOOL_$(tool)_UNPACK_OUTPUT)
811$(target)_$(srcname)_UNPACK_DEPEND_ := $(TOOL_$(tool)_UNPACK_DEPEND) $(deps)
812$(target)_$(srcname)_UNPACK_DEPORD_ := $(TOOL_$(tool)_UNPACK_DEPORD) $(dirdep)
813
814# generate the fetch rule.
815$(eval $(def_fetch_src_unpack_rule))
816
817_DIRS += $(inst) $(fetchdir)
818
819endef
820
821
822##
823# Define the target level rules for a fetch.
824# @param target
825# @param out
826# @param inst
827# @param _TARGET_$(target)_FETCHED...
828# @param bld_trg
829# @param bld_trg_arch
830define def_fetch_rules
831
832$(out): $(_TARGET_$(target)_UNPACKED) | $(call DIRDEP,$(inst))
833 @$(ECHO) Successfully fetched $(target)
834 $(RM) -f $$@ $$@.tmp
835 @$(APPEND) $$@.tmp ""
836 $(if $(_TARGET_$(target)_UNPACKED),$(CAT_EXT) $(_TARGET_$(target)_UNPACKED) >> $$@.tmp)
837 $(MV) -f $$@.tmp $$@
838
839$(out)_unfetched:
840 @$(ECHO) Unfetching $(target)...
841 $(RM) -f $$(shell $$(CAT_EXT) $(out) 2> /dev/null)
842 # figure out how to make this quiet...
843 -$(RMDIR) -p $(dir $(out)) $$(sort $$(dir $$(shell $$(CAT_EXT) $(out) 2> /dev/null)))
844 $(RM) -f $(out)
845 -$(RMDIR) -p $(dir $(out))
846
847endef
848
849
850##
851# Deal with one fetch target.
852# @param target
853# @param bld_trg
854# @param bld_trg_arch
855define def_fetch
856
857# common
858INSTARGET_$(target) := $($(target)_INST)
859ifneq ($(patsubst %/,ok,$(INSTARGET_$(target))),ok)
860$(error kBuild: Bad or missing INST property for target '$(target)': $(INSTARGET_$(target)))
861endif
862_TARGET_$(target)_FETCHED :=
863_TARGET_$(target)_UNPACKED :=
864_TARGET_$(target)_DIGEST :=
865
866# The 'sources'.
867#$ (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)))
868$(foreach source,$($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TYPE)) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_TARGET_ARCH)) $($(target)_SOURCES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)),\
869 $(eval $(value def_fetch_src)))
870
871# The target.
872inst := $(INSTARGET_$(target))
873out := $(inst)_kBuild_fetch_$(target)
874
875$(eval $(def_fetch_rules))
876
877_FETCHES += $(out)
878_DOWNLOADS += $(_TARGET_$(target)_FETCHED)
879_UNPACKS += $(_TARGET_$(target)_UNPACKED)
880_UNFETCHES += $(out)_unfetched
881_DIRS += $(inst)
882
883endef
884
885# Walk the FETCH target lists.
886bld_trg := $(BUILD_TARGET)
887bld_trg_arch := $(BUILD_TARGET_ARCH)
888$(foreach target, $(FETCHES) $(FETCHES.$(BUILD_TARGET)) $(FETCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
889 $(eval $(value def_fetch)))
890
891# some aliases.
892download: $(_DOWNLOADS)
893unpack: $(_UNPACK)
894fetches: $(_FETCHES)
895unfetches: $(_UNFETCHES)
896
897
898
899##
900## Patching.
901##
902##
903#define def_fetch_src
904#
905#endef
906#
907#
908## Deal with one patch target.
909#define def_patch
910#
911#$(foreach source,$($(target)_SOURCES) $($(target)_SOURCES.$(BUILD_TYPE)) $($(target)_SOURCES.$(BUILD_TARGET)) $($(target)_SOURCES.$(BUILD_TARGET_ARCH)) $($(target)_SOURCES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)),\
912# $(eval $(value def_patch_one)))
913#
914#_PATCHES +=
915#endef
916#
917#$(foreach target, $(PATCHES) $(PATCHES.$(BUILD_TARGET)) $(PATCHES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
918# $(eval $(value def_patch)))
919#
920
921
922#
[73]923# Object processing.
924#
[72]925
[380]926## wrapper the compile command dependency check.
927ifndef NO_COMPILE_CMDS_DEPS
[552]928 ifneq ($(filter comp-vars,$(KMK_FEATURES)),)
[530]929_DEP_COMPILE_CMDS = $(comp-vars $(target)_$(source)_CMDS_PREV_,$(target)_$(source)_CMDS_,FORCE)
930 else
[380]931_DEP_COMPILE_CMDS = $(if $(subst $(strip $($(target)_$(source)_CMDS_PREV_)),,$(strip $($(target)_$(source)_CMDS_))),FORCE,)
[530]932 endif
[380]933else
934_DEP_COMPILE_CMDS =
935endif
936
937## Generates the rules for building a specific object, and the '::' aliases
938# for building a source file.
[353]939# @param $(obj) The object file.
[380]940define def_target_source_rule
941$(obj) $($(target)_$(source)_OUTPUT_): \
942 $($(target)_$(source)_DEPEND_) \
943 $(_DEP_COMPILE_CMDS) \
944 | \
945 $($(target)_$(source)_DEPORD_)
946 $(call MSG_L1,Creating $$@)
[472]947 $(RM) -f $(dep) $(obj) $($(target)_$(source)_OUTPUT_)
[380]948 $(custom_pre)
[412]949
[380]950$($(target)_$(source)_CMDS_)
951
952 $(custom_post)
953ifndef NO_COMPILE_CMDS_DEPS
954 @$(APPEND) "$(dep)"
955 @$(APPEND) "$(dep)" 'define $(target)_$(source)_CMDS_PREV_'
956 @$(APPEND) "$(dep)" '$(subst $(NL),'$(NL)$(TAB)@$(APPEND) "$(dep)" ',$($(target)_$(source)_CMDS_))'
957 @$(APPEND) "$(dep)" 'endef'
[412]958endif
[380]959
[353]960$(basename $(notdir $(obj))).o::
[442]961 + $$(MAKE) -f $$(MAKEFILE) $(obj)
[445]962$(basename $(notdir $(obj))).obj::
[442]963 + $$(MAKE) -f $$(MAKEFILE) $(obj)
[353]964endef
[205]965
[353]966
[380]967## wrapper the link command dependency check.
968ifndef NO_COMPILE_CMDS_DEPS
[581]969 ifneq ($(filter comp-vars,$(KMK_FEATURES)),)
970_DEP_LINK_CMDS = $(comp-vars $(target)_CMDS_PREV_,$(target)_CMDS_,FORCE)
971 else
[380]972_DEP_LINK_CMDS = $(if $(subst $(strip $($(target)_CMDS_PREV_)),,$(strip $($(target)_CMDS_))),FORCE,)
[581]973 endif
[380]974else
975_DEP_LINK_CMDS =
976endif
977
978## Generate the link rule for a target.
979# @param $(target) The normalized target name.
980# @param $(dirdep) Directories we depend upon begin created before linking.
981# @param $(dep) The name of the dependency file.
982# @param $(out)
983# @param $($(target)_OUTPUT_) Output files from the link.
984# @param $($(target)_DEPEND_) Dependencies.
985# @param $($(target)_DEPORD_) Dependencies which should only affect build order.
986# @param $($(target)_CMDS_) The link commands.
987# @param $($(target)_CMDS_PREV_) The link commands from the previous run.
988define def_link_rule
989$(out) $($(target)_OUTPUT_): \
990 $($(target)_DEPEND_) \
991 $(_DEP_LINK_CMDS) \
992 | \
993 $($(target)_DEPORD_)
994 $(call MSG_L1,Creating $$@)
[473]995 $(RM) -f $(dep) $(out) $($(target)_OUTPUT_)
[380]996 $(custom_pre)
[412]997
[380]998$($(target)_CMDS_)
999
1000 $(custom_post)
[524]1001ifndef NO_LINK_CMDS_DEPS
[380]1002 @$(APPEND) "$(dep)" 'define $(target)_CMDS_PREV_'
1003 @$(APPEND) "$(dep)" '$(subst $(NL),'$(NL)$(TAB)@$(APPEND) "$(dep)" ',$($(target)_CMDS_))'
1004 @$(APPEND) "$(dep)" 'endef'
[412]1005endif
[380]1006
1007$(basename $(notdir $(out)))::
[442]1008 + $$(MAKE) -f $$(MAKEFILE) $(out)
[380]1009endef
1010
1011
1012## Generate the link & lib install rule
1013# @param $(target) Normalized target name.
1014# @param $(out) The build target.
1015# @param $(INSTARGET_$(target)) The installation targets.
1016# @param $(mode) The file mode (optional)
1017define def_link_install_rule
1018$(INSTARGET_$(target)) : $(out) | $(call DIRDEP,$(dir $(INSTARGET_$(target))))
1019 $(INSTALL) $$(if $(mode),-m $(mode)) $(out) $$@
1020endef
1021
1022
1023
[73]1024## Generic macro for processing C, C++ and Assembly sources.
1025# @param $(target) Normalized target name.
1026# @param $(source) Source file name.
1027# @param $(type) Source type. {C,CXX,AS}
[221]1028# @param bld_type Build type.
1029# @param bld_trg Build target.
1030# @param bld_trg_arch Build target arch.
1031# @param bld_trg_cpu Build target cpu.
[592]1032# @remark obsoleted by kBuild helpers in kmk. Only required for limited gmake compatbility.
[72]1033#
[641]1034define def_target_source_c_cpp_asm_rc_old
1035#$ (warning dbg: def_target_source_c_cpp_asm_rc_old: source='$(source)' target='$(target)' type='$(type)')
[73]1036
[353]1037tool := $(call _SOURCE_TOOL,$(source),$(target),$(type))
1038outbase := $(call _OBJECT_BASE,$(source),$(target))
1039PATH_$(target)_$(source) := $(patsubst %/,%,$(dir $(outbase)))
1040dirdep := $(call DIRDEP,$(dir $(outbase)))
1041defs :=\
[78]1042 $(TOOL_$(tool)_DEFS)\
[221]1043 $(TOOL_$(tool)_DEFS.$(bld_type))\
1044 $(TOOL_$(tool)_DEFS.$(bld_trg))\
1045 $(TOOL_$(tool)_DEFS.$(bld_trg_arch))\
[481]1046 $(TOOL_$(tool)_DEFS.$(bld_trg).$(bld_trg_arch))\
[221]1047 $(TOOL_$(tool)_DEFS.$(bld_trg_cpu))\
[74]1048 $(TOOL_$(tool)_$(type)DEFS)\
[221]1049 $(TOOL_$(tool)_$(type)DEFS.$(bld_type))\
[592]1050 $(foreach sdk, $(SDKS.$(bld_trg).$(bld_trg_arch)) \
1051 $(SDKS.$(bld_trg_arch)) \
1052 $(SDKS.$(bld_trg)) \
1053 $(SDKS.$(bld_type)) \
1054 $(SDKS),\
[353]1055 $(SDK_$(sdk)_DEFS)\
1056 $(SDK_$(sdk)_DEFS.$(bld_type))\
1057 $(SDK_$(sdk)_DEFS.$(bld_trg))\
1058 $(SDK_$(sdk)_DEFS.$(bld_trg_arch))\
[481]1059 $(SDK_$(sdk)_DEFS.$(bld_trg).$(bld_trg_arch))\
[353]1060 $(SDK_$(sdk)_DEFS.$(bld_trg_cpu))\
1061 $(SDK_$(sdk)_$(type)DEFS)\
1062 $(SDK_$(sdk)_$(type)DEFS.$(bld_type))\
1063 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg))\
1064 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg_arch))\
[481]1065 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg).$(bld_trg_arch))\
[353]1066 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg_cpu)))\
[74]1067 $(DEFS)\
[221]1068 $(DEFS.$(bld_type))\
1069 $(DEFS.$(bld_trg))\
1070 $(DEFS.$(bld_trg_arch))\
[481]1071 $(DEFS.$(bld_trg).$(bld_trg_arch))\
[221]1072 $(DEFS.$(bld_trg_cpu))\
[78]1073 $($(type)DEFS)\
[221]1074 $($(type)DEFS.$(bld_type))\
1075 $($(type)DEFS.$(bld_trg))\
1076 $($(type)DEFS.$(bld_trg_arch))\
[481]1077 $($(type)DEFS.$(bld_trg).$(bld_trg_arch))\
[221]1078 $($(type)DEFS.$(bld_trg_cpu))\
[592]1079 $(foreach sdk, $($(target)_SDKS.$(bld_trg).$(bld_trg_arch)) \
1080 $($(target)_SDKS.$(bld_trg_arch)) \
1081 $($(target)_SDKS.$(bld_trg)) \
1082 $($(target)_SDKS.$(bld_type)) \
1083 $($(target)_SDKS),\
[353]1084 $(SDK_$(sdk)_DEFS)\
1085 $(SDK_$(sdk)_DEFS.$(bld_type))\
1086 $(SDK_$(sdk)_DEFS.$(bld_trg))\
1087 $(SDK_$(sdk)_DEFS.$(bld_trg_arch))\
[481]1088 $(SDK_$(sdk)_DEFS.$(bld_trg).$(bld_trg_arch))\
[353]1089 $(SDK_$(sdk)_DEFS.$(bld_trg_cpu))\
1090 $(SDK_$(sdk)_$(type)DEFS)\
1091 $(SDK_$(sdk)_$(type)DEFS.$(bld_type))\
1092 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg))\
1093 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg_arch))\
[481]1094 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg).$(bld_trg_arch))\
[353]1095 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg_cpu)))\
[74]1096 $($(target)_DEFS)\
[221]1097 $($(target)_DEFS.$(bld_type))\
1098 $($(target)_DEFS.$(bld_trg))\
1099 $($(target)_DEFS.$(bld_trg_arch))\
[481]1100 $($(target)_DEFS.$(bld_trg).$(bld_trg_arch))\
[221]1101 $($(target)_DEFS.$(bld_trg_cpu))\
[78]1102 $($(target)_$(type)DEFS)\
[221]1103 $($(target)_$(type)DEFS.$(bld_type))\
1104 $($(target)_$(type)DEFS.$(bld_trg))\
1105 $($(target)_$(type)DEFS.$(bld_trg_arch))\
[481]1106 $($(target)_$(type)DEFS.$(bld_trg).$(bld_trg_arch))\
[221]1107 $($(target)_$(type)DEFS.$(bld_trg_cpu))\
[592]1108 $(foreach sdk, $($(source)_SDKS.$(bld_trg).$(bld_trg_arch)) \
1109 $($(source)_SDKS.$(bld_trg_arch)) \
1110 $($(source)_SDKS.$(bld_trg)) \
1111 $($(source)_SDKS.$(bld_type)) \
1112 $($(source)_SDKS),\
[353]1113 $(SDK_$(sdk)_DEFS)\
1114 $(SDK_$(sdk)_DEFS.$(bld_type))\
1115 $(SDK_$(sdk)_DEFS.$(bld_trg))\
1116 $(SDK_$(sdk)_DEFS.$(bld_trg_arch))\
[481]1117 $(SDK_$(sdk)_DEFS.$(bld_trg).$(bld_trg_arch))\
[353]1118 $(SDK_$(sdk)_DEFS.$(bld_trg_cpu))\
1119 $(SDK_$(sdk)_$(type)DEFS)\
1120 $(SDK_$(sdk)_$(type)DEFS.$(bld_type))\
1121 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg))\
1122 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg_arch))\
[481]1123 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg).$(bld_trg_arch))\
[353]1124 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg_cpu)))\
[74]1125 $($(source)_DEFS)\
[221]1126 $($(source)_DEFS.$(bld_type))\
1127 $($(source)_DEFS.$(bld_trg))\
1128 $($(source)_DEFS.$(bld_trg_arch))\
[481]1129 $($(source)_DEFS.$(bld_trg).$(bld_trg_arch))\
[221]1130 $($(source)_DEFS.$(bld_trg_cpu))\
[73]1131 $($(source)_$(type)DEFS)\
[221]1132 $($(source)_$(type)DEFS.$(bld_type))\
1133 $($(source)_$(type)DEFS.$(bld_trg))\
1134 $($(source)_$(type)DEFS.$(bld_trg_arch))\
[481]1135 $($(source)_$(type)DEFS.$(bld_trg).$(bld_trg_arch))\
[221]1136 $($(source)_$(type)DEFS.$(bld_trg_cpu))\
[592]1137 $(foreach sdk, $($(target)_$(source)_SDKS.$(bld_trg).$(bld_trg_arch)) \
1138 $($(target)_$(source)_SDKS.$(bld_trg_arch)) \
1139 $($(target)_$(source)_SDKS.$(bld_trg)) \
1140 $($(target)_$(source)_SDKS.$(bld_type)) \
1141 $($(target)_$(source)_SDKS),\
[353]1142 $(SDK_$(sdk)_DEFS)\
1143 $(SDK_$(sdk)_DEFS.$(bld_type))\
1144 $(SDK_$(sdk)_DEFS.$(bld_trg))\
1145 $(SDK_$(sdk)_DEFS.$(bld_trg_arch))\
[481]1146 $(SDK_$(sdk)_DEFS.$(bld_trg).$(bld_trg_arch))\
[353]1147 $(SDK_$(sdk)_DEFS.$(bld_trg_cpu))\
1148 $(SDK_$(sdk)_$(type)DEFS)\
1149 $(SDK_$(sdk)_$(type)DEFS.$(bld_type))\
1150 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg))\
1151 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg_arch))\
[481]1152 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg).$(bld_trg_arch))\
[353]1153 $(SDK_$(sdk)_$(type)DEFS.$(bld_trg_cpu)))\
[74]1154 $($(target)_$(source)_DEFS)\
[221]1155 $($(target)_$(source)_DEFS.$(bld_type))\
1156 $($(target)_$(source)_DEFS.$(bld_trg))\
1157 $($(target)_$(source)_DEFS.$(bld_trg_arch))\
[481]1158 $($(target)_$(source)_DEFS.$(bld_trg).$(bld_trg_arch))\
[221]1159 $($(target)_$(source)_DEFS.$(bld_trg_cpu))\
[74]1160 $($(target)_$(source)_$(type)DEFS)\
[221]1161 $($(target)_$(source)_$(type)DEFS.$(bld_type))\
1162 $($(target)_$(source)_$(type)DEFS.$(bld_trg))\
1163 $($(target)_$(source)_$(type)DEFS.$(bld_trg_arch))\
[481]1164 $($(target)_$(source)_$(type)DEFS.$(bld_trg).$(bld_trg_arch))\
[353]1165 $($(target)_$(source)_$(type)DEFS.$(bld_trg_cpu))
1166incs :=\
[221]1167 $($(target)_$(source)_$(type)INCS.$(bld_trg_cpu))\
[481]1168 $($(target)_$(source)_$(type)INCS.$(bld_trg).$(bld_trg_arch))\
[221]1169 $($(target)_$(source)_$(type)INCS.$(bld_trg_arch))\
1170 $($(target)_$(source)_$(type)INCS.$(bld_trg))\
1171 $($(target)_$(source)_$(type)INCS.$(bld_type))\
[73]1172 $($(target)_$(source)_$(type)INCS)\
[221]1173 $($(target)_$(source)_INCS.$(bld_trg_cpu))\
[481]1174 $($(target)_$(source)_INCS.$(bld_trg).$(bld_trg_arch))\
[221]1175 $($(target)_$(source)_INCS.$(bld_trg_arch))\
1176 $($(target)_$(source)_INCS.$(bld_trg))\
1177 $($(target)_$(source)_INCS.$(bld_type))\
[73]1178 $($(target)_$(source)_INCS)\
[592]1179 $(foreach sdk, $($(target)_$(source)_SDKS.$(bld_trg).$(bld_trg_arch)) \
1180 $($(target)_$(source)_SDKS.$(bld_trg_arch)) \
1181 $($(target)_$(source)_SDKS.$(bld_trg)) \
1182 $($(target)_$(source)_SDKS.$(bld_type)) \
1183 $($(target)_$(source)_SDKS),\
[353]1184 $(SDK_$(sdk)_$(type)INCS.$(bld_trg_cpu))\
[481]1185 $(SDK_$(sdk)_$(type)INCS.$(bld_trg).$(bld_trg_arch))\
[353]1186 $(SDK_$(sdk)_$(type)INCS.$(bld_trg_arch))\
1187 $(SDK_$(sdk)_$(type)INCS.$(bld_trg))\
1188 $(SDK_$(sdk)_$(type)INCS.$(bld_type))\
1189 $(SDK_$(sdk)_$(type)INCS)\
1190 $(SDK_$(sdk)_INCS.$(bld_trg_cpu))\
[481]1191 $(SDK_$(sdk)_INCS.$(bld_trg).$(bld_trg_arch))\
[353]1192 $(SDK_$(sdk)_INCS.$(bld_trg_arch))\
1193 $(SDK_$(sdk)_INCS.$(bld_trg))\
1194 $(SDK_$(sdk)_INCS.$(bld_type))\
1195 $(SDK_$(sdk)_INCS))\
[221]1196 $($(source)_$(type)INCS.$(bld_trg_cpu))\
[481]1197 $($(source)_$(type)INCS.$(bld_trg).$(bld_trg_arch))\
[221]1198 $($(source)_$(type)INCS.$(bld_trg_arch))\
1199 $($(source)_$(type)INCS.$(bld_trg))\
1200 $($(source)_$(type)INCS.$(bld_type))\
[73]1201 $($(source)_$(type)INCS)\
[221]1202 $($(source)_INCS.$(bld_trg_cpu))\
[481]1203 $($(source)_INCS.$(bld_trg).$(bld_trg_arch))\
[221]1204 $($(source)_INCS.$(bld_trg_arch))\
1205 $($(source)_INCS.$(bld_trg))\
1206 $($(source)_INCS.$(bld_type))\
[73]1207 $($(source)_INCS)\
[592]1208 $(foreach sdk, $($(source)_SDKS.$(bld_trg).$(bld_trg_arch)) \
1209 $($(source)_SDKS.$(bld_trg_arch)) \
1210 $($(source)_SDKS.$(bld_trg)) \
1211 $($(source)_SDKS.$(bld_type)) \
1212 $($(source)_SDKS),\
[353]1213 $(SDK_$(sdk)_$(type)INCS.$(bld_trg_cpu))\
[481]1214 $(SDK_$(sdk)_$(type)INCS.$(bld_trg).$(bld_trg_arch))\
[353]1215 $(SDK_$(sdk)_$(type)INCS.$(bld_trg_arch))\
1216 $(SDK_$(sdk)_$(type)INCS.$(bld_trg))\
1217 $(SDK_$(sdk)_$(type)INCS.$(bld_type))\
1218 $(SDK_$(sdk)_$(type)INCS)\
1219 $(SDK_$(sdk)_INCS.$(bld_trg_cpu))\
[481]1220 $(SDK_$(sdk)_INCS.$(bld_trg).$(bld_trg_arch))\
[353]1221 $(SDK_$(sdk)_INCS.$(bld_trg_arch))\
1222 $(SDK_$(sdk)_INCS.$(bld_trg))\
1223 $(SDK_$(sdk)_INCS.$(bld_type))\
1224 $(SDK_$(sdk)_INCS))\
[221]1225 $($(target)_$(type)INCS.$(bld_trg_cpu))\
[481]1226 $($(target)_$(type)INCS.$(bld_trg).$(bld_trg_arch))\
[221]1227 $($(target)_$(type)INCS.$(bld_trg_arch))\
1228 $($(target)_$(type)INCS.$(bld_trg))\
1229 $($(target)_$(type)INCS.$(bld_type))\
[73]1230 $($(target)_$(type)INCS)\
[221]1231 $($(target)_INCS.$(bld_trg_cpu))\
[481]1232 $($(target)_INCS.$(bld_trg).$(bld_trg_arch))\
[221]1233 $($(target)_INCS.$(bld_trg_arch))\
1234 $($(target)_INCS.$(bld_trg))\
1235 $($(target)_INCS.$(bld_type))\
[73]1236 $($(target)_INCS)\
[592]1237 $(foreach sdk, $($(target)_SDKS.$(bld_trg).$(bld_trg_arch)) \
1238 $($(target)_SDKS.$(bld_trg_arch)) \
1239 $($(target)_SDKS.$(bld_trg)) \
1240 $($(target)_SDKS.$(bld_type)) \
1241 $($(target)_SDKS),\
[353]1242 $(SDK_$(sdk)_$(type)INCS.$(bld_trg_cpu))\
[481]1243 $(SDK_$(sdk)_$(type)INCS.$(bld_trg).$(bld_trg_arch))\
[353]1244 $(SDK_$(sdk)_$(type)INCS.$(bld_trg_arch))\
1245 $(SDK_$(sdk)_$(type)INCS.$(bld_trg))\
1246 $(SDK_$(sdk)_$(type)INCS.$(bld_type))\
1247 $(SDK_$(sdk)_$(type)INCS)\
1248 $(SDK_$(sdk)_INCS.$(bld_trg_cpu))\
[481]1249 $(SDK_$(sdk)_INCS.$(bld_trg).$(bld_trg_arch))\
[353]1250 $(SDK_$(sdk)_INCS.$(bld_trg_arch))\
1251 $(SDK_$(sdk)_INCS.$(bld_trg))\
1252 $(SDK_$(sdk)_INCS.$(bld_type))\
1253 $(SDK_$(sdk)_INCS))\
[221]1254 $(INCS.$(bld_trg_cpu))\
[481]1255 $(INCS.$(bld_trg).$(bld_trg_arch))\
[221]1256 $(INCS.$(bld_trg_arch))\
1257 $(INCS.$(bld_trg))\
1258 $(INCS.$(bld_type))\
[73]1259 $(INCS)\
[592]1260 $(foreach sdk, $(SDKS.$(bld_trg).$(bld_trg_arch)) \
1261 $(SDKS.$(bld_trg_arch)) \
1262 $(SDKS.$(bld_trg)) \
1263 $(SDKS.$(bld_type)) \
1264 $(SDKS),\
[353]1265 $(SDK_$(sdk)_$(type)INCS.$(bld_trg_cpu))\
[481]1266 $(SDK_$(sdk)_$(type)INCS.$(bld_trg).$(bld_trg_arch))\
[353]1267 $(SDK_$(sdk)_$(type)INCS.$(bld_trg_arch))\
1268 $(SDK_$(sdk)_$(type)INCS.$(bld_trg))\
1269 $(SDK_$(sdk)_$(type)INCS.$(bld_type))\
1270 $(SDK_$(sdk)_$(type)INCS)\
1271 $(SDK_$(sdk)_INCS.$(bld_trg_cpu))\
[481]1272 $(SDK_$(sdk)_INCS.$(bld_trg).$(bld_trg_arch))\
[353]1273 $(SDK_$(sdk)_INCS.$(bld_trg_arch))\
1274 $(SDK_$(sdk)_INCS.$(bld_trg))\
1275 $(SDK_$(sdk)_INCS.$(bld_type))\
1276 $(SDK_$(sdk)_INCS))\
[221]1277 $(TOOL_$(tool)_$(type)INCS.$(bld_trg_cpu))\
[481]1278 $(TOOL_$(tool)_$(type)INCS.$(bld_trg).$(bld_trg_arch))\
[221]1279 $(TOOL_$(tool)_$(type)INCS.$(bld_trg_arch))\
1280 $(TOOL_$(tool)_$(type)INCS.$(bld_trg))\
1281 $(TOOL_$(tool)_$(type)INCS.$(bld_type))\
[353]1282 $(TOOL_$(tool)_$(type)INCS)
1283flags :=\
[73]1284 $(TOOL_$(tool)_$(type)FLAGS)\
[221]1285 $(TOOL_$(tool)_$(type)FLAGS.$(bld_type))\
1286 $(TOOL_$(tool)_$(type)FLAGS.$(bld_trg))\
1287 $(TOOL_$(tool)_$(type)FLAGS.$(bld_trg_arch))\
[481]1288 $(TOOL_$(tool)_$(type)FLAGS.$(bld_trg).$(bld_trg_arch))\
[221]1289 $(TOOL_$(tool)_$(type)FLAGS.$(bld_trg_cpu))\
[73]1290 $($(type)FLAGS)\
[221]1291 $($(type)FLAGS.$(bld_type))\
1292 $($(type)FLAGS.$(bld_trg))\
1293 $($(type)FLAGS.$(bld_trg_arch))\
[481]1294 $($(type)FLAGS.$(bld_trg).$(bld_trg_arch))\
[221]1295 $($(type)FLAGS.$(bld_trg_cpu))\
[73]1296 $($(target)_$(type)FLAGS)\
[221]1297 $($(target)_$(type)FLAGS.$(bld_type))\
1298 $($(target)_$(type)FLAGS.$(bld_trg))\
1299 $($(target)_$(type)FLAGS.$(bld_trg_arch))\
[481]1300 $($(target)_$(type)FLAGS.$(bld_trg).$(bld_trg_arch))\
[221]1301 $($(target)_$(type)FLAGS.$(bld_trg_cpu))\
[73]1302 $($(source)_$(type)FLAGS)\
[221]1303 $($(source)_$(type)FLAGS.$(bld_type))\
1304 $($(source)_$(type)FLAGS.$(bld_trg))\
1305 $($(source)_$(type)FLAGS.$(bld_trg_arch))\
[481]1306 $($(source)_$(type)FLAGS.$(bld_trg).$(bld_trg_arch))\
[221]1307 $($(source)_$(type)FLAGS.$(bld_trg_cpu))\
[73]1308 $($(target)_$(source)_$(type)FLAGS)\
[221]1309 $($(target)_$(source)_$(type)FLAGS.$(bld_type))\
1310 $($(target)_$(source)_$(type)FLAGS.$(bld_trg))\
1311 $($(target)_$(source)_$(type)FLAGS.$(bld_trg_arch))\
[481]1312 $($(target)_$(source)_$(type)FLAGS.$(bld_trg).$(bld_trg_arch))\
[353]1313 $($(target)_$(source)_$(type)FLAGS.$(bld_trg_cpu))
[552]1314# this isn't 100% in sync with kBuild, but it doesn't matter as it's only for gmake now.
[353]1315objsuff := $(firstword \
[481]1316 $($(target)_$(source)_OBJSUFF.$(bld_trg).$(bld_trg_arch))\
[221]1317 $($(target)_$(source)_OBJSUFF.$(bld_trg))\
[74]1318 $($(target)_$(source)_OBJSUFF)\
[481]1319 $($(source)_OBJSUFF.$(bld_trg).$(bld_trg_arch))\
[221]1320 $($(source)_OBJSUFF.$(bld_trg))\
[74]1321 $($(source)_OBJSUFF)\
[481]1322 $($(target)_OBJSUFF.$(bld_trg).$(bld_trg_arch))\
[221]1323 $($(target)_OBJSUFF.$(bld_trg))\
[74]1324 $($(target)_OBJSUFF)\
[481]1325 $(TOOL_$(tool)_$(type)OBJSUFF.$(bld_trg).$(bld_trg_arch))\
[221]1326 $(TOOL_$(tool)_$(type)OBJSUFF.$(bld_trg))\
[74]1327 $(TOOL_$(tool)_$(type)OBJSUFF)\
[353]1328 $(SUFF_OBJ))
1329obj := $(outbase)$(objsuff)
1330deps := \
[184]1331 $($(target)_$(source)_DEPS)\
[353]1332 $($(target)_$(source)_DEPS.$(bld_type))\
1333 $($(target)_$(source)_DEPS.$(bld_trg))\
1334 $($(target)_$(source)_DEPS.$(bld_trg_arch))\
[481]1335 $($(target)_$(source)_DEPS.$(bld_trg).$(bld_trg_arch))\
[353]1336 $($(target)_$(source)_DEPS.$(bld_trg_cpu))\
[184]1337 $($(source)_DEPS)\
[221]1338 $($(source)_DEPS.$(bld_type))\
1339 $($(source)_DEPS.$(bld_trg))\
[353]1340 $($(source)_DEPS.$(bld_trg_arch))\
[481]1341 $($(source)_DEPS.$(bld_trg).$(bld_trg_arch))\
[353]1342 $($(source)_DEPS.$(bld_trg_cpu))\
[184]1343 $($(target)_DEPS)\
[353]1344 $($(target)_DEPS.$(bld_type))\
[481]1345 $($(target)_DEPS.$(bld_trg))\
[221]1346 $($(target)_DEPS.$(bld_trg_arch))\
[481]1347 $($(target)_DEPS.$(bld_trg).$(bld_trg_arch))\
[353]1348 $($(target)_DEPS.$(bld_trg_cpu))
[73]1349
[380]1350# dependencies
1351dep := $(obj)$(SUFF_DEP)
[524]1352ifndef NO_COMPILE_CMDS_DEPS
[380]1353_DEPFILES_INCLUDED += $(dep)
1354$(if $(wildcard $(dep)),$(eval include $(dep)))
1355endif
[184]1356
1357#$ (warning dbg: target=$(target) source=$(source) tool=$(tool) obj=$(obj) dep=$(dep) flags=$(flags) defs=$(defs) incs=$(incs) dirdep=$(dirdep) outbase=$(outbase) objsuff=$(objsuff) deps=$(deps))
[380]1358ifndef TOOL_$(tool)_COMPILE_$(type)_CMDS
[353]1359$(warning kBuild: tools: \
[481]1360 1 $($(target)_$(source)_$(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
1361 2 $($(target)_$(source)_$(type)TOOL.$(bld_trg)) \
1362 3 $($(target)_$(source)_$(type)TOOL) \
1363 4 $($(target)_$(source)_TOOL.$(bld_trg).$(bld_trg_arch)) \
1364 5 $($(target)_$(source)_TOOL.$(bld_trg)) \
1365 6 $($(target)_$(source)_TOOL) \
1366 7 $($(target)_$(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
1367 8 $($(target)_$(type)TOOL.$(bld_trg)) \
1368 9 $($(target)_$(type)TOOL) \
1369 10 $($(target)_TOOL.$(bld_trg).$(bld_trg_arch)) \
1370 11 $($(target)_TOOL.$(bld_trg)) \
1371 12 $($(target)_TOOL) \
1372 13 $($(source)_$(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
1373 14 $($(source)_$(type)TOOL.$(bld_trg)) \
1374 15 $($(source)_$(type)TOOL) \
1375 16 $($(source)_TOOL.$(bld_trg).$(bld_trg_arch)) \
1376 17 $($(source)_TOOL.$(bld_trg)) \
1377 18 $($(source)_TOOL) \
1378 19 $($(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
1379 20 $($(type)TOOL.$(bld_trg)) \
1380 21 $($(type)TOOL) \
1381 22 $(TOOL.$(bld_trg).$(bld_trg_arch)) \
1382 23 $(TOOL.$(bld_trg)) \
1383 24 $(TOOL) )
[380]1384$(error kBuild: TOOL_$(tool)_COMPILE_$(type)_CMDS is not defined. source=$(source) target=$(target) )
[97]1385endif
[353]1386
[380]1387# call the tool
1388$(target)_$(source)_CMDS_ := $(TOOL_$(tool)_COMPILE_$(type)_CMDS)
1389$(target)_$(source)_OUTPUT_ := $(TOOL_$(tool)_COMPILE_$(type)_OUTPUT)
1390$(target)_$(source)_DEPEND_ := $(TOOL_$(tool)_COMPILE_$(type)_DEPEND) $(deps) $(source)
1391$(target)_$(source)_DEPORD_ := $(TOOL_$(tool)_COMPILE_$(type)_DEPORD) $(dirdep)
[73]1392
[380]1393# generate the compile rule.
1394$(eval $(def_target_source_rule))
[205]1395
[380]1396_OUT_FILES += $($(target)_$(source)_OUTPUT_)
[353]1397$(target)_OBJS_ += $(obj)
[73]1398
1399endef
1400
[530]1401## Generic macro for processing C, C++ and Assembly sources.
1402# @param $(target) Normalized target name.
1403# @param $(source) Source file name.
1404# @param $(type) Source type. {C,CXX,AS}
1405# @param bld_type Build type.
1406# @param bld_trg Build target.
1407# @param bld_trg_arch Build target arch.
1408# @param bld_trg_cpu Build target cpu.
1409#
1410#$ (warning dbg: def_target_source_c_cpp_asm: source='$(source)' target='$(target)' type='$(type)')
[641]1411def_target_source_c_cpp_asm_rc_new = $(kb-src-one x)
[530]1412
[552]1413ifneq ($(filter kb-src-one,$(KMK_FEATURES)),)
[641]1414def_target_source_c_cpp_asm_rc_var = def_target_source_c_cpp_asm_rc_new
[530]1415else
[641]1416def_target_source_c_cpp_asm_rc_var = def_target_source_c_cpp_asm_rc_old
[530]1417endif
1418
[73]1419## Generic macro for processing all target sources.
[74]1420# @param $(target) Normalized target name.
[73]1421define def_target_sources
1422#$ (warning def_target_sources)
1423# C sources
[353]1424type := C
[481]1425$(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)))\
[641]1426 ,$(eval $(value $(def_target_source_c_cpp_asm_rc_var))) )
[73]1427
1428# C++ sources
[353]1429type := CXX
[481]1430$(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)))\
[641]1431 ,$(eval $(value $(def_target_source_c_cpp_asm_rc_var))) )
[73]1432
1433# ASM sources
[353]1434type := AS
[481]1435$(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)))\
[641]1436 ,$(eval $(value $(def_target_source_c_cpp_asm_rc_var))) )
[353]1437
[641]1438# Resource sources
1439type := RC
1440$(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)))\
1441 ,$(eval $(value $(def_target_source_c_cpp_asm_rc_var))) )
1442
[73]1443endef
1444
1445
[219]1446
[353]1447## Generic macro for generating the install rule(s) for a target
1448# and update the globals with default out.
[219]1449#
[353]1450# @param $(target) Normalized target name.
1451# @param $(out) The output file.
1452# @param $(definst) The default _INST value.
1453# @param $(typevar) The name of the variable with all the root targets of its type.
1454# @obsolete
1455define def_target_install_pluss
1456ifndef $(target)_NOINST
1457INSTARGET_$(target) := $(patsubst %/,%/$(notdir $(out)), \
1458 $(if $($(target)_INST), $(addprefix $(PATH_INS)/,$($(target)_INST)), $(definst)/))
[219]1459
[353]1460$(eval $(def_link_install_rule))
[239]1461
[579]1462_INSTALLS += $(INSTARGET_$(target))
[272]1463
[353]1464ifdef KBUILD_DO_AUTO_INSTALL
[579]1465$(typevar) += $(INSTARGET_$(target))
[219]1466else
[579]1467$(typevar) += $(out)
[219]1468endif
[353]1469else # _NOINST
[579]1470$(typevar) += $(out)
[353]1471endif
1472
[579]1473_OUT_FILES += $($(target)_OUTPUT_)
[353]1474_CLEAN_FILES += $($(target)_CLEAN)
1475_OBJS += $($(target)_OBJS_)
1476
[219]1477endef
1478
1479
1480
1481#
[72]1482# LIBRARIES
[73]1483#
[72]1484
1485## Library (one).
[74]1486# @param $(target) Normalized library (target) name.
[72]1487define def_lib
[145]1488# library basics
[222]1489## @todo prefix
[353]1490bld_type := $(firstword $($(target)_BLD_TYPE) $(BUILD_TYPE))
1491bld_trg := $(firstword $($(target)_BLD_TRG) $(BUILD_TARGET))
1492bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(BUILD_TARGET_ARCH))
1493bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(BUILD_TARGET_CPU))
1494tool := $(call _TARGET_TOOL,$(target),AR)
[78]1495ifeq ($(tool),)
[353]1496$(error kBuild: Library target $(target) does not have a tool defined!)
[78]1497endif
[353]1498outbase := $(call _TARGET_BASE,$(target),$(target))
1499PATH_$(target) := $(patsubst %/,%,$(dir $(outbase)))
1500suff := $(firstword\
[481]1501 $($(target)_LIBSUFF.$(bld_trg).$(bld_trg_arch))\
[221]1502 $($(target)_LIBSUFF.$(bld_trg))\
[126]1503 $($(target)_LIBSUFF)\
[481]1504 $(TOOL_$(tool)_ARLIBSUFF.$(bld_trg).$(bld_trg_arch))\
[221]1505 $(TOOL_$(tool)_ARLIBSUFF.$(bld_trg))\
[126]1506 $(TOOL_$(tool)_ARLIBSUFF)\
[353]1507 $(SUFF_LIB))
1508out := $(outbase)$(suff)
1509TARGET_$(target) := $(out)
[643]1510$(target)_OBJS_ :=
[145]1511
1512# source -> object
[353]1513$(eval $(value def_target_sources))
[145]1514
1515# library linking
[353]1516tool := $(call _TARGET_TOOL,$(target),AR)
1517outbase := $(call _TARGET_BASE,$(target),$(target))
1518flags :=\
[74]1519 $(TOOL_$(tool)_ARFLAGS)\
[221]1520 $(TOOL_$(tool)_ARFLAGS.$(bld_type))\
[74]1521 $(ARFLAGS)\
[221]1522 $(ARFLAGS.$(bld_type))\
[74]1523 $($(target)_ARFLAGS)\
[481]1524 $($(target)_ARFLAGS.$(bld_type)) \
1525 $($(target)_ARFLAGS.$(bld_trg)) \
1526 $($(target)_ARFLAGS.$(bld_trg_arch)) \
1527 $($(target)_ARFLAGS.$(bld_trg).$(bld_trg_arch)) \
1528 $($(target)_ARFLAGS.$(bld_trg_cpu))
[353]1529othersrc := $(filter-out %.c %.cpp %.cxx %.cc %.s %.S %.asm %.o %.obj,\
1530 $($(target)_SOURCES) \
1531 $($(target)_SOURCES.$(bld_trg)) \
1532 $($(target)_SOURCES.$(bld_trg_arch)) \
[481]1533 $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) \
[353]1534 $($(target)_SOURCES.$(bld_trg_cpu)) \
1535 $($(target)_SOURCES.$(bld_type)))
[643]1536objs = $(filter %.o %.obj, \
1537 $($(target)_SOURCES) \
1538 $($(target)_SOURCES.$(bld_trg)) \
1539 $($(target)_SOURCES.$(bld_trg_arch)) \
1540 $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) \
1541 $($(target)_SOURCES.$(bld_trg_cpu)) \
1542 $($(target)_SOURCES.$(bld_type))) \
1543 $($(target)_OBJS_)
[353]1544dirdep := $(call DIRDEP,$(dir $(out)))
[78]1545## @todo fix dependencies on makefiles an such
[353]1546deps := $($(target)_DEPS)
[72]1547
[380]1548# dependency file
1549dep := $(out)$(SUFF_DEP)
[524]1550ifndef NO_LINK_CMDS_DEPS
[380]1551_DEPFILES_INCLUDED += $(dep)
1552$(if $(wildcard $(dep)),$(eval include $(dep)))
1553endif
[72]1554
[380]1555# check that the tool is defined.
1556ifndef TOOL_$(tool)_LINK_LIBRARY_CMDS
1557$(warning kBuild: tools: \
[481]1558 1 $($(target)_$(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
1559 2 $($(target)_$(source)TOOL.$(bld_trg)) \
1560 3 $($(target)_$(source)TOOL) \
1561 4 $($(target)_TOOL.$(bld_trg).$(bld_trg_arch)) \
1562 5 $($(target)_TOOL.$(bld_trg)) \
1563 6 $($(target)_TOOL) \
1564 7 $($(source)TOOL) \
1565 8 $($(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
1566 9 $($(source)TOOL.$(bld_trg)) \
1567 10 $(TOOL.$(bld_trg).$(bld_trg_arch)) \
1568 11 $(TOOL.$(bld_trg)) \
1569 12 $(TOOL) )
[380]1570$(error kBuild: TOOL_$(tool)_LINK_LIBRARY_CMDS isn't defined! target=$(target) )
1571endif
1572
1573# call the tool
1574$(target)_CMDS_ := $(TOOL_$(tool)_LINK_LIBRARY_CMDS)
1575$(target)_OUTPUT_ := $(TOOL_$(tool)_LINK_LIBRARY_OUTPUT)
1576$(target)_DEPEND_ := $(TOOL_$(tool)_LINK_LIBRARY_DEPEND) $(deps) $(objs)
1577$(target)_DEPORD_ := $(TOOL_$(tool)_LINK_LIBRARY_DEPORD) $(dirdep)
1578
[412]1579# generate the link rule.
[380]1580$(eval $(def_link_rule))
1581
[353]1582# installing and globals
1583definst := $(PATH_LIB)
[380]1584typevar := _LIBS
[353]1585$(eval $(value def_target_install_pluss))
[72]1586endef
1587
1588# Process libraries
[380]1589mode := 0644
[481]1590$(foreach target, $(LIBRARIES) $(LIBRARIES.$(BUILD_TARGET)) $(LIBRARIES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), $(eval $(value def_lib)))
[72]1591
1592
1593#
[353]1594# Link operations.
[72]1595#
1596
[353]1597##
1598# Link prolog
1599#
1600# @param $(target) Normalized target name.
1601# @param $(EXT) EXE,DLL,SYS.
1602# @param $(definst) The default _INST value.
1603# @param $(typevar) The name of the variable with all the root targets of its type.
[380]1604define def_link_common
[353]1605# basics
1606bld_type := $(firstword $($(target)_BLD_TYPE) $(BUILD_TYPE))
1607bld_trg := $(firstword $($(target)_BLD_TRG) $(BUILD_$(bld_trg_base_var)))
1608bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(BUILD_$(bld_trg_base_var)_ARCH))
1609bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(BUILD_$(bld_trg_base_var)_CPU))
[145]1610
[353]1611tool := $(call _TARGET_TOOL,$(target),LD)
1612outbase := $(call _TARGET_BASE,$(target),$(target))
1613suff := $(firstword \
1614 $($(target)_$(EXT)SUFF) \
1615 $($(target)_$(EXT)SUFF) \
1616 $(TOOL_$(tool)_LD$(EXT)SUFF) \
1617 $($(EXTPRE)SUFF_$(EXT)))
1618out := $(outbase)$(suff)
1619PATH_$(target) := $(patsubst %/,%,$(dir $(outbase)))
1620TARGET_$(target) := $(out)
[643]1621$(target)_OBJS_ :=
[353]1622
[145]1623# source -> object
[353]1624$(eval $(value def_target_sources))
[145]1625
[353]1626# more library stuff.
1627tool := $(call _TARGET_TOOL,$(target),LD)
1628outbase := $(call _TARGET_BASE,$(target),$(target))
1629flags :=\
[74]1630 $(TOOL_$(tool)_LDFLAGS)\
[221]1631 $(TOOL_$(tool)_LDFLAGS.$(bld_type))\
1632 $(TOOL_$(tool)_LDFLAGS.$(bld_trg))\
1633 $(TOOL_$(tool)_LDFLAGS.$(bld_trg_arch))\
[481]1634 $(TOOL_$(tool)_LDFLAGS.$(bld_trg).$(bld_trg_arch))\
[221]1635 $(TOOL_$(tool)_LDFLAGS.$(bld_trg_cpu))\
[74]1636 $(LDFLAGS)\
[221]1637 $(LDFLAGS.$(bld_type))\
1638 $(LDFLAGS.$(bld_trg))\
1639 $(LDFLAGS.$(bld_trg_arch))\
[481]1640 $(LDFLAGS.$(bld_trg).$(bld_trg_arch))\
[221]1641 $(LDFLAGS.$(bld_trg_cpu))\
[74]1642 $($(target)_LDFLAGS)\
[221]1643 $($(target)_LDFLAGS.$(bld_type))\
1644 $($(target)_LDFLAGS.$(bld_trg))\
1645 $($(target)_LDFLAGS.$(bld_trg_arch))\
[481]1646 $($(target)_LDFLAGS.$(bld_trg).$(bld_trg_arch))\
[353]1647 $($(target)_LDFLAGS.$(bld_trg_cpu))
1648othersrc := $(filter-out %.c %.cpp %.cxx %.cc %.s %.S %.asm %.o %.obj,\
1649 $($(target)_SOURCES)\
1650 $($(target)_SOURCES.$(bld_trg)) \
1651 $($(target)_SOURCES.$(bld_trg_arch)) \
[481]1652 $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) \
[353]1653 $($(target)_SOURCES.$(bld_trg_cpu)) \
1654 $($(target)_SOURCES.$(bld_type)))
[643]1655objs = $(filter %.o %.obj, \
1656 $($(target)_SOURCES) \
1657 $($(target)_SOURCES.$(bld_trg)) \
1658 $($(target)_SOURCES.$(bld_trg_arch)) \
1659 $($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)) \
1660 $($(target)_SOURCES.$(bld_trg_cpu)) \
1661 $($(target)_SOURCES.$(bld_type))) \
1662 $($(target)_OBJS_)
[353]1663libs :=\
[221]1664 $($(target)_LIBS.$(bld_trg_cpu))\
[481]1665 $($(target)_LIBS.$(bld_trg).$(bld_trg_arch))\
[221]1666 $($(target)_LIBS.$(bld_trg_arch))\
1667 $($(target)_LIBS.$(bld_trg))\
1668 $($(target)_LIBS.$(bld_type))\
[74]1669 $($(target)_LIBS)\
[592]1670 $(foreach sdk, $($(target)_SDKS.$(bld_trg).$(bld_trg_arch)) \
1671 $($(target)_SDKS.$(bld_trg_arch)) \
1672 $($(target)_SDKS.$(bld_trg)) \
1673 $($(target)_SDKS.$(bld_type)) \
1674 $($(target)_SDKS),\
[353]1675 $(SDK_$(sdk)_LIBS.$(bld_trg_cpu))\
[481]1676 $(SDK_$(sdk)_LIBS.$(bld_trg).$(bld_trg_arch))\
[353]1677 $(SDK_$(sdk)_LIBS.$(bld_trg_arch))\
1678 $(SDK_$(sdk)_LIBS.$(bld_trg))\
1679 $(SDK_$(sdk)_LIBS.$(bld_type))\
1680 $(SDK_$(sdk)_LIBS))\
[221]1681 $(LIBS.$(bld_trg_cpu))\
[481]1682 $(LIBS.$(bld_trg).$(bld_trg_arch))\
[221]1683 $(LIBS.$(bld_trg_arch))\
1684 $(LIBS.$(bld_trg))\
1685 $(LIBS.$(bld_type))\
[74]1686 $(LIBS)\
[592]1687 $(foreach sdk, $(SDKS.$(bld_trg).$(bld_trg_arch)) \
1688 $(SDKS.$(bld_trg_arch)) \
1689 $(SDKS.$(bld_trg)) \
1690 $(SDKS.$(bld_type)) \
1691 $(SDKS),\
[353]1692 $(SDK_$(sdk)_LIBS.$(bld_trg_cpu))\
[481]1693 $(SDK_$(sdk)_LIBS.$(bld_trg).$(bld_trg_arch))\
[353]1694 $(SDK_$(sdk)_LIBS.$(bld_trg_arch))\
1695 $(SDK_$(sdk)_LIBS.$(bld_trg))\
1696 $(SDK_$(sdk)_LIBS.$(bld_type))\
1697 $(SDK_$(sdk)_LIBS))\
[221]1698 $(TOOL_$(tool)_LIBS.$(bld_trg_cpu))\
[481]1699 $(TOOL_$(tool)_LIBS.$(bld_trg).$(bld_trg_arch))\
[221]1700 $(TOOL_$(tool)_LIBS.$(bld_trg_arch))\
1701 $(TOOL_$(tool)_LIBS.$(bld_trg))\
1702 $(TOOL_$(tool)_LIBS.$(bld_type))\
[353]1703 $(TOOL_$(tool)_LIBS)
1704libpath :=\
[221]1705 $($(target)_LIBPATH.$(bld_trg_cpu))\
[481]1706 $($(target)_LIBPATH.$(bld_trg).$(bld_trg_arch))\
[221]1707 $($(target)_LIBPATH.$(bld_trg_arch))\
1708 $($(target)_LIBPATH.$(bld_trg))\
1709 $($(target)_LIBPATH.$(bld_type))\
[74]1710 $($(target)_LIBPATH)\
[592]1711 $(foreach sdk, $($(target)_SDKS.$(bld_trg).$(bld_trg_arch)) \
1712 $($(target)_SDKS.$(bld_trg_arch)) \
1713 $($(target)_SDKS.$(bld_trg)) \
1714 $($(target)_SDKS.$(bld_type)) \
1715 $($(target)_SDKS),\
[353]1716 $(SDK_$(sdk)_LIBPATH.$(bld_trg_cpu))\
[481]1717 $(SDK_$(sdk)_LIBPATH.$(bld_trg).$(bld_trg_arch))\
[353]1718 $(SDK_$(sdk)_LIBPATH.$(bld_trg_arch))\
1719 $(SDK_$(sdk)_LIBPATH.$(bld_trg))\
1720 $(SDK_$(sdk)_LIBPATH.$(bld_type))\
1721 $(SDK_$(sdk)_LIBPATH))\
[221]1722 $(LIBPATH.$(bld_trg_cpu))\
[481]1723 $(LIBPATH.$(bld_trg).$(bld_trg_arch))\
[221]1724 $(LIBPATH.$(bld_trg_arch))\
1725 $(LIBPATH.$(bld_trg))\
1726 $(LIBPATH.$(bld_type))\
[74]1727 $(LIBPATH)\
[592]1728 $(foreach sdk, $(SDKS.$(bld_trg).$(bld_trg_arch)) \
1729 $(SDKS.$(bld_trg_arch)) \
1730 $(SDKS.$(bld_trg)) \
1731 $(SDKS.$(bld_type)) \
1732 $(SDKS),\
[353]1733 $(SDK_$(sdk)_LIBPATH.$(bld_trg_cpu))\
[481]1734 $(SDK_$(sdk)_LIBPATH.$(bld_trg).$(bld_trg_arch))\
[353]1735 $(SDK_$(sdk)_LIBPATH.$(bld_trg_arch))\
1736 $(SDK_$(sdk)_LIBPATH.$(bld_trg))\
1737 $(SDK_$(sdk)_LIBPATH.$(bld_type))\
1738 $(SDK_$(sdk)_LIBPATH))\
[221]1739 $(TOOL_$(tool)_LIBPATH.$(bld_trg_cpu))\
[481]1740 $(TOOL_$(tool)_LIBPATH.$(bld_trg).$(bld_trg_arch))\
[221]1741 $(TOOL_$(tool)_LIBPATH.$(bld_trg_arch))\
1742 $(TOOL_$(tool)_LIBPATH.$(bld_trg))\
1743 $(TOOL_$(tool)_LIBPATH.$(bld_type))\
[353]1744 $(TOOL_$(tool)_LIBPATH)
1745dirdep := $(call DIRDEP,$(dir $(out)))
[74]1746## @todo fix dependencies
[353]1747deps := $($(target)_DEPS)
1748
1749## @todo this stuff can't be working.
1750custom_pre := $(strip $(firstword \
[481]1751 $($(target)_CUSTOM_PRE.$(bld_trg).$(bld_trg_arch))\
[221]1752 $($(target)_CUSTOM_PRE.$(bld_trg).$(bld_type))\
1753 $($(target)_CUSTOM_PRE.$(bld_trg))\
1754 $($(target)_CUSTOM_PRE.$(bld_type))\
[74]1755 $($(target)_CUSTOM_PRE)\
[481]1756 $(CUSTOM_PRE.$(bld_trg).$(bld_trg_arch))\
[221]1757 $(CUSTOM_PRE.$(bld_trg).$(bld_type))\
1758 $(CUSTOM_PRE.$(bld_trg))\
1759 $(CUSTOM_PRE.$(bld_type))\
[74]1760 $(CUSTOM_PRE)\
[353]1761))
1762custom_post := $(strip $(firstword \
[481]1763 $($(target)_CUSTOM_POST.$(bld_trg).$(bld_trg_arch))\
[221]1764 $($(target)_CUSTOM_POST.$(bld_trg).$(bld_type))\
1765 $($(target)_CUSTOM_POST.$(bld_trg))\
1766 $($(target)_CUSTOM_POST.$(bld_type))\
[74]1767 $($(target)_CUSTOM_POST)\
[481]1768 $(CUSTOM_POST.$(bld_trg).$(bld_trg_arch))\
[221]1769 $(CUSTOM_POST.$(bld_trg).$(bld_type))\
1770 $(CUSTOM_POST.$(bld_trg))\
1771 $(CUSTOM_POST.$(bld_type))\
[74]1772 $(CUSTOM_POST)\
[353]1773))
[72]1774
[353]1775# installation targets
1776ifndef $(target)_NOINST
1777INSTARGET_$(target) := $(patsubst %/,%/$(notdir $(out)), \
1778 $(if $($(target)_INST), $(addprefix $(PATH_INS)/,$($(target)_INST)), $(definst)/))
1779ifdef KBUILD_DO_AUTO_INSTALL
1780$(typevar) += $(INSTARGET_$(target))
1781else
1782$(typevar) += $(out)
1783endif
1784# generate the install rule
1785$(eval $(def_link_install_rule))
1786
1787else # NOINST
1788INSTARGET_$(target) :=
1789$(typevar) += $(out)
1790endif # NOINST
1791
[380]1792# dependency file
1793dep := $(outbase)$(SUFF_DEP)
[524]1794ifndef NO_LINK_CMDS_DEPS
[380]1795_DEPFILES_INCLUDED += $(dep)
1796$(if $(wildcard $(dep)),$(eval include $(dep)))
1797endif
[353]1798
[380]1799# check that the tool is defined.
1800ifndef TOOL_$(tool)_$(tool_do)_CMDS
1801$(warning kBuild: tools: \
[481]1802 1 $($(target)_$(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
1803 2 $($(target)_$(source)TOOL.$(bld_trg)) \
1804 3 $($(target)_$(source)TOOL) \
1805 4 $($(target)_TOOL.$(bld_trg).$(bld_trg_arch)) \
1806 5 $($(target)_TOOL.$(bld_trg)) \
1807 6 $($(target)_TOOL) \
1808 7 $($(source)TOOL.$(bld_trg).$(bld_trg_arch)) \
1809 8 $($(source)TOOL.$(bld_trg)) \
1810 9 $($(source)TOOL) \
1811 10 $(TOOL.$(bld_trg).$(bld_trg_arch)) \
1812 11 $(TOOL.$(bld_trg)) \
1813 12 $(TOOL) )
[380]1814$(error kBuild: TOOL_$(tool)_$(tool_do)_CMDS isn't defined! target=$(target) )
1815endif
[353]1816
[380]1817# call the tool
1818$(target)_CMDS_ := $(TOOL_$(tool)_$(tool_do)_CMDS)
1819$(target)_OUTPUT_ := $(TOOL_$(tool)_$(tool_do)_OUTPUT)
1820$(target)_DEPEND_ := $(TOOL_$(tool)_$(tool_do)_DEPEND) $(deps) $(objs)
1821$(target)_DEPORD_ := $(TOOL_$(tool)_$(tool_do)_DEPORD) $(dirdep)
[353]1822
[412]1823# generate the link rule.
[380]1824$(eval $(def_link_rule))
1825
[412]1826
[380]1827# Update globals.
[579]1828_OBJS += $($(target)_OBJS_)
1829_OUT_FILES += $($(target)_OUTPUT_) $(out)
[353]1830_CLEAN_FILES += $($(target)_CLEAN)
[579]1831_INSTALLS += $(INSTARGET_$(target))
[353]1832
1833endef
1834
1835
1836#
1837# BLDPROGS
1838#
1839
1840## Build program (one).
1841# @param $(target) Normalized target (program) name.
1842define def_bldprog
1843
1844# set NOINST if not forced installation.
1845ifndef $(target)_INST
1846$(target)_NOINST := 1
1847endif
1848
[380]1849# do the usual stuff.
1850$(eval $(value def_link_common))
[353]1851
1852endef
1853
1854# Process build programs.
1855EXT := EXE
1856EXTPRE := HOST
[380]1857tool_do := LINK_PROGRAM
[353]1858definst := $(PATH_BIN)
1859typevar := _BLDPROGS
[380]1860mode := 0755
[353]1861bld_trg_base_var := PLATFORM
[481]1862$(foreach target, $(BLDPROGS) $(BLDPROGS.$(BUILD_PLATFORM)) $(BLDPROGS.$(BUILD_PLATFORM).$(BUILD_PLATFORM_ARCH)), $(eval $(value def_bldprog)))
[353]1863
1864
1865
1866#
1867# DLLS
1868#
1869
[189]1870# Process dlls
[353]1871EXT := DLL
1872EXTPRE :=
[380]1873tool_do := LINK_DLL
[353]1874definst := $(PATH_DLL)
1875typevar := _DLLS
[380]1876mode := 0755
[353]1877bld_trg_base_var := TARGET
[481]1878$(foreach target, $(DLLS) $(DLLS.$(BUILD_TARGET)) $(DLLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), $(eval $(value def_link_common)))
[74]1879
1880
[72]1881#
[189]1882# Process import libraries.
[72]1883#
[219]1884# - On OS/2 and windows these are libraries.
[189]1885# - On other platforms they are fake DLLs.
[481]1886ifeq ($(filter-out nt os2 win win64 win32,$(BUILD_TARGET)),)
1887$(foreach target, $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)) $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), $(eval $(value def_lib)))
[189]1888else
[481]1889$(foreach target, $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)) $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), $(eval $(value def_link_common)))
[189]1890endif
[481]1891$(foreach target, $(IMPORT_LIBS) $(IMPORT_LIBS.$(BUILD_TARGET)) $(IMPORT_LIBS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
[353]1892 $(eval _IMPORT_LIBS += $(if $(INSTARGET_$(target)),$(INSTARGET_$(target)), $(TARGET_$(target)))))
[72]1893
[189]1894
1895#
1896# PROGRAMS
1897#
1898
[353]1899# Process programs
1900EXT := EXE
1901EXTPRE :=
[380]1902tool_do := LINK_PROGRAM
[353]1903definst := $(PATH_BIN)
1904typevar := _PROGRAMS
[380]1905mode := 0755
[353]1906bld_trg_base_var := TARGET
[481]1907$(foreach target, $(PROGRAMS) $(PROGRAMS.$(BUILD_TARGET)) $(PROGRAMS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), $(eval $(value def_link_common)))
[130]1908
1909
[189]1910
[72]1911#
[83]1912# SYSMODS
[72]1913#
1914
[130]1915# Process sysmods
[353]1916EXT := SYS
1917EXTPRE :=
[380]1918tool_do := LINK_SYSMOD
[353]1919definst := $(PATH_SYS)
1920typevar := _SYSMODS
[380]1921mode := 0644
[353]1922bld_trg_base_var := TARGET
[481]1923$(foreach target, $(SYSMODS) $(SYSMODS.$(BUILD_TARGET)) $(SYSMODS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), $(eval $(value def_link_common)))
[83]1924
1925
[72]1926#
1927# OTHERS
1928#
[481]1929_OTHERS = $(OTHERS) $(OTHERS.$(BUILD_TARGET)) $(OTHERS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))
[72]1930
1931
[353]1932#
1933# INSTALLS
1934#
[72]1935
[353]1936## generate the install rule
1937define def_install_src_rule
1938# the install rule
1939$(insdst) : $(srcsrc) | $(call DIRDEP,$(dir $(insdst)))
[380]1940 $$(if $$(filter $(INSTALL),$(inscmd)),,$$(RM) -f $$@)
[353]1941 $(inscmd)
1942endef
1943
1944## install one file
1945define def_install_src
1946
1947# deal with '=>' in the source file name.
1948srcdst := $(subst =>, ,$(src))
1949srcsrc := $(firstword $(srcdst))
[424]1950srcdstdir := $(dir $(word 2,$(srcdst)))
[353]1951srcdst := $(word $(words $(srcdst)),$(srcdst))
1952
1953# _INSTFUN
1954ifdef $(srcsrc)_INSTFUN
1955instfun := $(srcsrc)_INSTFUN
1956else
1957ifdef $(target)_INSTFUN
1958instfun := $(target)_INSTFUN
1959else
1960instfun := _INSTALL_FILE
1961endif
1962endif
1963
1964# _INST
1965ifdef $(srcsrc)_INST
[424]1966inst := $(patsubst %/,%,$($(srcsrc)_INST))/$(dir $(srcdstdir))
[353]1967else
1968ifdef $(target)_INST
[424]1969inst := $(patsubst %/,%,$($(target)_INST))/$(dir $(srcdstdir))
[353]1970else
[424]1971inst := $(dir $(srcdstdir))
[353]1972endif
1973endif
1974
1975# calc target
[380]1976insdst := $(call $(instfun),$(srcdst),$(target),$(inst),$(PATH_INS))
[424]1977#$(warning instfun=$(instfun) srcdst=$(srcdst) target=$(target) inst=$(inst) => insdst=$(insdst))
[353]1978
[414]1979# mode, uid and gid
1980mode := $(firstword \
[481]1981 $($(target)_$(srcsrc)_MODE.$(bld_trg).$(bld_trg_arch)) \
[414]1982 $($(target)_$(srcsrc)_MODE.$(bld_trg)) \
1983 $($(target)_$(srcsrc)_MODE) \
[481]1984 $($(target)_$(srcdst)_MODE.$(bld_trg).$(bld_trg_arch)) \
[414]1985 $($(target)_$(srcdst)_MODE.$(bld_trg)) \
1986 $($(target)_$(srcdst)_MODE) \
[481]1987 $($(srcsrc)_MODE.$(bld_trg).$(bld_trg_arch)) \
[414]1988 $($(srcsrc)_MODE.$(bld_trg)) \
1989 $($(srcsrc)_MODE) \
[481]1990 $($(srcdst)_MODE.$(bld_trg).$(bld_trg_arch)) \
[414]1991 $($(srcdst)_MODE.$(bld_trg)) \
1992 $($(srcdst)_MODE) \
[481]1993 $($(target)_MODE.$(bld_trg).$(bld_trg_arch)) \
[414]1994 $($(target)_MODE.$(bld_trg)) \
1995 $($(target)_MODE))
1996uid := $(firstword \
[481]1997 $($(target)_$(srcsrc)_UID.$(bld_trg).$(bld_trg_arch)) \
[414]1998 $($(target)_$(srcsrc)_UID.$(bld_trg)) \
1999 $($(target)_$(srcsrc)_UID) \
[481]2000 $($(target)_$(srcdst)_UID.$(bld_trg).$(bld_trg_arch)) \
[414]2001 $($(target)_$(srcdst)_UID.$(bld_trg)) \
2002 $($(target)_$(srcdst)_UID) \
[481]2003 $($(srcsrc)_UID.$(bld_trg).$(bld_trg_arch)) \
[414]2004 $($(srcsrc)_UID.$(bld_trg)) \
2005 $($(srcsrc)_UID) \
[481]2006 $($(srcdst)_UID.$(bld_trg).$(bld_trg_arch)) \
[414]2007 $($(srcdst)_UID.$(bld_trg)) \
2008 $($(srcdst)_UID) \
[481]2009 $($(target)_UID.$(bld_trg).$(bld_trg_arch)) \
[414]2010 $($(target)_UID.$(bld_trg)) \
2011 $($(target)_UID))
2012gid := $(firstword \
[481]2013 $($(target)_$(srcsrc)_GID.$(bld_trg).$(bld_trg_arch)) \
[414]2014 $($(target)_$(srcsrc)_GID.$(bld_trg)) \
2015 $($(target)_$(srcsrc)_GID) \
[481]2016 $($(target)_$(srcdst)_GID.$(bld_trg).$(bld_trg_arch)) \
[414]2017 $($(target)_$(srcdst)_GID.$(bld_trg)) \
2018 $($(target)_$(srcdst)_GID) \
[481]2019 $($(srcsrc)_GID.$(bld_trg).$(bld_trg_arch)) \
[414]2020 $($(srcsrc)_GID.$(bld_trg)) \
2021 $($(srcsrc)_GID) \
[481]2022 $($(srcdst)_GID.$(bld_trg).$(bld_trg_arch)) \
[414]2023 $($(srcdst)_GID.$(bld_trg)) \
2024 $($(srcdst)_GID) \
[481]2025 $($(target)_GID.$(bld_trg).$(bld_trg_arch)) \
[414]2026 $($(target)_GID.$(bld_trg)) \
2027 $($(target)_GID))
2028
[353]2029# create the command
2030ifdef $(srcsrc)_INSTALLER
2031inscmd := $(call $(srcsrc)_INSTALLER,$(srcsrc),$(insdst),$(target))
2032else
2033ifdef $(target)_INSTALLER
2034inscmd := $(call $(target)_INSTALLER,$(srcsrc),$(insdst),$(target))
2035else
[414]2036inscmd := $$(INSTALL)\
2037 $(if $(uid),-o $(uid))\
2038 $(if $(gid),-g $(gid))\
2039 $(if $(mode),-m $(mode))\
2040 $(srcsrc) $(insdst)
[353]2041endif
2042endif
2043
2044# generate the rule (need double evaluation here)
2045$(eval $(def_install_src_rule))
2046
2047INSTARGET_$(target) += $(insdst)
2048endef
2049
2050
2051## generate the symlink rule
2052define def_install_symlink_rule
2053# the install rule
2054$(insdst) : | $(call DIRDEP,$(dir $(insdst)))
2055 $$(RM) -f $$@
[380]2056 $$(LN_SYMLINK) $(symdst) $(insdst)
[353]2057endef
2058
2059## create one symlink
2060define def_install_symlink
2061
2062# deal with '=>' in the source file name.
[380]2063symdst := $(subst =>, ,$(src))
2064symlnk := $(firstword $(symdst))
2065symdst := $(word $(words $(symdst)),$(symdst))
[353]2066
2067# _INSTFUN
[380]2068ifdef $(symlnk)_INSTFUN
2069instfun := $(symlnk)_INSTFUN
[353]2070else
2071ifdef $(target)_INSTFUN
2072instfun := $(target)_INSTFUN
2073else
2074instfun := _INSTALL_FILE
2075endif
2076endif
2077
2078# _INST
[380]2079ifdef $(symlnk)_INST
2080inst := $(patsubst %/,%,$($(symlnk)_INST))/$(dir $(symlnk))
[353]2081else
2082ifdef $(target)_INST
[380]2083inst := $(patsubst %/,%,$($(target)_INST))/$(dir $(symlnk))
[353]2084else
[380]2085inst := $(dir $(symlnk))
[353]2086endif
2087endif
2088
2089# calc target
[380]2090insdst := $(call $(instfun),$(symlnk),$(target),$(inst),$(PATH_INS))
2091#$(warning symlnk=$(symlnk) symdst=$(symdst) insdst=$(insdst) instfun=$(instfun) inst='$(inst)')
[353]2092
2093# generate the rule (need double evaluation here)
2094$(eval $(def_install_symlink_rule))
2095
2096INSTARGET_$(target) += $(insdst)
2097endef
2098
[412]2099
[380]2100## generate the install rule
2101define def_install_directory_rule
2102# the install rule
2103$(insdst):
2104 $(INSTALL) -d \
2105 $(if $(uid),-o $(uid))\
2106 $(if $(gid),-g $(gid))\
2107 $(if $(mode),-m $(mode))\
2108 $(insdst)
[412]2109
2110.NOTPARALLEL: $(insdst)
[380]2111endef
2112
[412]2113
[380]2114## create one directory
2115define def_install_directory
2116
2117# _INST
2118ifdef $(directory)_INST
2119inst := $(PATH_INS)/$(patsubst %/,%,$($(directory)_INST))
2120else
2121ifdef $(target)_INST
2122inst := $(PATH_INS)/$(patsubst %/,%,$($(target)_INST))
2123else
2124inst := $(PATH_INS)
2125endif
2126endif
2127
2128mode := $(firstword \
[481]2129 $($(target)_$(directory)_MODE.$(bld_trg).$(bld_trg_arch)) \
[380]2130 $($(target)_$(directory)_MODE.$(bld_trg)) \
2131 $($(target)_$(directory)_MODE) \
[481]2132 $($(directory)_MODE.$(bld_trg).$(bld_trg_arch)) \
[380]2133 $($(directory)_MODE.$(bld_trg)) \
2134 $($(directory)_MODE) \
[481]2135 $($(target)_MODE.$(bld_trg).$(bld_trg_arch)) \
[380]2136 $($(target)_MODE.$(bld_trg)) \
2137 $($(target)_MODE))
2138uid := $(firstword \
[481]2139 $($(target)_$(directory)_UID.$(bld_trg).$(bld_trg_arch)) \
[380]2140 $($(target)_$(directory)_UID.$(bld_trg)) \
2141 $($(target)_$(directory)_UID) \
[481]2142 $($(directory)_UID.$(bld_trg).$(bld_trg_arch)) \
[380]2143 $($(directory)_UID.$(bld_trg)) \
2144 $($(directory)_UID) \
[481]2145 $($(target)_UID.$(bld_trg).$(bld_trg_arch)) \
[380]2146 $($(target)_UID.$(bld_trg)) \
2147 $($(target)_UID))
2148gid := $(firstword \
[481]2149 $($(target)_$(directory)_GID.$(bld_trg).$(bld_trg_arch)) \
[380]2150 $($(target)_$(directory)_GID.$(bld_trg)) \
2151 $($(target)_$(directory)_GID) \
[481]2152 $($(directory)_GID.$(bld_trg).$(bld_trg_arch)) \
[380]2153 $($(directory)_GID.$(bld_trg)) \
2154 $($(directory)_GID) \
[481]2155 $($(target)_GID.$(bld_trg).$(bld_trg_arch)) \
[380]2156 $($(target)_GID.$(bld_trg)) \
2157 $($(target)_GID))
2158
2159insdst := $(inst)/$(directory)/
2160#$(warning directory=$(directory) inst=$(inst) insdst=$(insdst) mode=$(mode) gid=$(gid) uid=$(uid))
2161
2162# generate the rule (need double evaluation here)
2163$(eval $(def_install_directory_rule))
2164
2165INSTARGET_DIRS_$(target) += $(insdst)
2166endef
2167
2168
[353]2169## process one install target.
2170define def_install
2171bld_type := $(firstword $($(target)_BLD_TYPE) $(BUILD_TYPE))
2172bld_trg := $(firstword $($(target)_BLD_TRG) $(BUILD_TARGET))
2173bld_trg_arch:= $(firstword $($(target)_BLD_TRG_ARCH) $(BUILD_TARGET_ARCH))
2174bld_trg_cpu := $(firstword $($(target)_BLD_TRG_CPU) $(BUILD_TARGET_CPU))
2175
2176INSTARGET_$(target) :=
[380]2177INSTARGET_DIRS_$(target) :=
2178
[481]2179$(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)), \
[380]2180 $(eval $(value def_install_directory)))
2181
[481]2182$(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)), \
[353]2183 $(eval $(value def_install_src)))
2184
[481]2185$(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)), \
[353]2186 $(eval $(value def_install_symlink)))
2187
[380]2188_INSTALLS += $(INSTARGET_$(target)) $($(target)_GOALS)
2189_INSTALLS_DIRS += $(INSTARGET_DIRS_$(target))
[353]2190endef
2191
2192## process all install targets
[481]2193$(foreach target, $(INSTALLS) $(INSTALLS.$(BUILD_TARGET)) $(INSTALLS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)), \
[353]2194 $(eval $(value def_install)))
2195
2196
[72]2197#
[417]2198# PACKING
2199#
[481]2200_PACKING += $(PACKING) $(PACKING.$(BUILD_TARGET)) $(PACKING.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))
[417]2201
2202
2203#
[72]2204# DOCS
2205#
2206
2207
2208#
[353]2209# DIRECTORIES
2210#
2211_DIR_ALL := $(sort $(addsuffix /,$(patsubst %/,%,$(_DIRS))) $(dir $(_OUT_FILES) $(_OBJS) $(_INSTALLS)))
[380]2212$(foreach directory,$(_INSTALLS_DIRS), $(eval _DIR_ALL := $(filter-out $(directory),$(_DIR_ALL))))
[353]2213
[380]2214
[353]2215define def_mkdir_rule
2216$(directory):
2217 $(call MSG_L1,Creating directory $$@)
2218 $(MKDIR) -p $$@
[72]2219endef
2220
[353]2221$(foreach directory,$(_DIR_ALL),$(eval $(def_mkdir_rule)))
[72]2222
[183]2223
[72]2224#
[353]2225# NOTHING
[72]2226#
[353]2227do-nothing:
2228 $(call MSG_L1,Did nothing in $(CURDIR))
[72]2229
[183]2230
[75]2231#
[353]2232# CLEAN UP
[75]2233#
[353]2234do-clean:
[380]2235 $(RM) -f $(_OUT_FILES) $(_OBJS) $(_DEPFILES) $(_DEPFILES_INCLUDED) $(_CLEAN_FILES) $(OTHER_CLEAN)
[72]2236
[98]2237
[353]2238#
2239# PASSES (including directory and makefile walking)
2240#
[221]2241
[75]2242## Subdir
2243# @param $(pass) Lowercase pass name.
2244# @param $(PASS) Uppercase pass name.
2245# @param $(subdir) Subdirectory
2246# @param $(tag) tag to attach to the rule name.
2247define def_pass_subdir
[219]2248pass_$(pass)$(tag):: $(dep)
2249 + $(QUIET)$$(MAKE) -C $(subdir) -f $$(notdir $$(firstword $$(wildcard $$(addprefix $(subdir)/,$$(DEFAULT_MAKEFILE))))) pass_$(pass)
[75]2250endef
[72]2251
[75]2252## Submakefile
2253# @param $(pass) Lowercase pass name.
2254# @param $(PASS) Uppercase pass name.
2255# @param $(makefile) Makefile.
2256# @param $(tag) tag to attach to the rule name.
2257define def_pass_makefile
[219]2258pass_$(pass)$(tag):: $(dep)
2259 + $(QUIET)$$(MAKE) -C $(patsubst %/,%,$(dir $(makefile))) -f $(notdir $(makefile)) pass_$(pass)
[75]2260endef
[73]2261
[75]2262## Execute a pass.
2263# @param $(pass) Lowercase pass name.
2264# @param $(PASS) Uppercase pass name.
[353]2265define def_pass_old
[481]2266$(eval SUBDIRS_$(PASS) ?= $(SUBDIRS) $(SUBDIRS.$(BUILD_TARGET)) $(SUBDIRS.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
2267$(eval SUBDIRS_AFTER_$(PASS) ?= $(SUBDIRS_AFTER) $(SUBDIRS_AFTER.$(BUILD_TARGET)) $(SUBDIRS_AFTER.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
2268$(eval MAKEFILES_BEFORE_$(PASS) ?= $(MAKEFILES_BEFORE) $(MAKEFILES_BEFORE.$(BUILD_TARGET)) $(MAKEFILES_BEFORE.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
2269$(eval MAKEFILES_AFTER_$(PASS) ?= $(MAKEFILES_AFTER) $(MAKEFILES_AFTER.$(BUILD_TARGET)) $(MAKEFILES_AFTER.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
[75]2270
2271$(eval tag:=_before)
[219]2272$(eval dep:=)
[481]2273$(foreach subdir,$(SUBDIRS_$(PASS)) $(SUBDIRS_$(PASS).$(BUILD_TARGET)) $(SUBDIRS_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))
2274$(foreach makefile,$(MAKEFILES_BEFORE_$(PASS)) $(MAKEFILES_BEFORE_$(PASS).$(BUILD_TARGET)) $(MAKEFILES_BEFORE_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)),$(eval $(def_pass_makefile)))
[75]2275
2276$(eval tag:=_after)
[219]2277$(eval dep:=pass_$(pass)_doit)
[481]2278$(foreach subdir,$(SUBDIRS_AFTER_$(PASS)) $(SUBDIRS_AFTER_$(PASS).$(BUILD_TARGET)) $(SUBDIRS_AFTER_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))
2279$(foreach makefile,$(MAKEFILES_AFTER_$(PASS)) $(MAKEFILES_AFTER_$(PASS).$(BUILD_TARGET)) $(MAKEFILES_AFTER_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) ,$(eval $(def_pass_makefile)))
[75]2280
2281.NOTPARALLEL: pass_$(pass)_before pass_$(pass)_after
2282.PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_doit pass_$(pass)_after
[353]2283pass_$(pass)_doit: $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$(var))
[272]2284pass_$(pass)_this: pass_$(pass)_before
[220]2285 + $(QUIET)$$(MAKE) -f $$(MAKEFILE) pass_$(pass)_doit
2286pass_$(pass)_after:: pass_$(pass)_this
[219]2287pass_$(pass): pass_$(pass)_after
[75]2288
[183]2289endef
2290
[353]2291define def_pass
[481]2292$(eval SUBDIRS_$(PASS) ?= $(SUBDIRS) $(SUBDIRS.$(BUILD_TARGET)) $(SUBDIRS.$(BUILD_TARGET.$(BUILD_TARGET_ARCH))) )
2293$(eval SUBDIRS_AFTER_$(PASS) ?= $(SUBDIRS_AFTER) $(SUBDIRS_AFTER.$(BUILD_TARGET)) $(SUBDIRS_AFTER.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
2294$(eval MAKEFILES_BEFORE_$(PASS) ?= $(MAKEFILES_BEFORE) $(MAKEFILES_BEFORE.$(BUILD_TARGET)) $(MAKEFILES_BEFORE.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
2295$(eval MAKEFILES_AFTER_$(PASS) ?= $(MAKEFILES_AFTER) $(MAKEFILES_AFTER.$(BUILD_TARGET)) $(MAKEFILES_AFTER.$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) )
[183]2296
[353]2297$(eval tag:=_before)
2298$(eval dep:=)
[481]2299$(foreach subdir,$(SUBDIRS_$(PASS)) $(SUBDIRS_$(PASS).$(BUILD_TARGET)) $(SUBDIRS_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))
2300$(foreach makefile,$(MAKEFILES_BEFORE_$(PASS)) $(MAKEFILES_BEFORE_$(PASS).$(BUILD_TARGET)) $(MAKEFILES_BEFORE_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)),$(eval $(def_pass_makefile)))
[75]2301
[353]2302$(eval tag:=_after)
2303$(eval dep:=pass_$(pass)_doit)
[481]2304$(foreach subdir,$(SUBDIRS_AFTER_$(PASS)) $(SUBDIRS_AFTER_$(PASS).$(BUILD_TARGET)) $(SUBDIRS_AFTER_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) ,$(eval $(def_pass_subdir)))
2305$(foreach makefile,$(MAKEFILES_AFTER_$(PASS)) $(MAKEFILES_AFTER_$(PASS).$(BUILD_TARGET)) $(MAKEFILES_AFTER_$(PASS).$(BUILD_TARGET).$(BUILD_TARGET_ARCH)) ,$(eval $(def_pass_makefile)))
[75]2306
[380]2307ifdef KBUILD_SAFE_PARALLEL
[353]2308.NOTPARALLEL: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_this
2309.PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_this pass_$(pass)_doit
2310pass_$(pass)_doit: $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$(var))
2311pass_$(pass)_this: pass_$(pass)_before
2312 + $(QUIET)$$(MAKE) -f $$(MAKEFILE) pass_$(pass)_doit
2313pass_$(pass)_after:: pass_$(pass)_this
2314pass_$(pass): pass_$(pass)_after
2315else
[388]2316.NOTPARALLEL: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_doit
[353]2317.PHONY: pass_$(pass) pass_$(pass)_before pass_$(pass)_after pass_$(pass)_doit
2318pass_$(pass)_doit: pass_$(pass)_before \
2319 $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var)))
2320pass_$(pass): \
2321 pass_$(pass)_before \
2322 pass_$(pass)_doit \
[388]2323 pass_$(pass)_after
[353]2324endif
[189]2325
[353]2326#$ (warning pass=$(pass) PASS=$(PASS): $(PASS_$(PASS)_trgs) $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var))))
2327endef
[75]2328
[353]2329# Generate the defined passes.
2330$(foreach PASS, $(PASSES), \
2331 $(eval pass := $(PASS_$(PASS)_pass)) \
2332 $(eval $(def_pass)))
[75]2333
[219]2334## Pass order
2335# @param $(pass) Current pass name.
2336# @param $(prev_pass) The previous pass name.
2337define def_pass_order
[380]2338ifdef KBUILD_SAFE_PARALLEL
[353]2339.NOTPARALLEL: pass_$(pass)_order
2340.PHONY: pass_$(pass)_order
[219]2341pass_$(pass)_order: $(pass_prev)
[353]2342 $(call MSG_L1,Pass - $(if $(PASS_$(PASS)),$(PASS_$(PASS)),$(pass)))
[219]2343 + $(QUIET)$$(MAKE) -f $$(MAKEFILE) pass_$(pass)
[353]2344else
2345.NOTPARALLEL: pass_$(pass)_order pass_$(pass)_banner
[388]2346.PHONY: pass_$(pass)_order pass_$(pass)_banner
[353]2347pass_$(pass)_banner:
2348 $(call MSG_L1,Pass - $(if $(PASS_$(PASS)),$(PASS_$(PASS)),$(pass)))
2349pass_$(pass)_order: \
2350 $(pass_prev) \
2351 pass_$(pass)_banner \
2352 pass_$(pass)
2353endif
[219]2354$(eval pass_prev := pass_$(pass)_order)
2355endef
[183]2356
[219]2357## PASS: order
2358# Use dependencies to ensure correct pass order.
2359pass_prev :=
[353]2360$(foreach PASS,$(DEFAULT_PASSES),\
2361 $(eval pass := $(PASS_$(PASS)_pass)) \
2362 $(eval $(def_pass_order)))
[219]2363
[272]2364
[75]2365#
2366# THE MAIN RULES
2367#
[219]2368all_recursive: $(pass_prev)
[75]2369
[130]2370rebuild: clean
[219]2371 + $(MAKE) -f $(firstword $(MAKEFILE_LIST)) all_recursive
[78]2372
[412]2373# @todo make this a non-default pass!
[353]2374uninstall:
2375 $(RM) -f $(_INSTALLS)
[412]2376
[380]2377install: pass_installs
[78]2378
[75]2379# misc shortcuts.
[380]2380targets: bldprogs libraries dlls programs sysmods others installs
[75]2381objects: $(_OBJS)
[222]2382bldprogs: $(_BLDPROGS)
[189]2383libraries: $(_LIBS) $(_IMPORT_LIBS) $(_OTHER_LIBRARIES)
[205]2384dlls: $(_DLLS)
[219]2385programs: $(_PROGRAMS)
[205]2386sysmods: $(_SYSMODS)
[353]2387others: $(_OTHERS)
[380]2388installs: $(_INSTALLS_DIRS) $(_INSTALLS)
[75]2389
2390
[353]2391#
2392# kBuild debugging stuff.
2393#
2394_SPACE := $(subst ., ,.)
2395_TAB := $(subst ., ,.)
2396define _NEWLINE
2397
2398
2399endef
2400NLTAB = $(_NEWLINE)$(TAB)
2401show_targets:
2402 @$(foreach target, $(ALL_TARGETS),\
2403 @$(ECHO) "target: $(target)" $(NLTAB)\
2404 @$(ECHO) " PATH_$(target)=$(PATH_$(target))" $(NLTAB)\
2405 @$(ECHO) " TARGET_$(target)=$(TARGET_$(target))" $(NLTAB)\
2406 @$(ECHO) " INSTARGET_$(target)=$(INSTARGET_$(target))" $(NLTAB)\
[660]2407$(foreach prop,$(PROPS_SINGLE) $(PROPS_ACCUMULATE_L) $(PROPS_ACCUMULATE_R) OBJS_ CLEAN, \
[353]2408 $(eval _tmp:=$(firstword $($(target)_BLD_TRG) $(BUILD_TARGET))) \
2409 $(if $($(target)_$(prop).$(_tmp)),\
2410 @$(ECHO) " $(target)_$(prop).$(_tmp)=$($(target)_$(prop).$(_tmp))" $(NLTAB)) \
2411 $(if $($(target)_$(prop)), $(NLTAB)@$(ECHO) " $(target)_$(prop)=$($(target)_$(prop))" $(NLTAB)) \
2412)\
2413$(foreach prop,$(PROPS_DEFERRED), \
2414 $(eval _tmp:=$(firstword $($(target)_BLD_TRG) $(BUILD_TARGET))) \
2415 $(if $(value $(target)_$(prop).$(_tmp)),\
2416 @$(ECHO) ' $(target)_$(prop).$(_tmp)=$(value $(TARGET)_$(prop).$(_tmp))' $(NLTAB)) \
2417 $(if $(value $(target)_$(prop)), $(NLTAB)@$(ECHO) ' $(target)_$(prop)=$(value $(target)_$(prop))' $(NLTAB)) \
2418))
2419
2420
2421
2422#
2423# Include dependency files.
2424#
2425$(foreach dep,$(wildcard $(_DEPFILES)),$(eval include $(dep)))
2426
2427
[72]2428# end-of-file-content
[106]2429__footer_kmk__ := target
[72]2430endif # __footer_kmk__
[438]2431
Note: See TracBrowser for help on using the repository browser.